login.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. cy.session([username, password, new Date()], () => {
  51. cy.visit('/login')
  52. cy.get('input[name="email"]').type(username)
  53. cy.get('input[name="password"]').type(password)
  54. cy.findByRole('button', { name: 'Login' }).click()
  55. cy.url().should('contain', '/project')
  56. })
  57. }
  58. export function activateUser(url: string, password = DEFAULT_PASSWORD) {
  59. cy.session(url, () => {
  60. cy.visit(url)
  61. cy.url().then(url => {
  62. if (url.includes('/login')) return
  63. cy.url().should('contain', '/user/activate')
  64. cy.get('input[name="password"]').type(password)
  65. cy.findByRole('button', { name: 'Activate' }).click()
  66. cy.url().should('contain', '/project')
  67. })
  68. })
  69. }