login.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { runScript } from './hostAdminClient'
  2. const DEFAULT_PASSWORD = 'Passw0rd!'
  3. const createdUsers = new Set<string>()
  4. async function createMongoUser({
  5. email,
  6. isAdmin = false,
  7. }: {
  8. email: string
  9. isAdmin?: boolean
  10. }) {
  11. const t0 = Date.now()
  12. const { stdout } = await runScript({
  13. cwd: 'services/web',
  14. script: 'modules/server-ce-scripts/scripts/create-user.js',
  15. args: [`--email=${email}`, `--admin=${isAdmin}`],
  16. })
  17. const [url] = stdout.match(/\/user\/activate\?token=\S+/)!
  18. const userId = new URL(url, location.origin).searchParams.get('user_id')!
  19. const signupDate = parseInt(userId.slice(0, 8), 16) * 1000
  20. if (signupDate < t0) {
  21. return { url, exists: true }
  22. }
  23. return { url, exists: false }
  24. }
  25. export function ensureUserExists({
  26. email,
  27. password = DEFAULT_PASSWORD,
  28. isAdmin = false,
  29. }: {
  30. email: string
  31. password?: string
  32. isAdmin?: boolean
  33. }) {
  34. let url: string
  35. let exists: boolean
  36. before(async function () {
  37. exists = createdUsers.has(email)
  38. if (exists) return
  39. ;({ url, exists } = await createMongoUser({ email, isAdmin }))
  40. })
  41. before(function () {
  42. if (exists) return
  43. activateUser(url, password)
  44. cy.then(() => {
  45. createdUsers.add(email)
  46. })
  47. })
  48. }
  49. export function login(username: string, password = DEFAULT_PASSWORD) {
  50. const id = [username, password, new Date()]
  51. function startOrResumeSession() {
  52. cy.session(id, () => {
  53. cy.visit('/login')
  54. cy.get('input[name="email"]').type(username)
  55. cy.get('input[name="password"]').type(password)
  56. cy.findByRole('button', { name: 'Login' }).click()
  57. cy.url().should('contain', '/project')
  58. })
  59. }
  60. startOrResumeSession()
  61. return startOrResumeSession
  62. }
  63. export function activateUser(url: string, password = DEFAULT_PASSWORD) {
  64. cy.session(url, () => {
  65. cy.visit(url)
  66. cy.url().then(url => {
  67. if (url.includes('/login')) return
  68. cy.url().should('contain', '/user/activate')
  69. cy.get('input[name="password"]').type(password)
  70. cy.findByRole('button', { name: 'Activate' }).click()
  71. cy.url().should('contain', '/project')
  72. })
  73. })
  74. }