|
2 | 2 | * Newsletter Subscription Form E2E Tests |
3 | 3 | * Tests for newsletter signup functionality |
4 | 4 | */ |
5 | | -import { test, expect, spyOnFetchEndpoint, delayFetchForEndpoint } from '@test/e2e/helpers' |
| 5 | +import { test, expect, spyOnFetchEndpoint, delayFetchForEndpoint, mockFetchEndpointResponse } from '@test/e2e/helpers' |
6 | 6 | import { EvaluationError } from '@test/errors' |
7 | 7 | import { TEST_EMAILS, ERROR_MESSAGES } from '@test/e2e/fixtures/test-data' |
8 | 8 | import { NewsletterPage } from '@test/e2e/helpers/pageObjectModels/NewsletterPage' |
@@ -147,6 +147,16 @@ test.describe('Newsletter Subscription Form', () => { |
147 | 147 | await newsletterPage.expectMessageContains(ERROR_MESSAGES.emailInvalid) |
148 | 148 | }) |
149 | 149 |
|
| 150 | + test('@ready valid email blur shows guidance message', async ({ page: playwrightPage }) => { |
| 151 | + const newsletterPage = await NewsletterPage.init(playwrightPage) |
| 152 | + await newsletterPage.navigateToNewsletterForm() |
| 153 | + |
| 154 | + await newsletterPage.fillEmail(TEST_EMAILS.valid) |
| 155 | + await newsletterPage.blurEmailInput() |
| 156 | + |
| 157 | + await newsletterPage.expectMessageContains("You'll receive a confirmation email. Click the link to complete your subscription.") |
| 158 | + }) |
| 159 | + |
150 | 160 | test('@ready GDPR consent link works', async ({ page: playwrightPage }) => { |
151 | 161 | const newsletterPage = await NewsletterPage.init(playwrightPage) |
152 | 162 | await newsletterPage.navigateToNewsletterForm() |
@@ -176,4 +186,50 @@ test.describe('Newsletter Subscription Form', () => { |
176 | 186 | expect(responseData.success).toBe(true) |
177 | 187 | expect(responseData.message).toContain('check your email') |
178 | 188 | }) |
| 189 | + |
| 190 | + test('@ready API error preserves form state and surfaces message', async ({ page: playwrightPage }) => { |
| 191 | + const newsletterPage = await NewsletterPage.init(playwrightPage) |
| 192 | + await newsletterPage.navigateToNewsletterForm() |
| 193 | + |
| 194 | + const mockResponse = await mockFetchEndpointResponse(newsletterPage.page, { |
| 195 | + endpoint: '/api/newsletter', |
| 196 | + status: 429, |
| 197 | + body: { success: false, error: 'Try again in 30 seconds.' }, |
| 198 | + }) |
| 199 | + |
| 200 | + try { |
| 201 | + await newsletterPage.fillEmail(TEST_EMAILS.valid) |
| 202 | + await newsletterPage.checkGdprConsent() |
| 203 | + await newsletterPage.submitForm() |
| 204 | + |
| 205 | + await newsletterPage.expectMessageContains('Try again in 30 seconds.') |
| 206 | + await newsletterPage.expectEmailValue(TEST_EMAILS.valid) |
| 207 | + await newsletterPage.expectGdprChecked() |
| 208 | + } finally { |
| 209 | + await mockResponse.restore() |
| 210 | + } |
| 211 | + }) |
| 212 | + |
| 213 | + test('@ready submit button disables during pending request', async ({ page: playwrightPage }) => { |
| 214 | + const newsletterPage = await NewsletterPage.init(playwrightPage) |
| 215 | + await newsletterPage.navigateToNewsletterForm() |
| 216 | + |
| 217 | + await newsletterPage.fillEmail(TEST_EMAILS.valid) |
| 218 | + await newsletterPage.checkGdprConsent() |
| 219 | + |
| 220 | + const browserName = newsletterPage.context().browser()?.browserType().name() |
| 221 | + const delayMs = browserName === 'webkit' ? 400 : 200 |
| 222 | + const delayOverride = await delayFetchForEndpoint(newsletterPage.page, { endpoint: '/api/newsletter', delayMs }) |
| 223 | + const submitButton = newsletterPage.locator('#newsletter-submit') |
| 224 | + |
| 225 | + const submitPromise = submitButton.click() |
| 226 | + |
| 227 | + try { |
| 228 | + await expect(submitButton).toBeDisabled() |
| 229 | + await submitPromise |
| 230 | + await expect(submitButton).not.toBeDisabled() |
| 231 | + } finally { |
| 232 | + await delayOverride.restore() |
| 233 | + } |
| 234 | + }) |
179 | 235 | }) |
0 commit comments