test(harness): stabilize backend+frontend QA test suite (12/12+63/63 unit+integration, 45/45 frontend)

Stabilize test harness across full stack:

Backend integration tests:
- Fix Auth/Club/Migration/RLS/Member/Tenant/RLS Isolation/Shift/Task test suites
- Add AssemblyInfo.cs for test configuration
- Enhance CustomWebApplicationFactory + TestAuthHandler for stable test environment
- Expand RlsIsolationTests with comprehensive multi-tenant RLS verification

Frontend test harness:
- Align vitest.config.ts with backend API changes
- Add bunfig.toml for bun test environment stability
- Enhance api.test.ts with proper test setup integration
- Expand test/setup.ts with fixture initialization

All tests now passing: backend 12/12 unit + 63/63 integration, frontend 45/45
This commit is contained in:
WorkClub Automation
2026-03-06 09:19:32 +01:00
parent 9950185213
commit f8f3e0f01e
18 changed files with 489 additions and 428 deletions

4
frontend/bunfig.toml Normal file
View File

@@ -0,0 +1,4 @@
[test]
root = "src"
preload = ["./src/test/setup.ts"]

View File

@@ -24,7 +24,13 @@ describe('apiClient', () => {
expires: '2099-01-01',
});
(global.localStorage.getItem as any).mockReturnValue('club-1');
// Mock document.cookie with X-Tenant-Id
Object.defineProperty(document, 'cookie', {
value: 'X-Tenant-Id=club-1',
writable: true,
configurable: true,
});
(global.fetch as any).mockResolvedValue({
ok: true,
status: 200,
@@ -143,8 +149,12 @@ describe('apiClient', () => {
expect(callHeaders.Authorization).toBeUndefined();
});
it('should not add X-Tenant-Id header when no active club', async () => {
(global.localStorage.getItem as any).mockReturnValueOnce(null);
it('should not add X-Tenant-Id header when no cookie present', async () => {
Object.defineProperty(document, 'cookie', {
value: '',
writable: true,
configurable: true,
});
await apiClient('/api/test');

View File

@@ -8,5 +8,18 @@ const localStorageMock = {
clear: vi.fn(),
};
// Ensure localStorage is available on both global and globalThis
global.localStorage = localStorageMock as any;
globalThis.localStorage = localStorageMock as any;
// Ensure document is available if jsdom hasn't set it up yet
if (typeof document === 'undefined') {
Object.defineProperty(globalThis, 'document', {
value: {
body: {},
},
writable: true,
});
}

View File

@@ -8,7 +8,8 @@ export default defineConfig({
environment: 'jsdom',
globals: true,
setupFiles: ['./src/test/setup.ts'],
exclude: ['node_modules', 'dist', '.idea', '.git', '.cache', 'e2e'],
include: ['src/**/*.test.{ts,tsx}', 'src/**/__tests__/**/*.{ts,tsx}'],
exclude: ['node_modules', 'dist', '.next', 'e2e/**', 'playwright-report/**', 'test-results/**', '**/*.spec.ts'],
},
resolve: {
alias: {