describe('email signup', () => { beforeEach(() => { cy.intercept('GET', '**/api/me', { statusCode: 401, body: { error: 'unauthenticated' }, }).as('me') }) it('requests a confirmation email and shows the check-email page', () => { cy.intercept('POST', '**/api/signup', (request) => { expect(request.headers.accept).to.equal('application/json') expect(request.body).to.deep.equal({ email: 'user@example.com' }) request.reply({ statusCode: 201 }) }).as('signup') cy.visit('/signup') cy.get('#signup-email').type(' user@example.com ') cy.get('form').submit() cy.wait('@signup') cy.location('pathname').should('equal', '/check-email') cy.get('h1').should('have.text', 'Check your email') cy.contains('We sent you a link to confirm your signup.').should('be.visible') }) it('validates the email before submitting', () => { cy.intercept('POST', '**/api/signup').as('signup') cy.visit('/signup') cy.get('#signup-email').type('not-an-email') cy.get('form').submit() cy.get('#signup-email-error') .should('have.text', 'Enter a valid email address.') .and('be.visible') cy.get('#signup-email').should('have.attr', 'aria-invalid', 'true') cy.get('@signup.all').should('have.length', 0) cy.location('pathname').should('equal', '/signup') }) it('shows backend signup errors', () => { cy.intercept('POST', '**/api/signup', { statusCode: 409, body: { error: 'user@example.com already has an account' }, }).as('signup') cy.visit('/signup') cy.get('#signup-email').type('user@example.com') cy.get('form').submit() cy.wait('@signup') cy.get('[role="alert"]') .should('have.text', 'user@example.com already has an account') .and('be.visible') cy.location('pathname').should('equal', '/signup') }) it('redirects direct check-email visits back to signup', () => { cy.visit('/check-email') cy.location('pathname').should('equal', '/signup') }) })