|
|
@@ -121,7 +121,7 @@ describe('web e2e: workspace management (create / rename / flat view / hover aff
|
|
|
* Reveal and click a row action, re-hovering if a projection update replaces
|
|
|
* the row before its hover-only button becomes visible.
|
|
|
*/
|
|
|
- async function clickHoverAction(row: Locator, name: string): Promise<void> {
|
|
|
+ async function clickHoverAction(row: Locator, name: string | RegExp): Promise<void> {
|
|
|
const button = row.getByRole('button', { name })
|
|
|
await expect.poll(async () => {
|
|
|
await row.hover()
|
|
|
@@ -210,6 +210,10 @@ describe('web e2e: workspace management (create / rename / flat view / hover aff
|
|
|
await page.waitForSelector('[class*="frame"]', { timeout: 30_000 })
|
|
|
acknowledgeReloadConnectionLoss(tripwire, warningStart)
|
|
|
await expect.poll(() => page.getByText('gamma-ws', { exact: true }).count(), { timeout: 15_000 }).toBeGreaterThanOrEqual(1)
|
|
|
+ // Session restoration focuses the composer; the Workspace list can arrive
|
|
|
+ // first. Do not let that focus cancel the next directory dialog's path draft.
|
|
|
+ const composer = page.locator('[data-composer-input][contenteditable="true"]')
|
|
|
+ await expect.poll(() => composer.evaluate(element => document.activeElement === element), { timeout: 10_000 }).toBe(true)
|
|
|
expect(tripwire.pageErrors).toEqual([])
|
|
|
}, 90_000)
|
|
|
|
|
|
@@ -596,14 +600,14 @@ describe('web e2e: workspace management (create / rename / flat view / hover aff
|
|
|
await expect.poll(() => sessionRow.getAttribute('aria-selected'), { timeout: 10_000 }).toBe('true')
|
|
|
const ungroupedSection = page.getByText('Ungrouped', { exact: true }).locator('..').locator('..').locator('..')
|
|
|
await expect.poll(() => ungroupedSection.locator('[role="treeitem"]').count(), { timeout: 10_000 }).toBe(2)
|
|
|
- const rowTitle = await sessionRow.locator('[class*="title"]').innerText()
|
|
|
// Row menu: hover reveals the actions button; Archive session commits
|
|
|
// without a confirmation dialog (non-destructive: log + accounting stay).
|
|
|
- await clickHoverAction(sessionRow, `Session actions for ${rowTitle}`)
|
|
|
+ // Opening a cold Session can replace its fallback title after selection.
|
|
|
+ await clickHoverAction(sessionRow, /^Session actions for /)
|
|
|
await page.getByRole('menuitem', { name: 'Archive session' }).click()
|
|
|
// The row disappears on the archive-set echo; with no other visible
|
|
|
// stray, the whole Ungrouped bucket withdraws.
|
|
|
- await expect.poll(() => page.getByText(rowTitle, { exact: true }).count(), { timeout: 10_000 }).toBe(0)
|
|
|
+ await expect.poll(() => sessionRow.count(), { timeout: 10_000 }).toBe(0)
|
|
|
await expect.poll(() => page.getByText('Ungrouped', { exact: true }).count(), { timeout: 10_000 }).toBe(0)
|
|
|
// Durable on the host: the registry-global set carries the id while the
|
|
|
// session log itself stays in persistence untouched.
|
|
|
@@ -618,7 +622,7 @@ describe('web e2e: workspace management (create / rename / flat view / hover aff
|
|
|
// The archived row must not resurface (the Ungrouped bucket itself may
|
|
|
// reappear if selection restore lands on another stray — not this test's
|
|
|
// concern).
|
|
|
- expect(await page.getByText(rowTitle, { exact: true }).count()).toBe(0)
|
|
|
+ expect(await sessionRow.count()).toBe(0)
|
|
|
expect(tripwire.pageErrors).toEqual([])
|
|
|
}, 90_000)
|
|
|
|