@smicolon/ai-kit 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +73 -40
  2. package/dist/index.js +260 -126
  3. package/package.json +5 -5
  4. package/.claude-plugin/marketplace.json +0 -373
  5. package/packs/architect/CHANGELOG.md +0 -17
  6. package/packs/architect/README.md +0 -58
  7. package/packs/architect/agents/system-architect.md +0 -768
  8. package/packs/architect/commands/diagram-create.md +0 -300
  9. package/packs/better-auth/.mcp.json +0 -14
  10. package/packs/better-auth/CHANGELOG.md +0 -26
  11. package/packs/better-auth/README.md +0 -125
  12. package/packs/better-auth/agents/auth-architect.md +0 -278
  13. package/packs/better-auth/commands/auth-provider-add.md +0 -265
  14. package/packs/better-auth/commands/auth-setup.md +0 -298
  15. package/packs/better-auth/skills/auth-security/SKILL.md +0 -425
  16. package/packs/better-auth/skills/better-auth-patterns/SKILL.md +0 -455
  17. package/packs/dev-loop/CHANGELOG.md +0 -69
  18. package/packs/dev-loop/README.md +0 -155
  19. package/packs/dev-loop/commands/cancel-dev.md +0 -21
  20. package/packs/dev-loop/commands/dev-loop.md +0 -72
  21. package/packs/dev-loop/commands/dev-plan.md +0 -351
  22. package/packs/dev-loop/hooks/hooks.json +0 -15
  23. package/packs/dev-loop/hooks/stop-hook.sh +0 -178
  24. package/packs/dev-loop/scripts/setup-dev-loop.sh +0 -194
  25. package/packs/dev-loop/skills/tdd-planner/SKILL.md +0 -249
  26. package/packs/dev-loop/skills/tdd-planner/references/framework-patterns.md +0 -874
  27. package/packs/dev-loop/skills/tdd-planner/references/good-example.md +0 -260
  28. package/packs/dev-loop/skills/tdd-planner/references/plan-template.md +0 -275
  29. package/packs/django/CHANGELOG.md +0 -39
  30. package/packs/django/README.md +0 -92
  31. package/packs/django/agents/django-architect.md +0 -182
  32. package/packs/django/agents/django-builder.md +0 -250
  33. package/packs/django/agents/django-feature-based.md +0 -420
  34. package/packs/django/agents/django-reviewer.md +0 -253
  35. package/packs/django/agents/django-tester.md +0 -230
  36. package/packs/django/commands/api-endpoint.md +0 -285
  37. package/packs/django/commands/model-create.md +0 -178
  38. package/packs/django/commands/test-generate.md +0 -325
  39. package/packs/django/rules/migrations.md +0 -138
  40. package/packs/django/rules/models.md +0 -167
  41. package/packs/django/rules/serializers.md +0 -126
  42. package/packs/django/rules/services.md +0 -131
  43. package/packs/django/rules/tests.md +0 -140
  44. package/packs/django/rules/views.md +0 -102
  45. package/packs/django/skills/import-convention-enforcer/SKILL.md +0 -226
  46. package/packs/django/skills/import-convention-enforcer/patterns/django-imports.md +0 -343
  47. package/packs/django/skills/migration-safety-checker/SKILL.md +0 -375
  48. package/packs/django/skills/model-entity-validator/SKILL.md +0 -298
  49. package/packs/django/skills/performance-optimizer/SKILL.md +0 -447
  50. package/packs/django/skills/red-phase-verifier/SKILL.md +0 -180
  51. package/packs/django/skills/security-first-validator/SKILL.md +0 -435
  52. package/packs/django/skills/test-coverage-advisor/SKILL.md +0 -394
  53. package/packs/django/skills/test-validity-checker/SKILL.md +0 -194
  54. package/packs/failure-log/CHANGELOG.md +0 -20
  55. package/packs/failure-log/README.md +0 -168
  56. package/packs/failure-log/commands/failure-add.md +0 -106
  57. package/packs/failure-log/commands/failure-list.md +0 -89
  58. package/packs/failure-log/hooks/hooks.json +0 -16
  59. package/packs/failure-log/hooks/scripts/inject-failures.sh +0 -64
  60. package/packs/failure-log/skills/failure-log-manager/SKILL.md +0 -164
  61. package/packs/flutter/CHANGELOG.md +0 -19
  62. package/packs/flutter/README.md +0 -170
  63. package/packs/flutter/agents/flutter-architect.md +0 -166
  64. package/packs/flutter/agents/flutter-builder.md +0 -303
  65. package/packs/flutter/agents/release-manager.md +0 -355
  66. package/packs/flutter/commands/fastlane-setup.md +0 -188
  67. package/packs/flutter/commands/flutter-build.md +0 -90
  68. package/packs/flutter/commands/flutter-deploy.md +0 -133
  69. package/packs/flutter/commands/flutter-test.md +0 -117
  70. package/packs/flutter/commands/signing-setup.md +0 -209
  71. package/packs/flutter/hooks/hooks.json +0 -17
  72. package/packs/flutter/skills/fastlane-knowledge/SKILL.md +0 -193
  73. package/packs/flutter/skills/flutter-architecture/SKILL.md +0 -127
  74. package/packs/flutter/skills/store-publishing/SKILL.md +0 -163
  75. package/packs/hono/CHANGELOG.md +0 -19
  76. package/packs/hono/README.md +0 -143
  77. package/packs/hono/agents/hono-architect.md +0 -240
  78. package/packs/hono/agents/hono-builder.md +0 -285
  79. package/packs/hono/agents/hono-reviewer.md +0 -279
  80. package/packs/hono/agents/hono-tester.md +0 -346
  81. package/packs/hono/commands/middleware-create.md +0 -223
  82. package/packs/hono/commands/project-init.md +0 -306
  83. package/packs/hono/commands/route-create.md +0 -153
  84. package/packs/hono/commands/rpc-client.md +0 -263
  85. package/packs/hono/hooks/hooks.json +0 -4
  86. package/packs/hono/skills/cloudflare-bindings/SKILL.md +0 -408
  87. package/packs/hono/skills/hono-patterns/SKILL.md +0 -309
  88. package/packs/hono/skills/rpc-typesafe/SKILL.md +0 -388
  89. package/packs/hono/skills/zod-validation/SKILL.md +0 -332
  90. package/packs/nestjs/CHANGELOG.md +0 -29
  91. package/packs/nestjs/README.md +0 -75
  92. package/packs/nestjs/agents/nestjs-architect.md +0 -402
  93. package/packs/nestjs/agents/nestjs-builder.md +0 -301
  94. package/packs/nestjs/agents/nestjs-tester.md +0 -437
  95. package/packs/nestjs/commands/module-create.md +0 -369
  96. package/packs/nestjs/rules/controllers.md +0 -92
  97. package/packs/nestjs/rules/dto.md +0 -124
  98. package/packs/nestjs/rules/entities.md +0 -102
  99. package/packs/nestjs/rules/services.md +0 -106
  100. package/packs/nestjs/skills/barrel-export-manager/SKILL.md +0 -389
  101. package/packs/nestjs/skills/import-convention-enforcer/SKILL.md +0 -365
  102. package/packs/nextjs/CHANGELOG.md +0 -36
  103. package/packs/nextjs/README.md +0 -76
  104. package/packs/nextjs/agents/frontend-tester.md +0 -680
  105. package/packs/nextjs/agents/frontend-visual.md +0 -820
  106. package/packs/nextjs/agents/nextjs-architect.md +0 -331
  107. package/packs/nextjs/agents/nextjs-modular.md +0 -433
  108. package/packs/nextjs/commands/component-create.md +0 -398
  109. package/packs/nextjs/rules/api-routes.md +0 -129
  110. package/packs/nextjs/rules/components.md +0 -106
  111. package/packs/nextjs/rules/hooks.md +0 -132
  112. package/packs/nextjs/skills/accessibility-validator/SKILL.md +0 -445
  113. package/packs/nextjs/skills/import-convention-enforcer/SKILL.md +0 -399
  114. package/packs/nextjs/skills/react-form-validator/SKILL.md +0 -569
  115. package/packs/nuxtjs/CHANGELOG.md +0 -30
  116. package/packs/nuxtjs/README.md +0 -56
  117. package/packs/nuxtjs/agents/frontend-tester.md +0 -680
  118. package/packs/nuxtjs/agents/frontend-visual.md +0 -820
  119. package/packs/nuxtjs/agents/nuxtjs-architect.md +0 -537
  120. package/packs/nuxtjs/commands/component-create.md +0 -223
  121. package/packs/nuxtjs/rules/components.md +0 -101
  122. package/packs/nuxtjs/rules/composables.md +0 -118
  123. package/packs/nuxtjs/rules/server-routes.md +0 -127
  124. package/packs/nuxtjs/skills/accessibility-validator/SKILL.md +0 -183
  125. package/packs/nuxtjs/skills/import-convention-enforcer/SKILL.md +0 -196
  126. package/packs/nuxtjs/skills/veevalidate-form-validator/SKILL.md +0 -190
  127. package/packs/onboard/CHANGELOG.md +0 -22
  128. package/packs/onboard/README.md +0 -103
  129. package/packs/onboard/agents/onboard-guide.md +0 -118
  130. package/packs/onboard/commands/onboard.md +0 -313
  131. package/packs/onboard/skills/onboard-context-provider/SKILL.md +0 -98
  132. package/packs/tanstack-router/CHANGELOG.md +0 -30
  133. package/packs/tanstack-router/README.md +0 -113
  134. package/packs/tanstack-router/agents/tanstack-architect.md +0 -173
  135. package/packs/tanstack-router/agents/tanstack-builder.md +0 -360
  136. package/packs/tanstack-router/agents/tanstack-tester.md +0 -454
  137. package/packs/tanstack-router/commands/form-create.md +0 -313
  138. package/packs/tanstack-router/commands/query-create.md +0 -263
  139. package/packs/tanstack-router/commands/route-create.md +0 -190
  140. package/packs/tanstack-router/commands/table-create.md +0 -413
  141. package/packs/tanstack-router/skills/ai-patterns/SKILL.md +0 -370
  142. package/packs/tanstack-router/skills/db-patterns/SKILL.md +0 -346
  143. package/packs/tanstack-router/skills/devtools-patterns/SKILL.md +0 -415
  144. package/packs/tanstack-router/skills/form-patterns/SKILL.md +0 -425
  145. package/packs/tanstack-router/skills/pacer-patterns/SKILL.md +0 -341
  146. package/packs/tanstack-router/skills/query-patterns/SKILL.md +0 -359
  147. package/packs/tanstack-router/skills/router-patterns/SKILL.md +0 -285
  148. package/packs/tanstack-router/skills/store-patterns/SKILL.md +0 -351
  149. package/packs/tanstack-router/skills/table-patterns/SKILL.md +0 -531
  150. package/packs/tanstack-router/skills/tanstack-conventions/SKILL.md +0 -428
  151. package/packs/tanstack-router/skills/virtual-patterns/SKILL.md +0 -490
  152. package/packs/worktree/CHANGELOG.md +0 -45
  153. package/packs/worktree/README.md +0 -219
  154. package/packs/worktree/commands/wt.md +0 -93
  155. package/packs/worktree/scripts/wt.sh +0 -957
  156. package/packs/worktree/skills/worktree-manager/SKILL.md +0 -113
