Some checks failed
CI / Unit & Component Tests (push) Has been cancelled
CI / Backend Unit Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Unit & Component Tests (pull_request) Failing after 1m36s
CI / Backend Unit Tests (pull_request) Failing after 2m36s
CI / E2E Tests (pull_request) Failing after 1h49m0s
Blockers (14): - B1: fix senderName/receiverName to use $derived instead of $state + sync $effect - B2: migrate all korrespondenz components from messages-extra shim to paraglide m.* - B3: i18n CorrespondenzEmptyState (heading, subtext, search placeholder) - B4: add response.ok checks to admin layout server load - B5: add response.ok checks to korrespondenz page server load - B6: add page.server.spec.ts with 5 test suites for korrespondenz load function - B7: add axe-core accessibility checks to all e2e korrespondenz tests - B8: add Testcontainers JPQL tests for findSinglePersonCorrespondence (DISTINCT + sender) - B9: hide auth reset-token endpoint from OpenAPI spec; remove from generated api.ts - B11: replace amber hardcoded hex colors in SinglePersonHintBar with brand tokens - B12: replace clipboard emoji with Heroicons SVG in SinglePersonHintBar - B13: create DateInput component (German dd.mm.yyyy); use it in CorrespondenzFilterControls - B14: add Paraglide compile step to CI workflow before lint/test Suggestions (11): - S1: make CorrespondentSuggestionsDropdown a pure display component; lift fetch to PersonBar - S2: fix leftover messages-extra import in ConversationTimeline; use brand tokens for status dots - S3: add intent comment to EntityNav openFlyout behavior - S4: rename canManageGroups → canManagePermissions throughout admin - S6: remove domFlush helper from DateInput spec; use expect.poll instead - S7: replace test.skip with throw new Error in bilateral e2e tests - S8: add inverse aria-disabled test for filter strip - S9: remove sm:min-h-0 from sort button to preserve 44px touch target - S10: add title attributes to tablet trigger buttons in EntityNav - S11: delete messages-extra.ts shim entirely Also: fix admin pages revealing blank strip at bottom (-mb-6 on admin layout) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
import { load } from './+layout.server';
|
|
|
|
vi.mock('$lib/api.server', () => ({ createApiClient: vi.fn() }));
|
|
|
|
import { createApiClient } from '$lib/api.server';
|
|
|
|
function mockApi(users: unknown[], groups: unknown[], tags: unknown[]) {
|
|
vi.mocked(createApiClient).mockReturnValue({
|
|
GET: vi
|
|
.fn()
|
|
.mockResolvedValueOnce({ response: { ok: true }, data: users })
|
|
.mockResolvedValueOnce({ response: { ok: true }, data: groups })
|
|
.mockResolvedValueOnce({ response: { ok: true }, data: tags })
|
|
} as ReturnType<typeof createApiClient>);
|
|
}
|
|
|
|
const adminUser = {
|
|
groups: [{ permissions: ['ADMIN', 'ADMIN_USER', 'ADMIN_TAG', 'ADMIN_PERMISSION'] }]
|
|
};
|
|
const tagAdminUser = { groups: [{ permissions: ['ADMIN_TAG'] }] };
|
|
const noPermUser = { groups: [{ permissions: ['READ_ALL'] }] };
|
|
|
|
beforeEach(() => vi.clearAllMocks());
|
|
|
|
describe('admin layout load — permission check', () => {
|
|
it('throws 403 when user has no admin permission', async () => {
|
|
await expect(
|
|
load({ fetch: vi.fn() as unknown as typeof fetch, locals: { user: noPermUser } })
|
|
).rejects.toMatchObject({ status: 403 });
|
|
});
|
|
|
|
it('throws 403 when user is undefined', async () => {
|
|
await expect(
|
|
load({ fetch: vi.fn() as unknown as typeof fetch, locals: { user: undefined } })
|
|
).rejects.toMatchObject({ status: 403 });
|
|
});
|
|
|
|
it('throws 403 when user has no groups', async () => {
|
|
await expect(
|
|
load({ fetch: vi.fn() as unknown as typeof fetch, locals: { user: { groups: [] } } })
|
|
).rejects.toMatchObject({ status: 403 });
|
|
});
|
|
|
|
it('allows access for a user with ADMIN_TAG only', async () => {
|
|
mockApi([], [], []);
|
|
await expect(
|
|
load({ fetch: vi.fn() as unknown as typeof fetch, locals: { user: tagAdminUser } })
|
|
).resolves.toBeDefined();
|
|
});
|
|
|
|
it('returns entity counts and permission flags for a full admin', async () => {
|
|
mockApi(
|
|
[{ id: 'u1' }, { id: 'u2' }],
|
|
[{ id: 'g1' }],
|
|
[{ id: 't1' }, { id: 't2' }, { id: 't3' }]
|
|
);
|
|
|
|
const result = await load({
|
|
fetch: vi.fn() as unknown as typeof fetch,
|
|
locals: { user: adminUser }
|
|
});
|
|
|
|
expect(result.userCount).toBe(2);
|
|
expect(result.groupCount).toBe(1);
|
|
expect(result.tagCount).toBe(3);
|
|
expect(result.canManageUsers).toBe(true);
|
|
expect(result.canManageTags).toBe(true);
|
|
expect(result.canManagePermissions).toBe(true);
|
|
expect(result.canRunMaintenance).toBe(true);
|
|
});
|
|
});
|