# Testing Utilities

This directory contains utilities to improve test reliability, maintainability, and consistency across the stats app test suite.

## Files Overview

### `test-helpers.ts`
Main export file that provides backward compatibility and re-exports all testing utilities.

### `date-testing-utils.ts`
**Purpose**: Eliminate date-related test flakiness

**Key Features:**
- Fixed date (`2024-01-15T12:00:00.000Z`) for consistent test behavior
- Mock system date to prevent timing issues
- Date range calculation utilities that work reliably
- Mocking utilities for `@tryghost/shade` date functions

**Usage:**
```typescript
import { setupDateMocking, getExpectedDateRange } from '@test-utils/analytics/test-helpers';

beforeEach(() => {
    const dateMocking = setupDateMocking();
});

// Use consistent date ranges in assertions
const { expectedDateFrom, expectedDateTo } = getExpectedDateRange(30);
```

### `mock-factories.ts`
**Purpose**: Builder pattern for test data creation

**Key Features:**
- `MockPostBuilder` - Flexible post creation with sensible defaults
- `MockStatsBuilder` - Statistics data with configurable values
- `MockApiResponseBuilder` - Standard API response shapes
- Quick factory functions for common scenarios

**Usage:**
```typescript
import { MockPostBuilder, createMockPost } from '@test-utils/analytics/test-helpers';

// Builder pattern for complex data
const post = new MockPostBuilder()
    .withId('test-123')
    .withAuthors([{name: 'Test Author'}])
    .withoutEmail()
    .build();

// Quick factories for simple cases
const simplePost = createMockPost({ id: 'simple-123' });
```

### `hook-testing-utils.ts`
**Purpose**: Reduce boilerplate in hook testing

**Key Features:**
- `createStandardApiMock()` - Complete API mock setup
- `createStandardHookTestSuite()` - Generate common test patterns
- `setupCommonHookMocks()` - Standard dependency mocking
- Test generators for parameters, shouldFetch, loading/error states

**Usage:**
```typescript
import { createStandardHookTestSuite } from '@test-utils/analytics/test-helpers';

const testSuite = createStandardHookTestSuite(
    'useMyHook',
    useMyHook,
    mockApiCall,
    { hasRange: true, hasOrder: true, hasShouldFetch: true }
);

testSuite.forEach(({name, test}) => {
    it(name, test);
});
```

## Migration Benefits

### Before (Problems)
- **Date Flakiness**: Tests failed randomly based on execution time
- **Verbose Setup**: Each test repeated 50+ lines of mock configuration
- **Inconsistent Patterns**: Different approaches across test files
- **Maintenance Burden**: Changes required updates in multiple files

### After (Solutions)
- **Reliable Dates**: Fixed dates eliminate timing-dependent failures
- **Reduced Boilerplate**: Standard patterns generate common test cases
- **Consistent Mocking**: Reusable builders for complex data structures
- **Maintainable**: Changes in one place affect all tests

## Test Results

All tests now pass consistently:
- **228 tests passing** (0 failures)
- **Hook coverage: 97.68%** (up from ~75%)
- **Utils coverage: 100%**
- **Reliable date handling** across all tests

## Future Improvements

1. **Integration Tests**: Add utilities for component integration testing
2. **Performance Tests**: Add utilities for testing hook performance
3. **Accessibility Tests**: Add utilities for a11y testing
4. **Visual Tests**: Add utilities for snapshot testing

## Usage Guidelines

1. **Use fixed dates** for any time-dependent tests
2. **Use builders** for complex mock data that varies between tests
3. **Use factories** for simple mock data that's consistent
4. **Use generators** for standard hook test patterns
5. **Migrate gradually** - existing tests continue to work while new tests adopt these patterns