feat(themen): add /themen server load function + tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
12
frontend/src/routes/themen/+page.server.ts
Normal file
12
frontend/src/routes/themen/+page.server.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { error } from '@sveltejs/kit';
|
||||||
|
import { createApiClient } from '$lib/shared/api.server';
|
||||||
|
import type { components } from '$lib/generated/api';
|
||||||
|
|
||||||
|
type TagTreeNodeDTO = components['schemas']['TagTreeNodeDTO'];
|
||||||
|
|
||||||
|
export async function load({ fetch }: Parameters<import('./$types').PageServerLoad>[0]) {
|
||||||
|
const api = createApiClient(fetch);
|
||||||
|
const result = await api.GET('/api/tags/tree');
|
||||||
|
if (!result.response.ok) throw error(500, 'Themen konnten nicht geladen werden.');
|
||||||
|
return { tree: (result.data ?? []) as TagTreeNodeDTO[] };
|
||||||
|
}
|
||||||
60
frontend/src/routes/themen/page.server.spec.ts
Normal file
60
frontend/src/routes/themen/page.server.spec.ts
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
||||||
|
|
||||||
|
vi.mock('$lib/shared/api.server', () => ({
|
||||||
|
createApiClient: vi.fn(),
|
||||||
|
extractErrorCode: (e: unknown) => (e as { code?: string } | undefined)?.code
|
||||||
|
}));
|
||||||
|
|
||||||
|
import { createApiClient } from '$lib/shared/api.server';
|
||||||
|
|
||||||
|
beforeEach(() => vi.clearAllMocks());
|
||||||
|
|
||||||
|
function mockApiGet(ok: boolean, data: unknown) {
|
||||||
|
vi.mocked(createApiClient).mockReturnValue({
|
||||||
|
GET: vi.fn().mockResolvedValue({ response: { ok }, data })
|
||||||
|
} as ReturnType<typeof createApiClient>);
|
||||||
|
}
|
||||||
|
|
||||||
|
const makeTag = (name: string, documentCount = 0) => ({
|
||||||
|
id: 'id-' + name,
|
||||||
|
name,
|
||||||
|
documentCount,
|
||||||
|
children: []
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('/themen +page.server load', () => {
|
||||||
|
function makeLoadEvent() {
|
||||||
|
return {
|
||||||
|
fetch: vi.fn() as unknown as typeof fetch,
|
||||||
|
request: new Request('http://localhost/themen'),
|
||||||
|
url: new URL('http://localhost/themen')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
it('returns tag tree when API succeeds', async () => {
|
||||||
|
const tree = [makeTag('Briefe', 5), makeTag('Fotos', 3)];
|
||||||
|
mockApiGet(true, tree);
|
||||||
|
|
||||||
|
const { load } = await import('./+page.server');
|
||||||
|
const result = await load(makeLoadEvent());
|
||||||
|
|
||||||
|
expect(result.tree).toEqual(tree);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns empty array when API returns empty list', async () => {
|
||||||
|
mockApiGet(true, []);
|
||||||
|
|
||||||
|
const { load } = await import('./+page.server');
|
||||||
|
const result = await load(makeLoadEvent());
|
||||||
|
|
||||||
|
expect(result.tree).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws 500 when API call fails', async () => {
|
||||||
|
mockApiGet(false, null);
|
||||||
|
|
||||||
|
const { load } = await import('./+page.server');
|
||||||
|
|
||||||
|
await expect(load(makeLoadEvent())).rejects.toMatchObject({ status: 500 });
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user