Skip to content

Commit 8b681fc

Browse files
authored
Merge pull request #158 from Zindiks/claude/add-client-tests-01DQzeyMWoAx2nZA8UNeCy6C
Add tests for Client class
2 parents d258344 + bdd7647 commit 8b681fc

22 files changed

+14719
-3241
lines changed

client/docs/client-testing/MASTER-PLAN.md

Lines changed: 1186 additions & 0 deletions
Large diffs are not rendered by default.

client/docs/client-testing/PHASE-OVERVIEW.md

Lines changed: 424 additions & 0 deletions
Large diffs are not rendered by default.

client/docs/client-testing/phase-1-done.md

Lines changed: 418 additions & 0 deletions
Large diffs are not rendered by default.

client/docs/client-testing/phase-2.md

Lines changed: 422 additions & 0 deletions
Large diffs are not rendered by default.

client/package-lock.json

Lines changed: 8171 additions & 3093 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

client/package.json

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
"dev": "vite",
88
"build": "tsc -b && vite build",
99
"lint": "eslint .",
10-
"preview": "vite preview"
10+
"preview": "vite preview",
11+
"test": "vitest",
12+
"test:ui": "vitest --ui",
13+
"test:coverage": "vitest --coverage"
1114
},
1215
"dependencies": {
1316
"@hello-pangea/dnd": "^17.0.0",
@@ -46,21 +49,30 @@
4649
},
4750
"devDependencies": {
4851
"@eslint/js": "^9.15.0",
52+
"@faker-js/faker": "^8.4.1",
53+
"@testing-library/jest-dom": "^6.9.1",
54+
"@testing-library/react": "^14.3.1",
55+
"@testing-library/user-event": "^14.6.1",
4956
"@types/luxon": "^3.7.1",
5057
"@types/node": "^22.10.2",
5158
"@types/react": "^18.3.12",
5259
"@types/react-big-calendar": "^1.16.3",
5360
"@types/react-dom": "^18.3.1",
5461
"@vitejs/plugin-react-swc": "^3.5.0",
62+
"@vitest/coverage-v8": "^1.6.1",
63+
"@vitest/ui": "^1.6.1",
5564
"autoprefixer": "^10.4.20",
5665
"eslint": "^9.15.0",
5766
"eslint-plugin-react-hooks": "^5.0.0",
5867
"eslint-plugin-react-refresh": "^0.4.14",
5968
"globals": "^15.12.0",
69+
"jsdom": "^23.2.0",
70+
"msw": "^2.12.2",
6071
"postcss": "^8.4.49",
6172
"tailwindcss": "^3.4.16",
6273
"typescript": "~5.6.2",
6374
"typescript-eslint": "^8.15.0",
64-
"vite": "^6.0.11"
75+
"vite": "^6.0.11",
76+
"vitest": "^1.6.1"
6577
}
6678
}

client/src/__tests__/setup.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import '@testing-library/jest-dom';
2+
import { cleanup } from '@testing-library/react';
3+
import { afterEach, afterAll, beforeAll, vi } from 'vitest';
4+
import { setupServer } from 'msw/node';
5+
import { handlers } from './utils/server-handlers';
6+
7+
// Setup MSW server for API mocking
8+
export const server = setupServer(...handlers);
9+
10+
// Start server before all tests
11+
beforeAll(() => {
12+
server.listen({ onUnhandledRequest: 'warn' });
13+
});
14+
15+
// Cleanup after each test
16+
afterEach(() => {
17+
cleanup();
18+
server.resetHandlers();
19+
});
20+
21+
// Close server after all tests
22+
afterAll(() => {
23+
server.close();
24+
});
25+
26+
// Mock window.matchMedia
27+
Object.defineProperty(window, 'matchMedia', {
28+
writable: true,
29+
value: vi.fn().mockImplementation((query) => ({
30+
matches: false,
31+
media: query,
32+
onchange: null,
33+
addListener: vi.fn(),
34+
removeListener: vi.fn(),
35+
addEventListener: vi.fn(),
36+
removeEventListener: vi.fn(),
37+
dispatchEvent: vi.fn(),
38+
})),
39+
});
40+
41+
// Mock IntersectionObserver
42+
global.IntersectionObserver = class IntersectionObserver {
43+
constructor() {}
44+
disconnect() {}
45+
observe() {}
46+
takeRecords() {
47+
return [];
48+
}
49+
unobserve() {}
50+
} as any;
51+
52+
// Mock ResizeObserver
53+
global.ResizeObserver = class ResizeObserver {
54+
constructor() {}
55+
disconnect() {}
56+
observe() {}
57+
unobserve() {}
58+
} as any;
59+
60+
// Mock localStorage
61+
const localStorageMock = (() => {
62+
let store: Record<string, string> = {};
63+
64+
return {
65+
getItem: (key: string) => store[key] || null,
66+
setItem: (key: string, value: string) => {
67+
store[key] = value.toString();
68+
},
69+
removeItem: (key: string) => {
70+
delete store[key];
71+
},
72+
clear: () => {
73+
store = {};
74+
},
75+
};
76+
})();
77+
78+
Object.defineProperty(window, 'localStorage', {
79+
value: localStorageMock,
80+
});

0 commit comments

Comments
 (0)