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:
@@ -5,16 +5,30 @@
|
||||
import { test, expect } from '../../fixtures/test';
|
||||
|
||||
test.describe('Browser chaos — multi-tab', () => {
|
||||
test('same user in two tabs — SSE delivers to both', async ({ page, context, guest, signIn }) => {
|
||||
test('same user in two tabs — each tab establishes its own SSE stream', async ({ page, context, guest, signIn }) => {
|
||||
const g = await guest('Twin');
|
||||
await signIn(page, g);
|
||||
await page.goto('/feed');
|
||||
|
||||
// Count each tab's own EventSource open (GET /api/v1/stream?ticket=…). Asserting
|
||||
// *connection establishment* is fast and reliable; asserting event *delivery* would
|
||||
// depend on the reverse proxy's ~30s SSE buffering and isn't worth the flake here.
|
||||
const streamOpens = (p: import('@playwright/test').Page) => {
|
||||
let n = 0;
|
||||
p.on('request', (req) => {
|
||||
if (req.method() === 'GET' && req.url().includes('/api/v1/stream?')) n++;
|
||||
});
|
||||
return () => n;
|
||||
};
|
||||
|
||||
const opens1 = streamOpens(page);
|
||||
await signIn(page, g); // → /feed, connectSse() on mount
|
||||
await expect.poll(opens1, { timeout: 10_000 }).toBeGreaterThanOrEqual(1);
|
||||
|
||||
const tab2 = await context.newPage();
|
||||
const opens2 = streamOpens(tab2);
|
||||
await signIn(tab2, g);
|
||||
await tab2.goto('/feed');
|
||||
await expect.poll(opens2, { timeout: 10_000 }).toBeGreaterThanOrEqual(1);
|
||||
|
||||
// Both tabs should mount the bottom nav.
|
||||
// Both tabs mounted and each opened its own independent stream.
|
||||
await expect(page.getByRole('link', { name: 'Galerie' })).toBeVisible();
|
||||
await expect(tab2.getByRole('link', { name: 'Galerie' })).toBeVisible();
|
||||
await tab2.close();
|
||||
|
||||
Reference in New Issue
Block a user