How to Perform Unit Tests for FckSignups: A Complete Vitest Setup Guide
Run unit tests for FckSignups using Vitest with jsdom for React components and direct handler testing for the Cloudflare Worker, configured via vite.config.mts.
FckSignups is a modern Vite-powered React application built in TypeScript, split between UI components under src/components/ and a server-side Cloudflare Worker in cloudflare-worker/. Performing unit tests for FckSignups requires a unified testing stack that handles both the frontend and edge runtime. This guide walks through installing Vitest with @testing-library/react, configuring the test environment, writing component and worker tests, and running them efficiently.
Prerequisites and Source Code Structure
Before setting up tests, understand the repository layout as defined in BraveOPotato/FckSignups:
- Core UI components:
src/components/(e.g.,ToolCard,Header,Footer) - Hooks and utilities:
src/hooks/andsrc/utils/(e.g.,useTools,useReport) - Worker handlers:
cloudflare-worker/urlHandlers/(e.g.,handleSuggestTool)
The project uses Vite as its build tool, making Vitest the natural choice for unit testing—it reuses Vite's configuration and provides instant feedback during development.
Installing Vitest and Testing Dependencies
Add the required dev dependencies to enable unit testing across both frontend and worker code:
npm install -D vitest @testing-library/react @testing-library/jest-dom @testing-library/user-event jsdom
These packages provide:
- vitest: The test runner with Vite-native HMR
- @testing-library/react: DOM testing utilities for React components
- @testing-library/jest-dom: Custom matchers like
toBeInTheDocument() - @testing-library/user-event: Simulated user interactions
- jsdom: Browser-like environment for component tests
Configuring Vitest in vite.config.mts
Extend the existing Vite configuration to include Vitest settings. In vite.config.mts, add a test block:
// vite.config.mts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
globals: true,
setupFiles: './src/setupTests.ts',
css: true,
coverage: {
reporter: ['text', 'json', 'html'],
},
},
});
Key configuration options:
| Option | Purpose |
|---|---|
environment: 'jsdom' |
Runs DOM-dependent tests in a browser-like environment |
globals: true |
Enables global describe, test, expect without imports |
setupFiles |
Loads src/setupTests.ts before each test file |
css: true |
Processes CSS imports to prevent test failures |
Creating the Global Test Setup
Create src/setupTests.ts to register jest-dom matchers for cleaner assertions:
// src/setupTests.ts
import '@testing-library/jest-dom';
This file runs once before each test suite, making matchers like toBeInTheDocument() and toHaveClass() available globally.
Adding Test Scripts to package.json
Update package.json with convenient test commands:
{
"scripts": {
"test": "vitest run",
"test:watch": "vitest"
}
}
npm test: Single execution for CI pipelinesnpm run test:watch: Continuous execution with hot reload for TDD
Writing Unit Tests for React Components
Place test files adjacent to components using the .test.tsx naming convention. Here's how to test the ToolCard component located at src/components/Home/Tools/ToolCard/ToolCard.tsx:
// src/components/Home/Tools/ToolCard/ToolCard.test.tsx
import { render, screen } from '@testing-library/react';
import ToolCard from './ToolCard';
test('renders tool name and description', () => {
const sampleTool = {
id: 'test-tool',
name: 'Test Tool',
description: 'A tool used for testing',
icon: '🔧',
};
render(<ToolCard tool={sampleTool} />);
expect(screen.getByText('Test Tool')).toBeInTheDocument();
expect(screen.getByText('A tool used for testing')).toBeInTheDocument();
});
Testing patterns for FckSignups components:
- Props verification: Render with sample data and assert DOM output
- Event handling: Use
@testing-library/user-eventfor click/change simulations - Hook isolation: Mock
useToolsoruseReportwhen testing consumers
Testing Cloudflare Worker Handlers
The worker code in cloudflare-worker/ exports pure TypeScript functions that can be unit-tested directly without a full runtime. Test the handleSuggestTool handler from cloudflare-worker/urlHandlers/handleSuggestTool.ts:
// cloudflare-worker/urlHandlers/handleSuggestTool.test.ts
import { handleSuggestTool } from './handleSuggestTool';
import type { FetchEvent } from '@cloudflare/workers-types';
test('suggest tool returns 200 with valid input', async () => {
const request = new Request('https://example.com/suggest', {
method: 'POST',
body: JSON.stringify({ name: 'Test Tool', url: 'https://example.com' }),
});
const mockEvent = { request } as FetchEvent;
const response = await handleSuggestTool(mockEvent);
expect(response.status).toBe(200);
});
For tests requiring full Cloudflare runtime APIs (KV, Durable Objects), install miniflare as a dev dependency and use its Miniflare instance in test setup.
Running FckSignups Unit Tests
Execute tests using the configured npm scripts:
| Command | Behavior |
|---|---|
npm test |
Single run, exits with code on failure |
npm run test:watch |
Interactive watch mode with file watching |
npx vitest --coverage |
Generate coverage reports as configured |
Vitest automatically discovers files matching **/*.test.{ts,tsx} patterns, compiles TypeScript through Vite's pipeline, and executes them in parallel.
Troubleshooting Common Setup Issues
- CSS import errors: Ensure
css: trueis set invite.config.mtstest config - Missing DOM matchers: Verify
src/setupTests.tsis correctly referenced insetupFiles - Worker type errors: Install
@cloudflare/workers-typesfor handler type definitions - Module resolution failures: Check that
tsconfig.jsonpaths align with Vitest's resolver
Summary
- Install Vitest with React Testing Library and jsdom for frontend unit tests
- Extend
vite.config.mtswith atestblock specifying jsdom environment and setup files - Create
src/setupTests.tsto globally register jest-dom matchers - Add npm scripts for both CI (
vitest run) and development (vitest) workflows - Co-locate
.test.tsxfiles next to components usingToolCard.test.tsxpattern - Test worker handlers directly by importing from
cloudflare-worker/urlHandlers/ - Use
miniflarewhen full Cloudflare runtime simulation is required
Frequently Asked Questions
What test runner does FckSignups use?
FckSignups uses Vitest, which leverages the existing Vite configuration for zero-overhead TypeScript compilation and fast test execution.
Can I use Jest instead of Vitest for FckSignups?
While possible, Vitest is strongly recommended because it reuses vite.config.mts, eliminating duplicate configuration for aliases, plugins, and transforms already defined for the build.
Where should test files be placed in FckSignups?
Place test files next to the source file they cover, using the .test.tsx or .test.ts suffix. For example, ToolCard.test.tsx belongs in the same directory as ToolCard.tsx.
How do I test the Cloudflare Worker without deploying?
Import handler functions directly from cloudflare-worker/urlHandlers/ and invoke them with mocked FetchEvent objects. For integration tests requiring KV or other Cloudflare APIs, use the miniflare package to simulate the runtime locally.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →