Skip to content

Commit d07d47c

Browse files
committed
test: verify allowEdits as glob patterns
1 parent 5962354 commit d07d47c

File tree

4 files changed

+87
-0
lines changed

4 files changed

+87
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'File in first level';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'File in second level';
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
type: lesson
3+
title: Allow Edits Glob
4+
previews: false
5+
editor:
6+
fileTree:
7+
allowEdits:
8+
# Items in root
9+
- "/*"
10+
# Only "allowed-filename-only.js" inside "/first-level" folder
11+
- "/first-level/allowed-filename-only.js"
12+
# Anything inside "second-level" folders anywhere
13+
- "**/second-level/**"
14+
terminal:
15+
panels: terminal
16+
---
17+
18+
# File Tree test - Allow Edits Glob

e2e/test/file-tree.test.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,70 @@ test('user can create folders', async ({ page }) => {
155155
await expect(terminalOutput).toContainText(folder, { useInnerText: true });
156156
}
157157
});
158+
159+
test('user can create files and folders in allowed directories', async ({ page }) => {
160+
await page.goto(`${BASE_URL}/allow-edits-glob`);
161+
await expect(page.getByRole('heading', { level: 1, name: 'File Tree test - Allow Edits Glob' })).toBeVisible();
162+
163+
// wait for terminal to start
164+
const terminal = page.getByRole('textbox', { name: 'Terminal input' });
165+
const terminalOutput = page.getByRole('tabpanel', { name: 'Terminal' });
166+
await expect(terminalOutput).toContainText('~/tutorial', { useInnerText: true });
167+
168+
// can create files in root and inside "second-level"
169+
for (const [locator, name, type] of [
170+
[page.getByTestId('file-tree-root-context-menu'), 'new-file.js', 'file'],
171+
[page.getByRole('button', { name: 'second-level' }), 'new-folder.js', 'folder'],
172+
] as const) {
173+
await locator.click({ button: 'right' });
174+
await page.getByRole('menuitem', { name: `Create ${type}` }).click();
175+
176+
await page.locator('*:focus').fill(name);
177+
await page.locator('*:focus').press('Enter');
178+
await expect(page.getByRole('button', { name })).toBeVisible();
179+
}
180+
181+
await expect(page.getByRole('button', { name: 'new-file.js' })).toBeVisible();
182+
await expect(page.getByRole('button', { name: 'new-folder' })).toBeVisible();
183+
184+
// verify that files are present on file system via terminal
185+
for (const [directory, folder] of [
186+
['./', 'new-file.js'],
187+
['./first-level/second-level/', 'new-folder'],
188+
]) {
189+
await terminal.fill(`clear; ls ${directory}`);
190+
await terminal.press('Enter');
191+
192+
await expect(terminalOutput).toContainText(folder, { useInnerText: true });
193+
}
194+
});
195+
196+
test('user cannot create files or folders in disallowed directories', async ({ page }) => {
197+
await page.goto(`${BASE_URL}/allow-edits-glob`);
198+
await expect(page.getByRole('heading', { level: 1, name: 'File Tree test - Allow Edits Glob' })).toBeVisible();
199+
200+
// wait for terminal to start
201+
const terminalOutput = page.getByRole('tabpanel', { name: 'Terminal' });
202+
await expect(terminalOutput).toContainText('~/tutorial', { useInnerText: true });
203+
204+
for (const [name, type] of [
205+
['new-file.js', 'file'],
206+
['new-folder', 'folder'],
207+
] as const) {
208+
await page.getByRole('button', { name: 'first-level' }).click({ button: 'right' });
209+
await page.getByRole('menuitem', { name: `Create ${type}` }).click();
210+
211+
const message = new Promise<string>((resolve) =>
212+
page.once('dialog', (dialog) => {
213+
resolve(dialog.message());
214+
dialog.accept();
215+
}),
216+
);
217+
218+
await page.locator('*:focus').fill(name);
219+
await page.locator('*:focus').press('Enter');
220+
expect(await message).toBe(
221+
`File \"/first-level/${name}\" is not allowed. Allowed patterns: [/*, /first-level/allowed-filename-only.js, **/second-level/**].`,
222+
);
223+
}
224+
});

0 commit comments

Comments
 (0)