mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-27 07:47:08 -05:00
feat: Implement Playwright testing setup
This commit is contained in:
193
tests/fixtures/database.ts
vendored
Normal file
193
tests/fixtures/database.ts
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
/**
|
||||
* Database Fixtures for Playwright Tests
|
||||
*
|
||||
* Provides direct database access for test setup and teardown using service role.
|
||||
* IMPORTANT: Only use for test data management, never in production code!
|
||||
*/
|
||||
|
||||
import { createClient } from '@supabase/supabase-js';
|
||||
import type { Database } from '@/integrations/supabase/types';
|
||||
|
||||
const supabaseUrl = 'https://ydvtmnrszybqnbcqbdcy.supabase.co';
|
||||
const supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlkdnRtbnJzenlicW5iY3FiZGN5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTgzMjYzNTYsImV4cCI6MjA3MzkwMjM1Nn0.DM3oyapd_omP5ZzIlrT0H9qBsiQBxBRgw2tYuqgXKX4';
|
||||
|
||||
// For test setup/teardown only - requires service role key
|
||||
const supabaseServiceRoleKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
|
||||
|
||||
// Regular client for authenticated operations
|
||||
export const supabase = createClient<Database>(supabaseUrl, supabaseAnonKey);
|
||||
|
||||
// Service role client for test setup/teardown (bypasses RLS)
|
||||
export const supabaseAdmin = supabaseServiceRoleKey
|
||||
? createClient<Database>(supabaseUrl, supabaseServiceRoleKey)
|
||||
: null;
|
||||
|
||||
/**
|
||||
* Create a test user with specific role
|
||||
*/
|
||||
export async function setupTestUser(
|
||||
email: string,
|
||||
password: string,
|
||||
role: 'user' | 'moderator' | 'admin' | 'superuser' = 'user'
|
||||
): Promise<{ userId: string; email: string }> {
|
||||
if (!supabaseAdmin) {
|
||||
throw new Error('Service role key not configured');
|
||||
}
|
||||
|
||||
// Create user in auth
|
||||
const { data: authData, error: authError } = await supabaseAdmin.auth.admin.createUser({
|
||||
email,
|
||||
password,
|
||||
email_confirm: true,
|
||||
});
|
||||
|
||||
if (authError) throw authError;
|
||||
if (!authData.user) throw new Error('User creation failed');
|
||||
|
||||
const userId = authData.user.id;
|
||||
|
||||
// Create profile
|
||||
const { error: profileError } = await supabaseAdmin
|
||||
.from('profiles')
|
||||
.upsert({
|
||||
id: userId,
|
||||
username: email.split('@')[0],
|
||||
email,
|
||||
role,
|
||||
is_test_data: true,
|
||||
});
|
||||
|
||||
if (profileError) throw profileError;
|
||||
|
||||
return { userId, email };
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean up all test data
|
||||
*/
|
||||
export async function cleanupTestData(): Promise<void> {
|
||||
if (!supabaseAdmin) {
|
||||
throw new Error('Service role key not configured');
|
||||
}
|
||||
|
||||
// Delete in dependency order (child tables first)
|
||||
const tables = [
|
||||
'ride_photos',
|
||||
'park_photos',
|
||||
'submission_items',
|
||||
'content_submissions',
|
||||
'ride_versions',
|
||||
'park_versions',
|
||||
'company_versions',
|
||||
'ride_model_versions',
|
||||
'rides',
|
||||
'ride_models',
|
||||
'parks',
|
||||
'companies',
|
||||
];
|
||||
|
||||
for (const table of tables) {
|
||||
await supabaseAdmin
|
||||
.from(table as any)
|
||||
.delete()
|
||||
.eq('is_test_data', true);
|
||||
}
|
||||
|
||||
// Delete test profiles
|
||||
const { data: profiles } = await supabaseAdmin
|
||||
.from('profiles')
|
||||
.select('id')
|
||||
.eq('is_test_data', true);
|
||||
|
||||
if (profiles) {
|
||||
for (const profile of profiles) {
|
||||
await supabaseAdmin.auth.admin.deleteUser(profile.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Query database directly for assertions
|
||||
*/
|
||||
export async function queryDatabase<T = any>(
|
||||
table: string,
|
||||
query: (qb: any) => any
|
||||
): Promise<T[]> {
|
||||
if (!supabaseAdmin) {
|
||||
throw new Error('Service role key not configured');
|
||||
}
|
||||
|
||||
const { data, error } = await query(supabaseAdmin.from(table));
|
||||
|
||||
if (error) throw error;
|
||||
return data || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for a version to be created
|
||||
*/
|
||||
export async function waitForVersion(
|
||||
entityId: string,
|
||||
versionNumber: number,
|
||||
table: string,
|
||||
maxWaitMs: number = 5000
|
||||
): Promise<boolean> {
|
||||
if (!supabaseAdmin) {
|
||||
throw new Error('Service role key not configured');
|
||||
}
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
while (Date.now() - startTime < maxWaitMs) {
|
||||
const { data } = await supabaseAdmin
|
||||
.from(table as any)
|
||||
.select('version_number')
|
||||
.eq('entity_id', entityId)
|
||||
.eq('version_number', versionNumber)
|
||||
.single();
|
||||
|
||||
if (data) return true;
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Approve a submission directly (for test setup)
|
||||
*/
|
||||
export async function approveSubmissionDirect(submissionId: string): Promise<void> {
|
||||
if (!supabaseAdmin) {
|
||||
throw new Error('Service role key not configured');
|
||||
}
|
||||
|
||||
const { error } = await supabaseAdmin.rpc('approve_submission', {
|
||||
submission_id: submissionId,
|
||||
});
|
||||
|
||||
if (error) throw error;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get test data statistics
|
||||
*/
|
||||
export async function getTestDataStats(): Promise<Record<string, number>> {
|
||||
if (!supabaseAdmin) {
|
||||
throw new Error('Service role key not configured');
|
||||
}
|
||||
|
||||
const tables = ['parks', 'rides', 'companies', 'ride_models', 'content_submissions'];
|
||||
const stats: Record<string, number> = {};
|
||||
|
||||
for (const table of tables) {
|
||||
const { count } = await supabaseAdmin
|
||||
.from(table as any)
|
||||
.select('*', { count: 'exact', head: true })
|
||||
.eq('is_test_data', true);
|
||||
|
||||
stats[table] = count || 0;
|
||||
}
|
||||
|
||||
return stats;
|
||||
}
|
||||
Reference in New Issue
Block a user