Skip to content

Commit 286832e

Browse files
authored
[DT-2854] add an integration test to make sure dark mode toggling works through localstorage (#2752)
* add an integration test to make sure dark mode toggling works through localstorage * rename dark-mode spec file so it only runs on desktop * Add integration tests for dark mode toggle functionality on desktop and mobile
1 parent 380b793 commit 286832e

5 files changed

Lines changed: 102 additions & 0 deletions

File tree

src/lib/components/dark-mode-icon-button.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@
3535
label={buttonText}
3636
icon={buttonIcon}
3737
on:click={cycleDarkModePreference}
38+
data-testid="dark-mode-icon-button"
3839
/>
3940
</Tooltip>

src/lib/components/dark-mode-navigation-button.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@
3333
tooltip={buttonText}
3434
label={buttonText}
3535
icon={buttonIcon}
36+
data-testid="dark-mode-navigation-button"
3637
/>

src/lib/holocene/navigation/navigation-button.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<div
2626
class="flex h-6 w-6 items-center after:absolute after:left-[calc(100%_+_1.5rem)] after:top-0 after:hidden after:h-8 after:items-center after:bg-slate-800 after:p-1 after:px-2 after:text-xs after:text-white after:content-[attr(data-tooltip)] group-data-[nav=closed]:hover:after:flex"
2727
data-tooltip={tooltip}
28+
aria-hidden="true"
2829
>
2930
<Icon name={icon} {animate} {active} />
3031
</div>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { expect, test } from '@playwright/test';
2+
3+
import { mockWorkflowsApis } from '~/test-utilities/mock-apis';
4+
5+
test.describe('Dark Mode Toggle', () => {
6+
test.beforeEach(async ({ page }) => {
7+
await mockWorkflowsApis(page);
8+
await page.goto('/');
9+
});
10+
11+
test('user can toggle dark mode between on, off, and system default', async ({
12+
page,
13+
}) => {
14+
const nightLabel = 'Night';
15+
const systemDefaultLabel = 'System Default';
16+
const dayLabel = 'Day';
17+
18+
// starts on day mode
19+
const button = page.getByTestId('dark-mode-icon-button');
20+
21+
await expect(button).toBeVisible();
22+
23+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
24+
null, // nothing in local storage yet
25+
);
26+
27+
// after day is system mode
28+
await button.click();
29+
await expect(button).toHaveAccessibleName(systemDefaultLabel);
30+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
31+
JSON.stringify('system'),
32+
);
33+
34+
// after system is dark mode
35+
await button.click();
36+
await expect(button).toHaveAccessibleName(nightLabel);
37+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
38+
JSON.stringify(true),
39+
);
40+
41+
// cycle back to day
42+
await button.click();
43+
await expect(button).toHaveAccessibleName(dayLabel);
44+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
45+
JSON.stringify(false),
46+
);
47+
});
48+
});
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { expect, test } from '@playwright/test';
2+
3+
import { mockWorkflowsApis } from '~/test-utilities/mock-apis';
4+
5+
test.describe('Dark Mode Toggle', () => {
6+
test.beforeEach(async ({ page }) => {
7+
await mockWorkflowsApis(page);
8+
await page.goto('/');
9+
});
10+
11+
test('user can toggle dark mode between on, off, and system default', async ({
12+
page,
13+
}) => {
14+
const nightLabel = 'Night';
15+
const systemDefaultLabel = 'System Default';
16+
const dayLabel = 'Day';
17+
18+
// on mobile, the dark mode button is in the profile menu
19+
await page.getByTestId('nav-profile-button').click();
20+
21+
// starts on day mode
22+
const button = page.getByTestId('dark-mode-navigation-button');
23+
24+
await expect(button).toBeVisible();
25+
26+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
27+
null, // nothing in local storage yet
28+
);
29+
30+
// after day is system mode
31+
await button.click();
32+
await expect(button).toHaveAccessibleName(systemDefaultLabel);
33+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
34+
JSON.stringify('system'),
35+
);
36+
37+
// after system is dark mode
38+
await button.click();
39+
await expect(button).toHaveAccessibleName(nightLabel);
40+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
41+
JSON.stringify(true),
42+
);
43+
44+
// cycle back to day
45+
await button.click();
46+
await expect(button).toHaveAccessibleName(dayLabel);
47+
expect(await page.evaluate(() => localStorage.getItem('dark mode'))).toBe(
48+
JSON.stringify(false),
49+
);
50+
});
51+
});

0 commit comments

Comments
 (0)