mirror of
https://github.com/overleaf/overleaf.git
synced 2024-10-17 21:05:04 -04:00
05ecfa2e23
[server-pro] add e2e tests for registering users via GUI/script/email GitOrigin-RevId: 25243532038c8df72f1360c433af215b3a551f3a
104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
import { runScript } from './hostAdminClient'
|
|
|
|
const DEFAULT_PASSWORD = 'Passw0rd!'
|
|
|
|
const createdUsers = new Set<string>()
|
|
|
|
export function resetCreatedUsersCache() {
|
|
createdUsers.clear()
|
|
}
|
|
|
|
export async function createMongoUser({
|
|
email,
|
|
isAdmin = false,
|
|
}: {
|
|
email: string
|
|
isAdmin?: boolean
|
|
}) {
|
|
const t0 = Math.floor(Date.now() / 1000)
|
|
const { stdout } = await runScript({
|
|
cwd: 'services/web',
|
|
script: 'modules/server-ce-scripts/scripts/create-user.js',
|
|
args: [`--email=${email}`, `--admin=${isAdmin}`],
|
|
})
|
|
const [url] = stdout.match(/http:\/\/.+\/user\/activate\?token=\S+/)!
|
|
const userId = new URL(url, location.origin).searchParams.get('user_id')!
|
|
const signupDate = parseInt(userId.slice(0, 8), 16)
|
|
if (signupDate < t0) {
|
|
return { url, exists: true }
|
|
}
|
|
return { url, exists: false }
|
|
}
|
|
|
|
export function ensureUserExists({
|
|
email,
|
|
password = DEFAULT_PASSWORD,
|
|
isAdmin = false,
|
|
}: {
|
|
email: string
|
|
password?: string
|
|
isAdmin?: boolean
|
|
}) {
|
|
let url: string
|
|
let exists: boolean
|
|
before(async function () {
|
|
exists = createdUsers.has(email)
|
|
if (exists) return
|
|
;({ url, exists } = await createMongoUser({ email, isAdmin }))
|
|
})
|
|
before(function () {
|
|
if (exists) return
|
|
activateUser(url, password)
|
|
cy.then(() => {
|
|
createdUsers.add(email)
|
|
})
|
|
})
|
|
}
|
|
|
|
export function login(username: string, password = DEFAULT_PASSWORD) {
|
|
const id = [username, password, new Date()]
|
|
function startOrResumeSession() {
|
|
cy.session(id, () => {
|
|
cy.visit('/login')
|
|
cy.get('input[name="email"]').type(username)
|
|
cy.get('input[name="password"]').type(password)
|
|
cy.findByRole('button', { name: 'Login' }).click()
|
|
cy.url().should('contain', '/project')
|
|
})
|
|
}
|
|
startOrResumeSession()
|
|
return startOrResumeSession
|
|
}
|
|
|
|
let activateRateLimitState = { count: 0, reset: 0 }
|
|
export function resetActivateUserRateLimit() {
|
|
activateRateLimitState = { count: 0, reset: 0 }
|
|
}
|
|
|
|
function handleActivateUserRateLimit() {
|
|
cy.then(() => {
|
|
activateRateLimitState.count++
|
|
if (activateRateLimitState.reset < Date.now()) {
|
|
activateRateLimitState.reset = Date.now() + 65_000
|
|
activateRateLimitState.count = 1
|
|
} else if (activateRateLimitState.count >= 6) {
|
|
cy.wait(activateRateLimitState.reset - Date.now())
|
|
activateRateLimitState.count = 1
|
|
}
|
|
})
|
|
}
|
|
|
|
export function activateUser(url: string, password = DEFAULT_PASSWORD) {
|
|
handleActivateUserRateLimit()
|
|
|
|
cy.session(url, () => {
|
|
cy.visit(url)
|
|
cy.url().then(url => {
|
|
if (url.includes('/login')) return
|
|
cy.url().should('contain', '/user/activate')
|
|
cy.get('input[name="password"]').type(password)
|
|
cy.findByRole('button', { name: 'Activate' }).click()
|
|
cy.url().should('contain', '/project')
|
|
})
|
|
})
|
|
}
|