Skip to content

Commit 1c906a3

Browse files
committed
Add error states and resilience under mocked latency tests to consent checkbox E2E test with container mocks
1 parent 1409b00 commit 1c906a3

1 file changed

Lines changed: 57 additions & 1 deletion

File tree

‎test/e2e/specs/03-forms/newsletter-subscription.spec.ts‎

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Newsletter Subscription Form E2E Tests
33
* Tests for newsletter signup functionality
44
*/
5-
import { test, expect, spyOnFetchEndpoint, delayFetchForEndpoint } from '@test/e2e/helpers'
5+
import { test, expect, spyOnFetchEndpoint, delayFetchForEndpoint, mockFetchEndpointResponse } from '@test/e2e/helpers'
66
import { EvaluationError } from '@test/errors'
77
import { TEST_EMAILS, ERROR_MESSAGES } from '@test/e2e/fixtures/test-data'
88
import { NewsletterPage } from '@test/e2e/helpers/pageObjectModels/NewsletterPage'
@@ -147,6 +147,16 @@ test.describe('Newsletter Subscription Form', () => {
147147
await newsletterPage.expectMessageContains(ERROR_MESSAGES.emailInvalid)
148148
})
149149

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+
150160
test('@ready GDPR consent link works', async ({ page: playwrightPage }) => {
151161
const newsletterPage = await NewsletterPage.init(playwrightPage)
152162
await newsletterPage.navigateToNewsletterForm()
@@ -176,4 +186,50 @@ test.describe('Newsletter Subscription Form', () => {
176186
expect(responseData.success).toBe(true)
177187
expect(responseData.message).toContain('check your email')
178188
})
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+
})
179235
})

0 commit comments

Comments
 (0)