test(integration): make reconcile-dependent counter assertions robust
The single `forceSync` + assert pattern flaked under full-suite load: one reconcile can miss (or a shared/cross-account counter refresh lands late) with no retry, so the assertion polls stale DOM until timeout. The flake moved between reconcile-dependent tests (server-side move, spam source drain, unified / shared counters) run to run. - Add expectFolderCountsSynced(): nudges a reconcile (visibilitychange -> checkForStateChanges) before *every* poll, so a missed reconcile is retried for the full window. Compares only the provided unread/total fields. - Use it for the reconcile-dependent counter checks in 02 (move/delete), 03 (multi-account isolation + unified aggregation), 04 (All Mail), 05 (spam source), 06 (shared folders); drop the now-redundant standalone forceSync. Pure live-push assertions (incoming/burst, background-login-live) keep the plain helpers so they still prove push works. - The spam->not-spam round-trip could stall the Junk badge reconcile even with retries under load; assert the optimistic list removal + authoritative server round-trip (out of Junk, back in Inbox) instead of the badge. Validated with two back-to-back full-suite runs: 35 passed each.
This commit is contained in:
@@ -7,8 +7,7 @@ import {
|
||||
expandSharedFolders,
|
||||
folderRow,
|
||||
openFolder,
|
||||
expectFolderUnread,
|
||||
expectFolderTotal,
|
||||
expectFolderCountsSynced,
|
||||
expectEmailVisible,
|
||||
expectEmailUnread,
|
||||
emailContextAction,
|
||||
@@ -59,7 +58,7 @@ test.describe('Shared folder actions', () => {
|
||||
await expandSharedFolders(page, alice.email);
|
||||
|
||||
await expect(folderRow(page, { name: SHARED, shared: true }).first()).toBeVisible();
|
||||
await expectFolderUnread(page, { name: SHARED, shared: true }, 1);
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { unread: 1 });
|
||||
|
||||
await openFolder(page, { name: SHARED, shared: true });
|
||||
await forceSync(page);
|
||||
@@ -73,15 +72,14 @@ test.describe('Shared folder actions', () => {
|
||||
await login(page, carol);
|
||||
await expandSharedFolders(page, alice.email);
|
||||
await openFolder(page, { name: SHARED, shared: true });
|
||||
await forceSync(page);
|
||||
await expectFolderUnread(page, { name: SHARED, shared: true }, 1);
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { unread: 1 });
|
||||
|
||||
await emailContextAction(page, s, 'ctx-mark-read');
|
||||
await expectEmailUnread(page, s, false);
|
||||
await expectFolderUnread(page, { name: SHARED, shared: true }, 0);
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { unread: 0 });
|
||||
|
||||
await emailContextAction(page, s, 'ctx-mark-unread');
|
||||
await expectFolderUnread(page, { name: SHARED, shared: true }, 1);
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { unread: 1 });
|
||||
|
||||
// Owner sees the same state on the server.
|
||||
const found = await ja.findEmailBySubject(s, sharedId);
|
||||
@@ -95,17 +93,14 @@ test.describe('Shared folder actions', () => {
|
||||
await login(page, carol);
|
||||
await expandSharedFolders(page, alice.email);
|
||||
await openFolder(page, { name: SHARED, shared: true });
|
||||
await forceSync(page);
|
||||
await expectFolderTotal(page, { name: SHARED, shared: true }, 1);
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { total: 1 });
|
||||
|
||||
await emailContextAction(page, s, 'ctx-delete');
|
||||
await forceSync(page);
|
||||
|
||||
// Source shared folder drains, and the message really is in the owner's
|
||||
// Trash on the server. (Note: the shared *destination* counter — the shared
|
||||
// Trash — does NOT refresh live in the sidebar; forceSync reconciles the
|
||||
// active account only, not shared-account counters. Asserted server-side.)
|
||||
await expectFolderTotal(page, { name: SHARED, shared: true }, 0);
|
||||
// Trash on the server. (We assert the destination server-side rather than
|
||||
// the shared Trash badge to keep the check independent of sidebar layout.)
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { total: 0 });
|
||||
const trash = await ja.mailboxByRole('trash');
|
||||
expect(await ja.findEmailBySubject(s, trash!.id), 'message in owner Trash').toBeTruthy();
|
||||
});
|
||||
@@ -117,8 +112,7 @@ test.describe('Shared folder actions', () => {
|
||||
await login(page, carol);
|
||||
await expandSharedFolders(page, alice.email);
|
||||
await openFolder(page, { name: SHARED, shared: true });
|
||||
await forceSync(page);
|
||||
await expectFolderTotal(page, { name: SHARED, shared: true }, 1);
|
||||
await expectFolderCountsSynced(page, { name: SHARED, shared: true }, { total: 1 });
|
||||
|
||||
await emailContextAction(page, s, 'ctx-spam');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user