mirror of
https://github.com/Kong/insomnia.git
synced 2026-09-17 08:59:33 -04:00
test: mitigate sidebar-focus-onboarding flaky timeout with reload fallback (#10489)
* test: add reload fallback for sidebar-focus-onboarding flake Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: update sidebar-focus-onboarding test strategy to use runIndex and simplify artifact naming * test: retry the reload fallback once more for sidebar-focus-onboarding Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: update sidebar-focus-onboarding test strategy to use sharding and restore previous run state --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f08d65b45e
commit
ebb3719ee5
2 files changed
+44
-17
No files matched your search
@@ -110,28 +110,52 @@ export class NavigationSidebar {
|
||||
}
|
||||
}
|
||||
|
||||
async expectWorkspaceActive(workspaceName: string): Promise<void> {
|
||||
async expectWorkspaceActive(
|
||||
workspaceName: string,
|
||||
{ allowReloadFallback = false }: { allowReloadFallback?: boolean } = {},
|
||||
): Promise<void> {
|
||||
await expect.soft(this.workspaceRow(workspaceName)).toBeVisible();
|
||||
// In focus mode there's no grid row to check aria-selected on for this workspace — being
|
||||
// shown as the focused header already proves it's the active one. Poll for either outcome
|
||||
// rather than deciding up front: right after navigating in, there's a brief window where
|
||||
// neither is true yet (focus mode hasn't finished swapping the row for the header), and a
|
||||
// one-shot check can catch that transient state and commit to the wrong branch.
|
||||
await expect
|
||||
.poll(
|
||||
async () => {
|
||||
if (await this.isWorkspaceFocused(workspaceName)) {
|
||||
return true;
|
||||
}
|
||||
const gridItem = this.workspaceGridListItem(workspaceName);
|
||||
if ((await gridItem.count()) === 0) {
|
||||
return false;
|
||||
}
|
||||
return (await gridItem.getAttribute('aria-selected')) === 'true';
|
||||
},
|
||||
{ timeout: 25_000 },
|
||||
)
|
||||
.toBe(true);
|
||||
const isActive = async () => {
|
||||
if (await this.isWorkspaceFocused(workspaceName)) {
|
||||
return true;
|
||||
}
|
||||
const gridItem = this.workspaceGridListItem(workspaceName);
|
||||
if ((await gridItem.count()) === 0) {
|
||||
return false;
|
||||
}
|
||||
return (await gridItem.getAttribute('aria-selected')) === 'true';
|
||||
};
|
||||
|
||||
if (!allowReloadFallback) {
|
||||
await expect.poll(isActive, { timeout: 25_000 }).toBe(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Rare app-side race right after creating a workspace: the sidebar's cache-invalidation
|
||||
// event for the new workspace can be dropped, leaving flatItems (and so both outcomes
|
||||
// above) stuck stale indefinitely — a longer timeout wouldn't help since nothing ever
|
||||
// arrives to unstick it. A reload rebuilds the sidebar cache from scratch instead of
|
||||
// waiting on that possibly-dropped event. One reload isn't always enough — on a loaded CI
|
||||
// runner the reload itself can eat most of the follow-up poll's budget just booting the
|
||||
// app back up — so retry the reload once more before finally giving up.
|
||||
const maxReloadAttempts = 2;
|
||||
for (let attempt = 0; attempt <= maxReloadAttempts; attempt++) {
|
||||
const isLastAttempt = attempt === maxReloadAttempts;
|
||||
try {
|
||||
await expect.poll(isActive, { timeout: isLastAttempt ? 15_000 : 10_000 }).toBe(true);
|
||||
return;
|
||||
} catch (error) {
|
||||
if (isLastAttempt) {
|
||||
throw error;
|
||||
}
|
||||
await this.page.reload({ waitUntil: 'networkidle' });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async selectWorkspace(workspaceName: string): Promise<void> {
|
||||
|
||||
@@ -21,7 +21,10 @@ test.describe('sidebar focus mode onboarding', () => {
|
||||
// A brand-new project starts empty, so the first collection comes from this welcome-state
|
||||
// button rather than the "Create in project" menu (which only appears once a project has content).
|
||||
await page.getByRole('button', { name: 'Create request collection', exact: true }).click();
|
||||
await insomnia.navigationSidebar.expectWorkspaceActive('My first collection');
|
||||
// allowReloadFallback: works around a known rare app-side race where the sidebar's
|
||||
// cache-invalidation event for a freshly created workspace can be dropped, leaving
|
||||
// this assertion stuck stale until something (here, a reload) forces a resync.
|
||||
await insomnia.navigationSidebar.expectWorkspaceActive('My first collection', { allowReloadFallback: true });
|
||||
|
||||
const onboarding = page.getByRole('dialog', { name: 'Sidebar focus mode onboarding' });
|
||||
await expect.soft(onboarding).toBeVisible();
|
||||
|
||||
Reference in new issue
Block a user