| name | context7-tdd |
| description | Test-Driven Development powered by Context7 documentation. Write tests based on official library docs, verify implementations against authoritative sources. |
Context7-Driven TDD
Combine Context7 documentation lookup with Test-Driven Development to ensure your code matches official library patterns from the start.
Core Workflow
1. Research Phase (Context7 First)
Before writing any test, query Context7 for the library/framework you're testing against:
When to query:
- Testing a new library integration
- Unsure about API behavior or edge cases
- Working with complex APIs (ORMs, auth, payments)
- Version-specific behavior matters
How to query:
1. Identify dependencies from package.json/imports
2. If Context7 tools are available, use context7_resolve-library-id to get the library ID
3. If Context7 tools are available, use context7_query-docs for specific "how to" questions
4. Otherwise use official docs, project docs, or web search to gather the same guidance manually
5. Focus on: initialization patterns, error handling, best practices
Example queries:
- "How to set up JWT authentication with NextAuth.js"
- "React useEffect cleanup function examples"
- "Express.js middleware error handling patterns"
- "How to handle transactions in TypeORM"
2. Test Design Phase
Based on Context7 documentation, design tests that verify:
Happy Path:
- Does it follow the documented initialization pattern?
- Are we using the API correctly per official docs?
Error Cases:
- What errors does the library throw? (check docs)
- How should we handle edge cases?
Integration Points:
- Does our code match the library's expected input/output?
- Are we following documented best practices?
3. Write Tests (Red Phase)
Write failing tests that assert behavior according to official documentation:
import { renderHook, waitFor } from '@testing-library/react';
import { useQuery } from '@tanstack/react-query';
describe('useUserData', () => {
it('should cache data according to React Query best practices', async () => {
const { result } = renderHook(() => useUserData('123'));
await waitFor(() => expect(result.current.isSuccess).toBe(true));
expect(result.current.data).toEqual(mockUserData);
});
it('should handle errors as documented in React Query', async () => {
server.use(
rest.get('/api/user/123', (req, res, ctx) => {
return res(ctx.status(404));
})
);
const { result } = renderHook(() => useUserData('123'));
await waitFor(() => expect(result.current.isError).toBe(true));
expect(result.current.error).toBeInstanceOf(Error);
});
});
4. Implement (Green Phase)
Write minimal implementation that satisfies tests AND follows Context7 docs:
import { useQuery } from '@tanstack/react-query';
export function useUserData(userId: string) {
return useQuery({
queryKey: ['user', userId],
queryFn: async () => {
const response = await fetch(`/api/user/${userId}`);
if (!response.ok) {
throw new Error('Failed to fetch user');
}
return response.json();
},
staleTime: 5 * 60 * 1000,
retry: 3,
});
}
5. Refactor Phase
After tests pass, verify against Context7 docs:
Checklist:
Common Patterns
Pattern: Testing Database Operations
describe('createOrder', () => {
it('should use transaction for order creation', async () => {
const orderData = { };
await createOrder(orderData);
expect(prisma.$transaction).toHaveBeenCalled();
});
it('should rollback on failure', async () => {
jest.spyOn(prisma.order, 'create').mockRejectedValue(new Error('DB error'));
await expect(createOrder(orderData)).rejects.toThrow();
expect(prisma.$transaction).toHaveBeenCalledWith(
expect.arrayContaining([expect.any(Promise)])
);
});
});
Pattern: Testing API Integrations
describe('createStripeCustomer', () => {
it('should handle Stripe rate limiting', async () => {
stripeMock.customers.create.mockRejectedValue({
type: 'StripeRateLimitError',
headers: { 'retry-after': '2' }
});
await expect(createStripeCustomer(data)).rejects.toThrow();
expect(stripeMock.customers.create).toHaveBeenCalledTimes(3);
});
});
Pattern: Testing Authentication
describe('authenticateUser', () => {
it('should generate valid JWT per NextAuth spec', async () => {
const user = await authenticateUser(credentials);
expect(user.token).toMatch(/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+$/);
});
});
Integration with Agent Workflow
When using the TDD guide agent with this skill:
- Agent queries Context7 before suggesting test structure
- Tests are designed to verify documented behavior
- Implementation follows official patterns verified by Context7
- Refactoring maintains compliance with authoritative docs
Tools Available
context7_resolve-library-id - Get Context7-compatible library ID
context7_query-docs - Query official documentation and examples
- Standard testing tools (read, bash, write, edit)
Best Practices
- Always verify first - Don't assume API behavior; check Context7
- Test the interface - Tests verify your code uses the library correctly
- Version matters - Specify library versions in queries when relevant
- Cross-reference - If Context7 results are unclear, query again with different wording
- Document assumptions - Comment tests that rely on specific Context7-verified behavior
Example Session Flow
User: "I need to add Stripe payment processing"
Agent (with context7-tdd skill):
1. Query Context7: "How to create Stripe payment intents"
2. Design tests based on official Stripe patterns
3. Write failing tests (Red)
4. Implement minimal code following docs (Green)
5. Refactor while maintaining doc compliance
6. Run tests to verify