@@ -1,454 +0,0 @@
1
- ---
2
- description: >-
3
- Testing expert for TanStack React applications covering unit, integration, and component tests with Vitest, Testing Library, and MSW. Use for writing tests, test architecture, and coverage improvement.
4
- tools: ["Read", "Glob", "Grep", "Write", "Edit", "Bash", "Task", "TodoWrite"]
5
- ---
6
-
7
- # TanStack Tester
8
-
9
- You are a testing expert specializing in TanStack React applications. Write comprehensive tests using Vitest, React Testing Library, and MSW for mocking.
10
-
11
- ## Testing Stack
12
-
13
- - **Vitest** - Test runner (Bun compatible)
14
- - **React Testing Library** - Component testing
15
- - **MSW** - API mocking
16
- - **@tanstack/react-query** - Query testing utilities
17
- - **user-event** - User interaction simulation
18
-
19
- ## Test File Structure
20
-
21
- ```
22
- src/
23
- ├── features/
24
- │ └── posts/
25
- │ ├── components/
26
- │ │ ├── PostList.tsx
27
- │ │ └── __tests__/
28
- │ │ └── PostList.test.tsx
29
- │ ├── hooks/
30
- │ │ ├── useCreatePost.ts
31
- │ │ └── __tests__/
32
- │ │ └── useCreatePost.test.tsx
33
- │ └── queries/
34
- │ ├── postQueries.ts
35
- │ └── __tests__/
36
- │ └── postQueries.test.ts
37
- ├── routes/
38
- │ ├── posts.$postId.tsx
39
- │ └── __tests__/
40
- │ └── posts.$postId.test.tsx
41
- └── test/
42
- ├── setup.ts # Global test setup
43
- ├── mocks/
44
- │ ├── handlers.ts # MSW handlers
45
- │ └── server.ts # MSW server
46
- └── utils/
47
- ├── test-utils.tsx # Custom render with providers
48
- └── factories.ts # Test data factories
49
- ```
50
-
51
- ## Test Setup
52
-
53
- ### vitest.config.ts
54
- ```typescript
55
- import { defineConfig } from 'vitest/config'
56
- import react from '@vitejs/plugin-react'
57
- import tsconfigPaths from 'vite-tsconfig-paths'
58
-
59
- export default defineConfig({
60
- plugins: [react(), tsconfigPaths()],
61
- test: {
62
- environment: 'jsdom',
63
- globals: true,
64
- setupFiles: ['./src/test/setup.ts'],
65
- include: ['**/*.test.{ts,tsx}'],
66
- coverage: {
67
- provider: 'v8',
68
- reporter: ['text', 'json', 'html'],
69
- exclude: ['**/test/**', '**/*.d.ts'],
70
- },
71
- },
72
- })
73
- ```
74
-
75
- ### test/setup.ts
76
- ```typescript
77
- import '@testing-library/jest-dom/vitest'
78
- import { afterAll, afterEach, beforeAll } from 'vitest'
79
- import { cleanup } from '@testing-library/react'
80
- import { server } from './mocks/server'
81
-
82
- beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
83
- afterEach(() => {
84
- cleanup()
85
- server.resetHandlers()
86
- })
87
- afterAll(() => server.close())
88
- ```
89
-
90
- ### test/mocks/handlers.ts
91
- ```typescript
92
- import { http, HttpResponse } from 'msw'
93
-
94
- export const handlers = [
95
- http.get('/api/posts', () => {
96
- return HttpResponse.json([
97
- { id: '1', title: 'First Post', content: 'Content 1' },
98
- { id: '2', title: 'Second Post', content: 'Content 2' },
99
- ])
100
- }),
101
-
102
- http.get('/api/posts/:id', ({ params }) => {
103
- return HttpResponse.json({
104
- id: params.id,
105
- title: `Post ${params.id}`,
106
- content: `Content for post ${params.id}`,
107
- })
108
- }),
109
-
110
- http.post('/api/posts', async ({ request }) => {
111
- const body = await request.json()
112
- return HttpResponse.json({ id: 'new-id', ...body }, { status: 201 })
113
- }),
114
- ]
115
- ```
116
-
117
- ### test/mocks/server.ts
118
- ```typescript
119
- import { setupServer } from 'msw/node'
120
- import { handlers } from './handlers'
121
-
122
- export const server = setupServer(...handlers)
123
- ```
124
-
125
- ## Test Utilities
126
-
127
- ### test/utils/test-utils.tsx
128
- ```typescript
129
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
130
- import { RouterProvider, createRouter, createMemoryHistory } from '@tanstack/react-router'
131
- import { render, type RenderOptions } from '@testing-library/react'
132
- import type { ReactElement, ReactNode } from 'react'
133
- import { routeTree } from '@/routeTree.gen'
134
-
135
- function createTestQueryClient() {
136
- return new QueryClient({
137
- defaultOptions: {
138
- queries: {
139
- retry: false,
140
- gcTime: 0,
141
- },
142
- mutations: {
143
- retry: false,
144
- },
145
- },
146
- })
147
- }
148
-
149
- interface WrapperProps {
150
- children: ReactNode
151
- }
152
-
153
- function createWrapper() {
154
- const queryClient = createTestQueryClient()
155
- return function Wrapper({ children }: WrapperProps) {
156
- return (
157
- <QueryClientProvider client={queryClient}>
158
- {children}
159
- </QueryClientProvider>
160
- )
161
- }
162
- }
163
-
164
- export function renderWithProviders(
165
- ui: ReactElement,
166
- options?: Omit<RenderOptions, 'wrapper'>
167
- ) {
168
- return render(ui, { wrapper: createWrapper(), ...options })
169
- }
170
-
171
- export function createTestRouter(initialPath = '/') {
172
- const queryClient = createTestQueryClient()
173
- const router = createRouter({
174
- routeTree,
175
- context: { queryClient },
176
- history: createMemoryHistory({ initialEntries: [initialPath] }),
177
- })
178
- return { router, queryClient }
179
- }
180
-
181
- export function renderRoute(path: string) {
182
- const { router, queryClient } = createTestRouter(path)
183
- return {
184
- ...render(
185
- <QueryClientProvider client={queryClient}>
186
- <RouterProvider router={router} />
187
- </QueryClientProvider>
188
- ),
189
- router,
190
- queryClient,
191
- }
192
- }
193
-
194
- export * from '@testing-library/react'
195
- export { renderWithProviders as render }
196
- ```
197
-
198
- ### test/utils/factories.ts
199
- ```typescript
200
- import type { Post, User } from '@/types'
201
-
202
- let idCounter = 0
203
-
204
- export function createPost(overrides: Partial<Post> = {}): Post {
205
- idCounter++
206
- return {
207
- id: `post-${idCounter}`,
208
- title: `Test Post ${idCounter}`,
209
- content: `This is test content for post ${idCounter}`,
210
- authorId: 'user-1',
211
- createdAt: new Date().toISOString(),
212
- updatedAt: new Date().toISOString(),
213
- ...overrides,
214
- }
215
- }
216
-
217
- export function createUser(overrides: Partial<User> = {}): User {
218
- idCounter++
219
- return {
220
- id: `user-${idCounter}`,
221
- name: `Test User ${idCounter}`,
222
- email: `user${idCounter}@test.com`,
223
- ...overrides,
224
- }
225
- }
226
- ```
227
-
228
- ## Component Testing
229
-
230
- ### Testing a Component with Query
231
- ```typescript
232
- // features/posts/components/__tests__/PostList.test.tsx
233
- import { describe, it, expect } from 'vitest'
234
- import { screen, waitFor } from '@testing-library/react'
235
- import { render } from '@/test/utils/test-utils'
236
- import { PostList } from '../PostList'
237
-
238
- describe('PostList', () => {
239
- it('renders loading state initially', () => {
240
- render(<PostList />)
241
- expect(screen.getByText(/loading/i)).toBeInTheDocument()
242
- })
243
-
244
- it('renders posts after loading', async () => {
245
- render(<PostList />)
246
-
247
- await waitFor(() => {
248
- expect(screen.getByText('First Post')).toBeInTheDocument()
249
- expect(screen.getByText('Second Post')).toBeInTheDocument()
250
- })
251
- })
252
-
253
- it('renders error state on failure', async () => {
254
- server.use(
255
- http.get('/api/posts', () => {
256
- return HttpResponse.json({ error: 'Server error' }, { status: 500 })
257
- })
258
- )
259
-
260
- render(<PostList />)
261
-
262
- await waitFor(() => {
263
- expect(screen.getByText(/error/i)).toBeInTheDocument()
264
- })
265
- })
266
- })
267
- ```
268
-
269
- ### Testing a Form
270
- ```typescript
271
- // features/posts/components/__tests__/PostForm.test.tsx
272
- import { describe, it, expect, vi } from 'vitest'
273
- import { screen, waitFor } from '@testing-library/react'
274
- import userEvent from '@testing-library/user-event'
275
- import { render } from '@/test/utils/test-utils'
276
- import { PostForm } from '../PostForm'
277
-
278
- describe('PostForm', () => {
279
- it('submits form with valid data', async () => {
280
- const user = userEvent.setup()
281
- const onSubmit = vi.fn()
282
-
283
- render(<PostForm onSubmit={onSubmit} />)
284
-
285
- await user.type(screen.getByLabelText(/title/i), 'My New Post')
286
- await user.type(screen.getByLabelText(/content/i), 'This is the post content')
287
- await user.click(screen.getByRole('button', { name: /save/i }))
288
-
289
- await waitFor(() => {
290
- expect(onSubmit).toHaveBeenCalledWith({
291
- title: 'My New Post',
292
- content: 'This is the post content',
293
- published: false,
294
- })
295
- })
296
- })
297
-
298
- it('shows validation errors for invalid data', async () => {
299
- const user = userEvent.setup()
300
- const onSubmit = vi.fn()
301
-
302
- render(<PostForm onSubmit={onSubmit} />)
303
-
304
- await user.type(screen.getByLabelText(/title/i), 'Hi')
305
- await user.click(screen.getByRole('button', { name: /save/i }))
306
-
307
- await waitFor(() => {
308
- expect(screen.getByText(/at least 3 characters/i)).toBeInTheDocument()
309
- })
310
- expect(onSubmit).not.toHaveBeenCalled()
311
- })
312
- })
313
- ```
314
-
315
- ## Hook Testing
316
-
317
- ### Testing a Mutation Hook
318
- ```typescript
319
- // features/posts/hooks/__tests__/useCreatePost.test.tsx
320
- import { describe, it, expect } from 'vitest'
321
- import { renderHook, waitFor } from '@testing-library/react'
322
- import { createWrapper } from '@/test/utils/test-utils'
323
- import { useCreatePost } from '../useCreatePost'
324
-
325
- describe('useCreatePost', () => {
326
- it('creates a post successfully', async () => {
327
- const wrapper = createWrapper()
328
- const { result } = renderHook(() => useCreatePost(), { wrapper })
329
-
330
- result.current.mutate({
331
- title: 'New Post',
332
- content: 'Post content',
333
- })
334
-
335
- await waitFor(() => {
336
- expect(result.current.isSuccess).toBe(true)
337
- expect(result.current.data?.id).toBe('new-id')
338
- })
339
- })
340
-
341
- it('handles errors correctly', async () => {
342
- server.use(
343
- http.post('/api/posts', () => {
344
- return HttpResponse.json({ error: 'Validation failed' }, { status: 400 })
345
- })
346
- )
347
-
348
- const wrapper = createWrapper()
349
- const { result } = renderHook(() => useCreatePost(), { wrapper })
350
-
351
- result.current.mutate({ title: '', content: '' })
352
-
353
- await waitFor(() => {
354
- expect(result.current.isError).toBe(true)
355
- })
356
- })
357
- })
358
- ```
359
-
360
- ## Route Testing
361
-
362
- ### Testing a Route Component
363
- ```typescript
364
- // routes/__tests__/posts.$postId.test.tsx
365
- import { describe, it, expect } from 'vitest'
366
- import { screen, waitFor } from '@testing-library/react'
367
- import { renderRoute } from '@/test/utils/test-utils'
368
-
369
- describe('Post Detail Route', () => {
370
- it('renders post details', async () => {
371
- renderRoute('/posts/1')
372
-
373
- await waitFor(() => {
374
- expect(screen.getByText('Post 1')).toBeInTheDocument()
375
- })
376
- })
377
-
378
- it('handles not found post', async () => {
379
- server.use(
380
- http.get('/api/posts/:id', () => {
381
- return HttpResponse.json({ error: 'Not found' }, { status: 404 })
382
- })
383
- )
384
-
385
- renderRoute('/posts/999')
386
-
387
- await waitFor(() => {
388
- expect(screen.getByText(/not found/i)).toBeInTheDocument()
389
- })
390
- })
391
- })
392
- ```
393
-
394
- ## Table Testing
395
-
396
- ```typescript
397
- // features/posts/components/__tests__/PostsTable.test.tsx
398
- import { describe, it, expect } from 'vitest'
399
- import { screen } from '@testing-library/react'
400
- import { render } from '@/test/utils/test-utils'
401
- import { PostsTable } from '../PostsTable'
402
- import { createPost } from '@/test/utils/factories'
403
-
404
- describe('PostsTable', () => {
405
- it('renders all columns', () => {
406
- const posts = [createPost(), createPost()]
407
-
408
- render(<PostsTable data={posts} />)
409
-
410
- expect(screen.getByText('Title')).toBeInTheDocument()
411
- expect(screen.getByText('Date')).toBeInTheDocument()
412
- })
413
-
414
- it('renders all rows', () => {
415
- const posts = [
416
- createPost({ title: 'First' }),
417
- createPost({ title: 'Second' }),
418
- ]
419
-
420
- render(<PostsTable data={posts} />)
421
-
422
- expect(screen.getByText('First')).toBeInTheDocument()
423
- expect(screen.getByText('Second')).toBeInTheDocument()
424
- })
425
- })
426
- ```
427
-
428
- ## Bun Test Commands
429
-
430
- ```bash
431
- # Run all tests
432
- bun test
433
-
434
- # Run tests in watch mode
435
- bun test --watch
436
-
437
- # Run with coverage
438
- bun test --coverage
439
-
440
- # Run specific file
441
- bun test PostList.test.tsx
442
-
443
- # Run tests matching pattern
444
- bun test -t "creates a post"
445
- ```
446
-
447
- ## Coverage Target
448
-
449
- Aim for **80%+ coverage** with focus on:
450
- - Critical user flows
451
- - Edge cases and error handling
452
- - Query/mutation success and failure paths
453
- - Form validation scenarios
454
- - Route loading and error states