.claude/skills/vitest-patterns/SKILL.md
Unit testing patterns with Vitest in LivestockAI
npx skillsauth add captjay98/gemini-livestockai Vitest PatternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
LivestockAI uses Vitest for fast unit testing with TypeScript support.
# Run unit tests (IMPORTANT: use "bun run test" not "bun test")
bun run test
# Run specific file
bun run test tests/features/batches/batches.property.test.ts
# Run with coverage
bun run test:coverage
# Run integration tests
bun run test:integration
# Run all tests
bun run test:all
Note: bun run test uses Vitest (respects config), while bun test uses Bun's built-in runner (ignores Vitest config).
tests/
├── features/ # Feature tests
│ ├── batches/
│ │ ├── batches.property.test.ts
│ │ └── batches.test.ts
│ └── sales/
├── integration/ # Database tests
│ └── batches.integration.test.ts
├── components/ # Component tests
└── helpers/ # Test utilities
├── db-integration.ts
└── db-mock.ts
feature.test.tsfeature.property.test.tsfeature.integration.test.tsimport { describe, it, expect, beforeEach, afterEach } from 'vitest'
describe('calculateFCR', () => {
it('returns correct FCR for valid inputs', () => {
expect(calculateFCR(150, 100)).toBe(1.5)
})
it('returns null for zero weight gain', () => {
expect(calculateFCR(150, 0)).toBeNull()
})
it('returns null for negative inputs', () => {
expect(calculateFCR(-150, 100)).toBeNull()
})
})
import { vi } from 'vitest'
// Mock a module
vi.mock('~/lib/db', () => ({
getDb: vi.fn().mockResolvedValue(mockDb),
}))
// Mock a function
const mockFn = vi.fn().mockReturnValue('result')
// Spy on a function
const spy = vi.spyOn(module, 'function')
Service functions are pure and easy to test:
import { calculateBatchTotalCost, validateBatchData } from './service'
describe('calculateBatchTotalCost', () => {
it('multiplies quantity by cost', () => {
expect(calculateBatchTotalCost(100, 5.5)).toBe('550.00')
})
it('returns zero for invalid inputs', () => {
expect(calculateBatchTotalCost(0, 5.5)).toBe('0.00')
expect(calculateBatchTotalCost(100, -5)).toBe('0.00')
})
})
property-testing - Property-based testsintegration-testing - Database teststhree-layer-architecture - Service layer testingdata-ai
Input validation patterns with Zod in LivestockAI server functions
testing
Unit testing patterns with Vitest in LivestockAI
tools
Server → Service → Repository pattern for feature organization
data-ai
Server-side rendering and server functions with TanStack Start in LivestockAI