| import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; |
| import type { NextRequest } from 'next/server'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| vi.mock('next/headers', () => ({ |
| cookies: async () => ({ get: () => undefined }), |
| })); |
|
|
| |
| |
| vi.mock('@/lib/server-generate/singleton', () => ({ |
| taskManager: { |
| getTasksForSession: () => [], |
| getTask: () => undefined, |
| createTask: () => 'task-1', |
| }, |
| eventBus: { |
| getBuffer: () => [], |
| replayFrom: () => [], |
| addListener: vi.fn(), |
| removeListener: vi.fn(), |
| }, |
| })); |
|
|
| |
| vi.mock('@/lib/server-generate/server-orchestrator-runner', () => ({ |
| runServerGeneration: vi.fn(), |
| })); |
|
|
| function makeReq(opts: { body?: unknown; url?: string } = {}): NextRequest { |
| const controller = new AbortController(); |
| return { |
| |
| |
| cookies: { get: () => undefined }, |
| headers: new Headers(), |
| nextUrl: new URL(opts.url ?? 'http://localhost/api/server-generate'), |
| signal: controller.signal, |
| json: async () => { |
| if (opts.body === undefined) throw new Error('no body'); |
| return opts.body; |
| }, |
| } as unknown as NextRequest; |
| } |
|
|
| const ORIGINAL_DESKTOP = process.env.OSW_DESKTOP; |
|
|
| beforeEach(() => { |
| delete process.env.OSW_DESKTOP; |
| vi.clearAllMocks(); |
| }); |
| afterEach(() => { |
| if (ORIGINAL_DESKTOP === undefined) delete process.env.OSW_DESKTOP; |
| else process.env.OSW_DESKTOP = ORIGINAL_DESKTOP; |
| }); |
|
|
| describe('server-generate routes authenticate in desktop mode without a session cookie', () => { |
| it('POST /api/server-generate: 401 without desktop, not 401 with OSW_DESKTOP', async () => { |
| const { POST } = await import('../route'); |
|
|
| const denied = await POST(makeReq({ body: {} })); |
| expect(denied.status).toBe(401); |
|
|
| process.env.OSW_DESKTOP = 'true'; |
| const allowed = await POST(makeReq({ body: {} })); |
| |
| expect(allowed.status).not.toBe(401); |
| }); |
|
|
| it('GET /api/server-generate/status: 401 without desktop, 200 with OSW_DESKTOP', async () => { |
| const { GET } = await import('../status/route'); |
|
|
| const denied = await GET(makeReq({ url: 'http://localhost/api/server-generate/status' })); |
| expect(denied.status).toBe(401); |
|
|
| process.env.OSW_DESKTOP = 'true'; |
| const allowed = await GET(makeReq({ url: 'http://localhost/api/server-generate/status' })); |
| expect(allowed.status).toBe(200); |
| }); |
|
|
| |
| |
| it.each([ |
| ['cancel', () => import('../cancel/route')], |
| ['pause', () => import('../pause/route')], |
| ['resume', () => import('../resume/route')], |
| ['build-result', () => import('../build-result/route')], |
| ])('POST /api/server-generate/%s: 401 without desktop, not 401 with OSW_DESKTOP', async (_name, load) => { |
| const { POST } = await load(); |
|
|
| const denied = await POST(makeReq()); |
| expect(denied.status).toBe(401); |
|
|
| process.env.OSW_DESKTOP = 'true'; |
| const allowed = await POST(makeReq()); |
| expect(allowed.status).not.toBe(401); |
| }); |
|
|
| it('GET /api/server-generate/events: 401 without desktop, streams (200) with OSW_DESKTOP', async () => { |
| const { GET } = await import('../events/route'); |
|
|
| const denied = await GET(makeReq({ url: 'http://localhost/api/server-generate/events' })); |
| expect(denied.status).toBe(401); |
|
|
| |
| vi.useFakeTimers(); |
| try { |
| process.env.OSW_DESKTOP = 'true'; |
| const allowed = await GET(makeReq({ url: 'http://localhost/api/server-generate/events' })); |
| expect(allowed.status).toBe(200); |
| } finally { |
| vi.clearAllTimers(); |
| vi.useRealTimers(); |
| } |
| }); |
| }); |
|
|