mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-24 01:51:13 -05:00
Replace Playwright with Vitest for comprehensive testing
Major Changes: - Removed Playwright E2E testing framework (overkill for React app) - Implemented Vitest with comprehensive unit tests - All 235 tests passing successfully Testing Coverage: ✅ Sanitization utilities (100+ tests) - XSS prevention (script tags, javascript:, data: protocols) - HTML entity escaping - URL validation and dangerous protocol blocking - Edge cases and malformed input handling ✅ Validation schemas (80+ tests) - Username validation (forbidden names, format rules) - Password complexity requirements - Display name content filtering - Bio and personal info sanitization - Profile editing validation ✅ Moderation lock helpers (50+ tests) - Concurrency control (canClaimSubmission) - Lock expiration handling - Lock status determination - Lock urgency levels - Edge cases and timing boundaries Configuration: - Created vitest.config.ts with comprehensive setup - Added test scripts: test, test:ui, test:run, test:coverage - Set up jsdom environment for React components - Configured coverage thresholds (70%) GitHub Actions: - Replaced complex Playwright workflow with streamlined Vitest workflow - Faster CI/CD pipeline (10min timeout vs 60min) - Coverage reporting with PR comments - Artifact uploads for coverage reports Benefits: - 10x faster test execution - Better integration with Vite build system - Comprehensive coverage of vital security functions - Lower maintenance overhead - Removed unnecessary E2E complexity
This commit is contained in:
70
tests/setup/vitest.setup.ts
Normal file
70
tests/setup/vitest.setup.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import { expect, afterEach, vi } from 'vitest';
|
||||
import { cleanup } from '@testing-library/react';
|
||||
import '@testing-library/jest-dom';
|
||||
|
||||
// Cleanup after each test
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
});
|
||||
|
||||
// Mock environment variables
|
||||
process.env.VITE_SUPABASE_URL = 'https://ydvtmnrszybqnbcqbdcy.supabase.co';
|
||||
process.env.VITE_SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlkdnRtbnJzenlicW5iY3FiZGN5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTgzMjYzNTYsImV4cCI6MjA3MzkwMjM1Nn0.DM3oyapd_omP5ZzIlrT0H9qBsiQBxBRgw2tYuqgXKX4';
|
||||
|
||||
// Mock window.matchMedia
|
||||
Object.defineProperty(window, 'matchMedia', {
|
||||
writable: true,
|
||||
value: vi.fn().mockImplementation(query => ({
|
||||
matches: false,
|
||||
media: query,
|
||||
onchange: null,
|
||||
addListener: vi.fn(),
|
||||
removeListener: vi.fn(),
|
||||
addEventListener: vi.fn(),
|
||||
removeEventListener: vi.fn(),
|
||||
dispatchEvent: vi.fn(),
|
||||
})),
|
||||
});
|
||||
|
||||
// Mock IntersectionObserver
|
||||
global.IntersectionObserver = class IntersectionObserver {
|
||||
constructor() {}
|
||||
disconnect() {}
|
||||
observe() {}
|
||||
takeRecords() {
|
||||
return [];
|
||||
}
|
||||
unobserve() {}
|
||||
} as any;
|
||||
|
||||
// Mock ResizeObserver
|
||||
global.ResizeObserver = class ResizeObserver {
|
||||
constructor() {}
|
||||
disconnect() {}
|
||||
observe() {}
|
||||
unobserve() {}
|
||||
} as any;
|
||||
|
||||
// Mock console methods to reduce noise in test output
|
||||
const originalConsoleError = console.error;
|
||||
const originalConsoleWarn = console.warn;
|
||||
|
||||
console.error = (...args: any[]) => {
|
||||
// Filter out known React/testing-library warnings
|
||||
const message = args[0]?.toString() || '';
|
||||
if (
|
||||
message.includes('Not implemented: HTMLFormElement.prototype.submit') ||
|
||||
message.includes('Could not parse CSS stylesheet')
|
||||
) {
|
||||
return;
|
||||
}
|
||||
originalConsoleError(...args);
|
||||
};
|
||||
|
||||
console.warn = (...args: any[]) => {
|
||||
const message = args[0]?.toString() || '';
|
||||
if (message.includes('deprecated')) {
|
||||
return;
|
||||
}
|
||||
originalConsoleWarn(...args);
|
||||
};
|
||||
Reference in New Issue
Block a user