Skip to content

Commit cf753ac

Browse files
committed
Add Bug Reporter E2E test
1 parent 6b60249 commit cf753ac

3 files changed

Lines changed: 163 additions & 4 deletions

File tree

‎_TODO.md‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55

66
## Missing E2E Component Tests
77

8-
- BugReporter
9-
- Calendar
108
- Code/CodeBlock
119
- Code/CodeTabs
12-
- Consent/Checkbox
1310
- Diagram
14-
- FileExplorer
1511

1612
## Performance
1713

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
---
2+
import BaseLayout from '@layouts/BaseLayout.astro'
3+
import Button from '@components/Button/index.astro'
4+
import BugReporterComponent from '@components/BugReporter/index.astro'
5+
6+
export const prerender = true
7+
8+
const pageTitle = 'Bug Reporter Component Test Fixture'
9+
const fixtureDescription =
10+
'Dedicated route reserved for validating the Bug Reporter modal without relying on footer layout or scroll position.'
11+
const pagePath = '/testing/bug-reporter'
12+
const triggerId = 'bugReporterFixtureTrigger'
13+
const dialogId = 'bugReporterFixtureDialog'
14+
const statusId = 'bugReporterFixtureStatus'
15+
const formId = 'bugReporterFixtureForm'
16+
const closeButtonId = 'bugReporterFixtureClose'
17+
const cancelButtonId = 'bugReporterFixtureCancel'
18+
const minimizeButtonId = 'bugReporterFixtureMinimize'
19+
const minimizedBarId = 'bugReporterFixtureMinimizedBar'
20+
const minimizedRestoreButtonId = 'bugReporterFixtureRestore'
21+
const minimizedCloseButtonId = 'bugReporterFixtureMinimizedClose'
22+
---
23+
24+
<BaseLayout pageTitle={pageTitle} path={pagePath} pageDescription={fixtureDescription} noindex>
25+
<section class="mx-auto flex max-w-4xl flex-col items-center gap-8 py-10 px-4">
26+
<header class="max-w-3xl text-center space-y-4">
27+
<p class="text-xs uppercase tracking-widest text-content-active">Testing Fixture</p>
28+
<h1 class="text-3xl font-semibold leading-tight">{pageTitle}</h1>
29+
<p class="text-content-active">{fixtureDescription}</p>
30+
</header>
31+
32+
<article class="w-full max-w-2xl space-y-6 rounded-lg border border-trim bg-page-offset p-6 shadow-sm">
33+
<div class="space-y-2">
34+
<p class="text-xs uppercase tracking-wider text-content-active">Fixture Trigger</p>
35+
<h2 class="text-2xl font-semibold">Open the bug reporter modal</h2>
36+
<p class="text-content-active">
37+
This trigger renders the production Bug Reporter component with a stable button placement for automation.
38+
</p>
39+
</div>
40+
41+
<div class="flex justify-center">
42+
<Button
43+
id={triggerId}
44+
type="button"
45+
variant="success"
46+
icon="bug"
47+
text="Open Bug Reporter"
48+
ariaLabel="Report a bug"
49+
/>
50+
</div>
51+
52+
<BugReporterComponent
53+
triggerId={triggerId}
54+
dialogId={dialogId}
55+
statusId={statusId}
56+
formId={formId}
57+
closeButtonId={closeButtonId}
58+
cancelButtonId={cancelButtonId}
59+
minimizeButtonId={minimizeButtonId}
60+
minimizedBarId={minimizedBarId}
61+
minimizedRestoreButtonId={minimizedRestoreButtonId}
62+
minimizedCloseButtonId={minimizedCloseButtonId}
63+
/>
64+
</article>
65+
</section>
66+
</BaseLayout>
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* Bug Reporter modal tests
3+
* Covers the footer-triggered bug report dialog and minimized state behavior.
4+
*/
5+
6+
import { BasePage, expect, test } from '@test/e2e/helpers'
7+
8+
const fixturePath = '/testing/bug-reporter'
9+
const triggerSelector = '#bugReporterFixtureTrigger'
10+
const dialogSelector = '#bugReporterFixtureDialog'
11+
const formSelector = '#bugReporterFixtureForm'
12+
const cancelButtonSelector = '#bugReporterFixtureCancel'
13+
const minimizeButtonSelector = '#bugReporterFixtureMinimize'
14+
const minimizedBarSelector = '#bugReporterFixtureMinimizedBar'
15+
const restoreButtonSelector = '#bugReporterFixtureRestore'
16+
const minimizedCloseButtonSelector = '#bugReporterFixtureMinimizedClose'
17+
const nameInputSelector = `${formSelector} input[name="name"]`
18+
const emailInputSelector = `${formSelector} input[name="email"]`
19+
const messageSelector = `${formSelector} textarea[name="message"]`
20+
21+
const openBugReporter = async (page: BasePage) => {
22+
const trigger = page.locator(triggerSelector)
23+
await expect(trigger).toBeVisible()
24+
await trigger.click()
25+
await expect(page.locator(dialogSelector)).toHaveAttribute('open', '')
26+
await expect(page.locator(nameInputSelector)).toBeVisible()
27+
}
28+
29+
test.describe('Bug Reporter Modal', () => {
30+
test('@ready opens from the fixture trigger with labeled fields', async ({ page: playwrightPage }) => {
31+
const page = await BasePage.init(playwrightPage)
32+
await page.goto(fixturePath, { skipCookieDismiss: true })
33+
34+
await openBugReporter(page)
35+
36+
const nameInput = page.locator(nameInputSelector)
37+
const emailInput = page.locator(emailInputSelector)
38+
const messageInput = page.locator(messageSelector)
39+
40+
await expect(page.locator(dialogSelector)).toHaveAttribute('open', '')
41+
await expect(playwrightPage.getByRole('heading', { name: 'Report a bug' })).toBeVisible()
42+
await expect(nameInput).toBeFocused()
43+
await expect(nameInput).toHaveAccessibleName('Name')
44+
await expect(emailInput).toHaveAccessibleName('Email')
45+
await expect(messageInput).toHaveAccessibleName('Description')
46+
})
47+
48+
test('@ready cancel closes the modal and clears entered form state', async ({ page: playwrightPage }) => {
49+
const page = await BasePage.init(playwrightPage)
50+
await page.goto(fixturePath, { skipCookieDismiss: true })
51+
52+
await openBugReporter(page)
53+
54+
const nameInput = page.locator(nameInputSelector)
55+
const emailInput = page.locator(emailInputSelector)
56+
const messageInput = page.locator(messageSelector)
57+
58+
await nameInput.fill('Test User')
59+
await emailInput.fill('test@example.com')
60+
await messageInput.fill('Modal reset check')
61+
62+
await page.locator(cancelButtonSelector).click()
63+
await expect(page.locator(dialogSelector)).not.toHaveAttribute('open', '')
64+
65+
await openBugReporter(page)
66+
67+
await expect(nameInput).toHaveValue('')
68+
await expect(emailInput).toHaveValue('')
69+
await expect(messageInput).toHaveValue('')
70+
})
71+
72+
test('@ready minimize preserves draft state and minimized close clears it', async ({ page: playwrightPage }) => {
73+
const page = await BasePage.init(playwrightPage)
74+
await page.goto(fixturePath, { skipCookieDismiss: true })
75+
76+
await openBugReporter(page)
77+
78+
const messageInput = page.locator(messageSelector)
79+
await messageInput.fill('Bug details in progress')
80+
81+
await page.locator(minimizeButtonSelector).click()
82+
await expect(page.locator(dialogSelector)).not.toHaveAttribute('open', '')
83+
await expect(page.locator(minimizedBarSelector)).toBeVisible()
84+
85+
await page.locator(restoreButtonSelector).click()
86+
await expect(page.locator(dialogSelector)).toHaveAttribute('open', '')
87+
await expect(messageInput).toHaveValue('Bug details in progress')
88+
89+
await page.locator(minimizeButtonSelector).click()
90+
await expect(page.locator(minimizedBarSelector)).toBeVisible()
91+
await page.locator(minimizedCloseButtonSelector).click()
92+
await expect(page.locator(minimizedBarSelector)).toBeHidden()
93+
94+
await openBugReporter(page)
95+
await expect(messageInput).toHaveValue('')
96+
})
97+
})

0 commit comments

Comments
 (0)