Skip to content

Commit 292cb56

Browse files
authored
Merge pull request #4259 from Geethegreat/save-alert
GSOC-E2E: Add unsaved changes warning test
2 parents 8b6aea3 + 7fcefcc commit 292cb56

1 file changed

Lines changed: 94 additions & 0 deletions

File tree

e2e/specs/unsaved_changes.spec.ts

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import type { Page } from '@playwright/test';
2+
import { test, expect } from '../fixtures';
3+
import { dismissCookieBanner } from '../helpers/cookie-banner';
4+
import { createTestUser, loginAs, TestUser } from '../helpers/auth';
5+
6+
// Renders off state.ide.unsavedChanges (see UnsavedChangesIndicator.jsx).
7+
const unsavedIndicator = (page: Page) =>
8+
page.getByRole('img', { name: 'Sketch has unsaved changes' });
9+
10+
// Covers the unsaved changes warning that appears when navigating away from the editor with unsaved changes.
11+
test.describe('unsaved changes warning', () => {
12+
let testUser: TestUser;
13+
14+
test.beforeAll(async ({ request }) => {
15+
testUser = await createTestUser(request);
16+
});
17+
18+
test.beforeEach(async ({ page }) => {
19+
await page.goto('/login');
20+
await dismissCookieBanner(page);
21+
await loginAs(page, testUser);
22+
23+
const editor = page.locator('.editor-holder');
24+
await editor.click();
25+
await page.keyboard.press('ControlOrMeta+A');
26+
await page.keyboard.type('function setup() {createCanvas(400, 400);}', {
27+
delay: 5
28+
});
29+
await expect(unsavedIndicator(page)).toBeVisible({ timeout: 10_000 });
30+
});
31+
32+
const navigateToSketches = async (page: Page) => {
33+
await page.getByRole('menuitem', { name: testUser.username }).click();
34+
await page.locator('#account-sketches').click();
35+
};
36+
37+
test('warns before navigating away from the editor with unsaved changes', async ({
38+
page
39+
}) => {
40+
let dialogMessage = '';
41+
page.once('dialog', (dialog) => {
42+
dialogMessage = dialog.message();
43+
return dialog.dismiss();
44+
});
45+
46+
await navigateToSketches(page);
47+
48+
expect(dialogMessage).toContain('You have unsaved changes');
49+
});
50+
51+
test('blocks navigation if the warning is dismissed', async ({ page }) => {
52+
const urlBeforeNav = page.url();
53+
page.once('dialog', (dialog) => dialog.dismiss());
54+
55+
await navigateToSketches(page);
56+
57+
expect(page.url()).toBe(urlBeforeNav);
58+
await expect(page.locator('.editor-holder')).toBeVisible();
59+
});
60+
61+
test('allows navigation if the warning is accepted', async ({ page }) => {
62+
page.once('dialog', (dialog) => dialog.accept());
63+
64+
await navigateToSketches(page);
65+
66+
await expect(page).toHaveURL(new RegExp(`/${testUser.username}/sketches`), {
67+
timeout: 10_000
68+
});
69+
});
70+
71+
test('does not appear when a sketch is saved before navigating', async ({
72+
page
73+
}) => {
74+
await page.locator('.editor-holder').click();
75+
await page.keyboard.press('Control+S');
76+
await expect(page.getByText('Sketch saved.')).toBeVisible({
77+
timeout: 10_000
78+
});
79+
await expect(unsavedIndicator(page)).toBeHidden();
80+
81+
let dialogFired = false;
82+
page.once('dialog', (dialog) => {
83+
dialogFired = true;
84+
return dialog.accept();
85+
});
86+
87+
await navigateToSketches(page);
88+
89+
await expect(page).toHaveURL(new RegExp(`/${testUser.username}/sketches`), {
90+
timeout: 10_000
91+
});
92+
expect(dialogFired).toBe(false);
93+
});
94+
});

0 commit comments

Comments
 (0)