From 05bfe1d99320e37152a9464e8dd1001fdb44794c Mon Sep 17 00:00:00 2001 From: mirivlad Date: Wed, 1 Jul 2026 08:17:45 +0800 Subject: [PATCH] Cover Files breadcrumb segment navigation --- frontend/e2e/files-plugin.spec.js | 23 +++++++++++++++++++++++ frontend/src/lib/test/wails-mock.js | 16 ++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/frontend/e2e/files-plugin.spec.js b/frontend/e2e/files-plugin.spec.js index c2c2026..05905ca 100644 --- a/frontend/e2e/files-plugin.spec.js +++ b/frontend/e2e/files-plugin.spec.js @@ -156,6 +156,29 @@ test.describe('G: Files Plugin', () => { await expect(page.locator('[data-file-name="CutMe"]')).toHaveCount(0); }); + test('files explorer navigates by clicking breadcrumb segments', async ({ page }) => { + await page.locator('.wt-label').filter({ hasText: 'Project' }).click(); + await openFilesTool(page); + await expect(page.locator('.files-breadcrumb')).toContainText('Project', { timeout: 10000 }); + + await page.locator('[data-files-action="new-folder"]').click(); + await page.locator('[data-files-create-input]').fill('BreadcrumbParent'); + await page.locator('[data-files-create-confirm]').click(); + await page.locator('[data-file-name="BreadcrumbParent"]').dblclick(); + await expect(page.locator('.files-breadcrumb')).toContainText('BreadcrumbParent'); + + await page.locator('[data-files-action="new-folder"]').click(); + await page.locator('[data-files-create-input]').fill('BreadcrumbChild'); + await page.locator('[data-files-create-confirm]').click(); + await page.locator('[data-file-name="BreadcrumbChild"]').dblclick(); + await expect(page.locator('.files-breadcrumb')).toContainText('BreadcrumbChild'); + + await page.locator('.files-breadcrumb-item').filter({ hasText: 'BreadcrumbParent' }).click(); + await expect(page.locator('.files-breadcrumb')).toContainText('BreadcrumbParent'); + await expect(page.locator('.files-breadcrumb')).not.toContainText('BreadcrumbChild'); + await expect(page.locator('[data-file-name="BreadcrumbChild"]')).toBeVisible(); + }); + test('files explorer duplicates a file from the context menu', async ({ page }) => { await page.locator('.wt-label').filter({ hasText: 'Project' }).click(); await openFilesTool(page); diff --git a/frontend/src/lib/test/wails-mock.js b/frontend/src/lib/test/wails-mock.js index 4fa4f43..7e1b006 100644 --- a/frontend/src/lib/test/wails-mock.js +++ b/frontend/src/lib/test/wails-mock.js @@ -787,8 +787,20 @@ function firstSelected() { return selectedEntries()[0] || null; } function updateBreadcrumb() { breadcrumb.innerHTML = ''; - breadcrumb.appendChild(e('span', { className: 'files-breadcrumb-item', onClick: function () { nav(''); } }, [workspaceName])); - if (current) breadcrumb.appendChild(e('span', { className: 'files-breadcrumb-current' }, [' / ' + current])); + breadcrumb.appendChild(e('span', { className: current ? 'files-breadcrumb-item' : 'files-breadcrumb-current', onClick: function () { nav(''); } }, [workspaceName])); + if (!current) return; + var parts = current.split('/'); + var path = ''; + parts.forEach(function (part, index) { + path = path ? path + '/' + part : part; + breadcrumb.appendChild(e('span', { className: 'files-breadcrumb-sep' }, [' / '])); + var target = path; + var isCurrent = index === parts.length - 1; + breadcrumb.appendChild(e('span', { + className: isCurrent ? 'files-breadcrumb-current' : 'files-breadcrumb-item', + onClick: function () { if (!isCurrent) nav(target); } + }, [part])); + }); } function visible() { return entries.filter(function (item) { return !item.isHidden && !item.isReserved && (!filter || item.name.toLowerCase().indexOf(filter) !== -1); }).sort(function (a, b) {