test: play with a server starting from scratch

Massimo Melina committed Sep 26, 2025 at 00:42 UTC a403af9fb8b2d0929a6bf44648584dcf1dc81e22
4 files changed +64 -3
.gitignore
+1
@@ -5,6 +5,7 @@ dist
5 .DS_Store
6 #produced by running
7 tests/work
8 +tests/work2
9 tests/config.yaml.bak
10
11 # Playwright
e2e/frontend.spec.ts
+56
@@ -289,3 +289,59 @@ async function screenshot(page: Page, selectorForMask='') {
289 await wait(1000) // this accounts especially for our DataTable component which takes time to set the layout
290 return expect(page).toHaveScreenshot({ fullPage: true, mask: [page.locator(`.maskInTests${selectorForMask}`)] });
291 }
292 +
293 +test('anew', async ({ page, browserName }) => {
294 + if (page.viewportSize()?.width! < 1000 || browserName !== 'chromium') return // test only for desktop chromium
295 + await fs.promises.writeFile('tests/work2/config.yaml', "port: 82\nopen_browser_at_start: false"); // reset config
296 + await wait(500) // ensure new config is aplied
297 + await page.goto('http://localhost:82/');
298 + await expect(page.getByText('Nothing here')).toBeVisible();
299 + await page.getByRole('button', { name: 'Options' }).click();
300 + const page1Promise = page.waitForEvent('popup');
301 + await page.getByRole('button', { name: 'Admin-panel' }).click();
302 + const page1 = await page1Promise;
303 + await page1.getByRole('link', { name: 'add some' }).click();
304 + await page1.getByRole('button', { name: 'Add' }).click();
305 + await page1.getByRole('menuitem', { name: 'from disk' }).click();
306 + await page1.getByRole('textbox', { name: /Filter results/ }).fill('data');
307 + await expect(page1.getByText('Filter results (1/')).toBeVisible();
308 + await page1.getByRole('checkbox').check();
309 + await page1.getByText('data.kv').click();
310 + await page1.getByRole('button', { name: 'Add' }).click();
311 + await page1.getByRole('menuitem', { name: 'from disk' }).click();
312 + await page1.getByRole('button', { name: 'Select this folder' }).click();
313 + await page1.getByRole('button', { name: 'Add' }).click();
314 + await page1.getByRole('menuitem', { name: 'virtual folder' }).click();
315 + await page1.getByRole('textbox').fill('folder1');
316 + await page1.getByRole('textbox').press('Enter');
317 + await page1.getByRole('dialog').locator('div').nth(1).click();
318 + await page1.locator('.MuiDialog-container').press('Escape')
319 + await page1.locator('#vfs').click();
320 + await page1.getByText('folder1', { exact: true }).click();
321 + await page1.getByRole('treeitem', { name: 'folder1' }).locator('path').first().click();
322 + await page1.getByText('folder1', { exact: true }).click();
323 + await page1.getByRole('button', { name: 'Cut' }).click();
324 + await page1.locator('div').filter({ hasText: 'InfoNow that this is marked' }).nth(1).click();
325 + await page1.getByRole('button', { name: '(Close)' }).click();
326 + await page1.getByText('Home folder').click();
327 + await page1.getByRole('button', { name: '(/work2/folder1/)' }).click();
328 + await page1.getByText('/Users/rejetto/code/hfs/tests/work2/data.kv').click();
329 + await page1.getByRole('button', { name: 'Cut' }).click();
330 + await page1.getByRole('button', { name: '(Close)' }).click();
331 + await page1.getByText('folder1').click();
332 + await page1.getByRole('button', { name: '(/data.kv)' }).click();
333 + await page1.locator('[id="vfs-/"] div').filter({ hasText: /work2\/data\.kv$/ }).nth(4).click();
334 + await page.getByRole('button', { name: 'Close' }).click();
335 + await page.getByRole('link', { name: 'home' }).click();
336 + await page.getByRole('link', { name: 'Reload' }).click();
337 + await page.getByRole('link', { name: 'folder1, Folder' }).click();
338 + await page.getByRole('link', { name: 'data.kv' }).click();
339 + await page.getByRole('button', { name: 'Close' }).click();
340 + await page.locator('.list-wrapper > div').press('Control+Backspace');
341 + await page.getByRole('link', { name: 'work2, Folder' }).click();
342 + await page.getByRole('link', { name: 'config.yaml', exact: true }).click();
343 + const page2Promise = page.waitForEvent('popup');
344 + await page.getByRole('link', { name: 'Open' }).click();
345 + const page2 = await page2Promise;
346 + await page2.getByText(/folder1/).click();
347 +});
playwright.config.ts
+6 -2
@@ -92,9 +92,13 @@ export default defineConfig({
92 },
93 },
94 /* Run your local dev server before starting the tests */
95 - webServer: {
95 + webServer: [{
96 command: 'npm run server-for-test',
97 url: 'http://127.0.0.1:81',
98 reuseExistingServer: !process.env.CI,
99 - },
99 + }, {
100 + command: 'rm -rf tests/work2 && node dist/src --cwd tests/work2 --debug --port 82 --open_browser_at_start false',
101 + url: 'http://127.0.0.1:82',
102 + reuseExistingServer: !process.env.CI,
103 + }]
104 });
tests/config.yaml
+1 -1
@@ -4,7 +4,7 @@ allowed_referer: x.com
4 localhost_admin: false
5 vfs:
6 masks:
7 - "**/config.yaml*|test.ts|work|*uploaded":
7 + "**/config.yaml*|test.ts|work|*uploaded|work2":
8 can_see: false
9 tests/page/!*.png:
10 mime: text/plain