import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { newFixture, type Fixture } from '../helpers/fixture.js'; let fixture: Fixture; beforeEach(async () => { vi.resetModules(); fixture = await newFixture(); process.env.IW4M_ADDRESS = 'http://iw4m.test'; process.env.IW4M_CLIENT_ID = '1'; vi.stubGlobal('fetch', vi.fn()); }); afterEach(async () => { await fixture.cleanup(); vi.unstubAllGlobals(); }); describe('loginWithToken', () => { it('returns cookie + expiry on 2xx', async () => { (globalThis.fetch as ReturnType).mockResolvedValueOnce( new Response('', { status: 200, headers: { 'Set-Cookie': '.AspNetCore.Cookies=abc; path=/; httponly' } }) ); const { loginWithToken } = await import('../../src/lib/server/integrations/iw4m.js'); const res = await loginWithToken('abcd'); expect(res.ok).toBe(true); if (res.ok) { expect(res.cookie).toContain('.AspNetCore.Cookies=abc'); expect(res.expiresAt).toBeGreaterThan(Date.now()); } }); it('returns rejected on 401', async () => { (globalThis.fetch as ReturnType).mockResolvedValueOnce(new Response('', { status: 401 })); const { loginWithToken } = await import('../../src/lib/server/integrations/iw4m.js'); const res = await loginWithToken('abcd'); expect(res.ok).toBe(false); if (!res.ok) expect(res.reason).toBe('rejected'); }); it('returns unreachable on network error', async () => { (globalThis.fetch as ReturnType).mockRejectedValueOnce(new Error('ECONNREFUSED')); const { loginWithToken } = await import('../../src/lib/server/integrations/iw4m.js'); const res = await loginWithToken('abcd'); expect(res.ok).toBe(false); if (!res.ok) expect(res.reason).toBe('unreachable'); }); }); describe('fetchStatus', () => { it('normalizes camelCase / PascalCase entries', async () => { (globalThis.fetch as ReturnType).mockResolvedValueOnce( new Response( JSON.stringify([ { id: 1, port: 3072, name: 'kino der toten', currentPlayers: 3 }, { Id: 2, Port: 3073, Name: 'ascension', CurrentPlayers: 0 } ]), { status: 200, headers: { 'Content-Type': 'application/json' } } ) ); const { fetchStatus } = await import('../../src/lib/server/integrations/iw4m.js'); const res = await fetchStatus(); expect(res.ok).toBe(true); if (res.ok) { expect(res.entries[0].currentPlayers).toBe(3); expect(res.entries[1].name).toBe('ascension'); } }); });