7a0da7932b
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Has been cancelled
Docker Tests (Consolidated) / Accessibility Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Unit Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Example Tests (push) Has been cancelled
Docker Tests (Consolidated) / Production Image Smoke Test (push) Has been cancelled
Docker Tests (Consolidated) / Infrastructure Tests (push) Has been cancelled
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Has been cancelled
Backwards Compatibility / Verify Encryption Constants (push) Has been cancelled
Backwards Compatibility / PyPI Version Compatibility (push) Has been cancelled
Backwards Compatibility / Database Migration Tests (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Docker Tests (Consolidated) / detect-changes (push) Has been cancelled
Docker Tests (Consolidated) / Build Test Image (push) Has been cancelled
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Has been cancelled
73 lines
2.7 KiB
JavaScript
73 lines
2.7 KiB
JavaScript
/**
|
|
* Tests for the #4431 fix: Socket.IO connects lazily on /chat/.
|
|
*
|
|
* The chat page must NOT open a Socket.IO connection on page load — that
|
|
* per-navigation connect/disconnect churn freezes the werkzeug dev server.
|
|
* Other realtime pages keep their eager auto-connect.
|
|
*
|
|
* We drive the module's auto-init (a setTimeout scheduled at import time)
|
|
* with fake timers and assert whether io() — the connection factory — was
|
|
* called, per page path. resetModules + dynamic import gives each case a
|
|
* fresh evaluation of the IIFE with its own window.location.pathname.
|
|
*/
|
|
import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest';
|
|
|
|
function setupEnv(pathname) {
|
|
vi.resetModules();
|
|
Object.defineProperty(window, 'location', {
|
|
configurable: true,
|
|
value: { pathname, protocol: 'http:', host: 'localhost' },
|
|
});
|
|
const io = vi.fn(() => ({
|
|
on: vi.fn(),
|
|
emit: vi.fn(),
|
|
off: vi.fn(),
|
|
connected: false,
|
|
}));
|
|
globalThis.io = io;
|
|
window.api = { getResearchStatus: vi.fn(), getCsrfToken: () => '' };
|
|
window.ResearchStates = { isTerminal: () => false, logLevel: () => 'info' };
|
|
return io;
|
|
}
|
|
|
|
describe('Socket.IO auto-connect gating (#4431)', () => {
|
|
beforeEach(() => vi.useFakeTimers());
|
|
afterEach(() => {
|
|
vi.useRealTimers();
|
|
delete globalThis.io;
|
|
});
|
|
|
|
it('does NOT auto-connect on a /chat/ page (lazy)', async () => {
|
|
const io = setupEnv('/chat/some-session-id');
|
|
await import('@js/services/socket.js');
|
|
// Fire the auto-init setTimeout(…, 100) scheduled at import.
|
|
vi.advanceTimersByTime(300);
|
|
expect(io).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('DOES auto-connect on a /progress/ page (eager, unchanged)', async () => {
|
|
const io = setupEnv('/progress/abc-123');
|
|
await import('@js/services/socket.js');
|
|
vi.advanceTimersByTime(300);
|
|
expect(io).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('DOES auto-connect on a /research page (eager, unchanged)', async () => {
|
|
const io = setupEnv('/research');
|
|
await import('@js/services/socket.js');
|
|
vi.advanceTimersByTime(300);
|
|
expect(io).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('still connects lazily on /chat/ when a research is subscribed', async () => {
|
|
const io = setupEnv('/chat/some-session-id');
|
|
await import('@js/services/socket.js');
|
|
vi.advanceTimersByTime(300);
|
|
expect(io).not.toHaveBeenCalled(); // confirmed lazy at load
|
|
|
|
// Subscribing to a research must initialize the socket on demand.
|
|
window.socket.subscribeToResearch('research-1', () => {});
|
|
expect(io).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|