import { describe, test, expect, vi } from 'vitest'; import { DELETE, GET, HEAD } from '../src/routes/api/list/[vorgang]/+server'; import { getCrimesListByToken, vorgangNameExists, deleteVorgangByToken } from '$lib/server/vorgangService'; import { client } from '$lib/minio'; import { EventEmitter } from 'events'; // Mocks vi.mock('$lib/server/vorgangService', () => ({ getCrimesListByToken: vi.fn(), vorgangNameExists: vi.fn(), deleteVorgangByToken: vi.fn() })); vi.mock('$lib/minio', () => ({ client: { listObjects: vi.fn(), removeObjects: vi.fn() } })); const MockEvent = { params: { vorgang: '123' }, locals: { user: { id: 'admin', admin: true } } }; describe('API-Endpoints: list/[vorgang]', () => { test('Unerlaubter Zugriff', async () => { const event = { locals: { user: null } }; const response = await GET(event); expect(response.status).toBe(401); const json = await response.json(); const errorObj = { error: 'Unauthorized' }; expect(json).toEqual(errorObj); }); test('Vorgang ohne Tatorte', async () => { const testCrimesList = []; vi.mocked(getCrimesListByToken).mockReturnValueOnce(testCrimesList); const response = await GET(MockEvent); expect(response.status).toBe(200); const json = await response.json(); expect(json).toEqual(testCrimesList); }); test('Vorgang mit Tatorte', async () => { const testCrimesList = [ { name: 'model-A', lastModified: '2025-08-28T09:44:12.453Z', etag: '558f35716f6af953f9bb5d75f6d77e6a', size: 8947140, prefix: '7596e4d5-c51f-482d-a4aa-ff76434305fc', show_button: true }, { name: 'model-z', lastModified: '2025-08-28T10:37:20.142Z', etag: '43e3989c32c4682bee407baaf83b6fa0', size: 35788560, prefix: '7596e4d5-c51f-482d-a4aa-ff76434305fc', show_button: true } ]; vi.mocked(getCrimesListByToken).mockReturnValueOnce(testCrimesList); const response = await GET(MockEvent); expect(response.status).toBe(200); const json = await response.json(); expect(json).toEqual(testCrimesList); }); test('Vorgang existiert via HEAD', async () => { const vorgangExists = true; vi.mocked(vorgangNameExists).mockReturnValueOnce(vorgangExists); const response = await HEAD(MockEvent); expect(response.status).toBe(200); const textContent = await response.text(); expect(textContent).toEqual(''); }); test('Vorgang existiert nicht via HEAD', async () => { const vorgangExists = false; vi.mocked(vorgangNameExists).mockReturnValueOnce(vorgangExists); const response = await HEAD(MockEvent); expect(response.status).toBe(404); const textContent = await response.text(); expect(textContent).toEqual(''); }); test('Lösche Vorgang und dazugehörige S3 Objekte', async () => { // Mock data const fakeStream = new EventEmitter(); vi.mocked(client.listObjects).mockReturnValue(fakeStream); vi.mocked(client.removeObjects).mockResolvedValue(undefined); vi.mocked(deleteVorgangByToken).mockReturnValueOnce(undefined); const responsePromise = DELETE(MockEvent); const fakeCrimeNames = [ `${MockEvent.params.vorgang}/file1.glb`, `${MockEvent.params.vorgang}/file2.glb` ]; // simulate data stream fakeStream.emit('data', { name: fakeCrimeNames[0] }); fakeStream.emit('data', { name: fakeCrimeNames[1] }); fakeStream.emit('end'); const response = await responsePromise; expect(client.removeObjects).toHaveBeenCalledWith('tatort', fakeCrimeNames); expect(deleteVorgangByToken).toHaveBeenCalledWith(MockEvent.params.vorgang); expect(response.status).toBe(204); }); });