commit fe29a92f0c60e32256e08dc506d52a218ecbeb97
parent 29aeebab6909f948f82f7ed0d8ef83715b943fea
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 17 Sep 2026 13:40:53 -0400
e2e: the Advanced menu of a paused row has to take the click
One assertion in the spec that already opens Advanced: pause slow-a so its
row is dimmed, reload, open Advanced and set the first override. The click is
the proof — a later row painted over the popover fails the action with
"intercepts pointer events", which is what the stacking context on the <tr>
produced.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
1 file changed, 36 insertions(+), 0 deletions(-)
diff --git a/editor/e2e/channel-priority.spec.ts b/editor/e2e/channel-priority.spec.ts
@@ -145,6 +145,42 @@ test("the Sync only preset is paused everywhere with sync pinned back", async ({
}
});
+// THE ADVANCED MENU HAS TO ESCAPE ITS OWN ROW.
+//
+// A row is dimmed when it is excluded from the build or its base tier is
+// Paused, and the dim used to sit on the `<tr>` as `opacity-60`. Opacity below
+// 1 creates a stacking context, which confines the popover's `absolute z-30` to
+// the row: every row below it painted over the menu and ate its clicks
+// (operator report 2026-09-17). The dim is per cell now, with the Tier cell
+// left alone. The click is what proves it — Playwright hit-tests the point, so
+// a row painted on top fails the action with "intercepts pointer events".
+test("a paused row's Advanced menu draws above the rows below it", async ({
+ page,
+}) => {
+ await resetData("two-slow-channels");
+ await page.goto(ALL);
+
+ await page
+ .getByLabel("tier for slow-a", { exact: true })
+ .selectOption("paused");
+ await expect
+ .poll(async () => (await settings()).channelPriority?.channels["slow-a"])
+ .toEqual({ tier: "paused" });
+ // Reloaded, so the row renders dimmed from the server's own tier rather than
+ // from the control's optimistic state.
+ await page.reload();
+
+ await page.getByLabel("advanced priority for slow-a").click();
+ // `sync` is the first row of the popover, the part that hangs over slow-b.
+ const override = page.getByLabel("sync override for slow-a");
+ await expect(override).toBeInViewport();
+ await override.selectOption("normal");
+
+ await expect
+ .poll(async () => (await settings()).channelPriority?.channels["slow-a"])
+ .toEqual({ tier: "paused", overrides: { sync: "normal" } });
+});
+
// MOVED HERE FROM channel-sync-toggle.spec.ts, which this slice deletes with the
// control it drove. The assertion is the same one — a pool sweep skips the
// excluded channel and names it in the tooltip — restated against the tier the