test(e2e): make vacuous feed/SSE tests assert real behavior

Several tests ran green while asserting nothing. Replace them with real
assertions, and fix the SSE helper they depend on.

sse-listener: exchange the JWT for a single-use ticket (POST /stream/ticket) and
connect via ?ticket= — the helper still used the dead ?token= scheme, so every
SSE-based assertion would have silently failed to receive events.

like-comment:
- "like is idempotent" asserted nothing (void feed; void b) → now seeds a real
  upload and pins the like contract: counted once per user, toggles off on repeat
  (guards double-count), and a second user's like is counted independently.
- "comment → SSE to B" asserted length >= 0 (always true) → B now subscribes to
  the stream, A comments, and B must receive the new-comment event for that upload
  (comment_count === 1). ~30s due to reverse-proxy SSE buffering; timeout raised.

sse-realtime: only checked a nav link was visible → now counts EventSource opens
and asserts a fresh stream connection after hidden→visible (also fixes the sim,
which set visibilityState but not document.hidden, so the close never fired).

multi-tab "SSE delivers to both": only checked nav links → now asserts each tab
opens its own stream connection (delivery isn't asserted — it hinges on the ~30s
proxy buffering; connection establishment is the reliable, honest signal).

safe-area: delete the /join probe whose only assertion was Array.isArray(x) ===
true (always true); the real sheet-level env() check already exists below it.

All verified green against the live backend.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
fabi
2026-07-01 19:05:53 +02:00
parent d4aa7b4932
commit 136417d6b4
5 changed files with 155 additions and 54 deletions

View File

@@ -45,20 +45,8 @@ test.describe('Mobile — safe-area insets', () => {
expect(distanceFromBottom).toBeLessThanOrEqual(2);
});
test('context sheet (when opened) carries the same safe-area declaration', async ({ page }) => {
// We can't easily open the context sheet without a feed card to long-press,
// but the markup lives in the layout once the route mounts. We probe by
// scanning every element with a `style` attribute for the env() reference.
await page.goto('/join');
const candidateStyles: string[] = await page.evaluate(() => {
return Array.from(document.querySelectorAll<HTMLElement>('[style]'))
.map((el) => el.getAttribute('style') ?? '')
.filter((s) => s.includes('env(safe-area-inset-bottom)'));
});
// On /join there may be zero — the assertion is more of a sanity check.
// On /feed and /account it would be ≥ 1. We assert that on /feed below.
expect(Array.isArray(candidateStyles)).toBe(true);
});
// (A vacuous `/join` probe that only asserted `Array.isArray(...)` — always true —
// was removed; the real sheet-level env() check is the structural test below.)
test('upload sheet and context sheet both honor env() (structural check)', async ({ page, guest, signIn }) => {
const g = await guest('SafeAreaSheets');