import { describe, it, expect, vi, beforeEach } from 'vitest' import { NextResponse } from 'next/server' import { createMockRequest, parseJsonResponse, createQueuedMockSupabase } from '@/tests/helpers' const { supabase, enqueue, reset } = createQueuedMockSupabase() const requireAuthMock = vi.fn() vi.mock('@/lib/auth/require-auth', () => ({ requireAuth: (...args: unknown[]) => requireAuthMock(...args), })) vi.mock('@/lib/company/context', () => ({ getActiveCompanyId: vi.fn().mockResolvedValue('company-1'), requireCompanyId: vi.fn().mockResolvedValue('company-1'), })) const requireWriteMock = vi.fn() vi.mock('@/lib/auth/require-write', () => ({ requireWritePermission: (...args: unknown[]) => requireWriteMock(...args), })) import { POST } from '../route' describe('POST /api/settings/oauth-clients', () => { beforeEach(() => { vi.clearAllMocks() reset() requireAuthMock.mockResolvedValue({ user: { id: 'user-1' }, supabase, error: null }) requireWriteMock.mockResolvedValue({ ok: true }) }) it('returns 401 when not authenticated', async () => { requireAuthMock.mockResolvedValue({ user: null, supabase, error: NextResponse.json({ error: 'Unauthorized' }, { status: 401 }), }) const request = createMockRequest('/api/settings/oauth-clients', { method: 'POST', body: { client_name: 'My App', redirect_uri: 'https://app.example.com/cb' }, }) const response = await POST(request, { params: Promise.resolve({}) }) const { status } = await parseJsonResponse(response) expect(status).toBe(401) }) it('returns 403 for a viewer without write permission', async () => { requireWriteMock.mockResolvedValue({ ok: false, response: NextResponse.json({ error: 'Forbidden' }, { status: 403 }), }) const request = createMockRequest('/api/settings/oauth-clients', { method: 'POST', body: { client_name: 'My App', redirect_uri: 'https://app.example.com/cb' }, }) const response = await POST(request, { params: Promise.resolve({}) }) const { status } = await parseJsonResponse(response) expect(status).toBe(403) }) it('registers a redirect uri scoped to the current user on the happy path', async () => { enqueue({ data: { id: 'reg-1', client_name: 'My App', redirect_uri: 'https://app.example.com/cb', created_at: '2026-01-01T00:00:00Z', }, }) const request = createMockRequest('/api/settings/oauth-clients', { method: 'POST', body: { client_name: 'My App', redirect_uri: 'https://app.example.com/cb' }, }) const response = await POST(request, { params: Promise.resolve({}) }) const { status, body } = await parseJsonResponse<{ data: { id: string } }>(response) expect(status).toBe(200) expect(body.data.id).toBe('reg-1') }) })