Files
thrilltrack-explorer/tests/fixtures/database.ts
2025-10-30 15:42:28 +00:00

194 lines
4.8 KiB
TypeScript

/**
* 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;
}