mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 14:51:13 -05:00
Connect to Lovable Cloud
Apply quick wins and pipeline fixes for integration tests: - Remove is_test_data flag from location inserts - Increase test delay from 2.5s to 5s and add delays between suites to curb rate limiting - Replace [object Object] error formatting with formatTestError across 10 test suites (31 edits) and add import - Refactor unit/conversion tests and performance tests to use the approval pipeline - Extend edge function handling by ensuring item_ids are included in idempotency key inserts (edge function fix) - Update auth, data integrity, edgeFunction, moderation, performance, submission, unitConversion, and versioning test files accordingly
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
import { supabase } from '@/lib/supabaseClient';
|
||||
import type { TestSuite, TestResult } from '../testRunner';
|
||||
import { TestDataTracker } from '../TestDataTracker';
|
||||
import { formatTestError } from '../formatTestError';
|
||||
|
||||
export const unitConversionTestSuite: TestSuite = {
|
||||
id: 'unit-conversion',
|
||||
@@ -24,65 +25,93 @@ export const unitConversionTestSuite: TestSuite = {
|
||||
let rideId: string | null = null;
|
||||
|
||||
try {
|
||||
// Create test park
|
||||
const parkSlug = `test-park-units-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
||||
const { data: park, error: parkError } = await supabase
|
||||
.from('parks')
|
||||
.insert({
|
||||
name: 'Test Park Units',
|
||||
slug: parkSlug,
|
||||
park_type: 'theme_park',
|
||||
status: 'operating',
|
||||
is_test_data: true
|
||||
})
|
||||
.select('id')
|
||||
.single();
|
||||
// Import helpers and create via pipeline
|
||||
const {
|
||||
getCurrentUserId,
|
||||
getAuthToken,
|
||||
generateUniqueParkData,
|
||||
generateUniqueRideData,
|
||||
createTestParkSubmission,
|
||||
createTestRideSubmission,
|
||||
approveSubmission
|
||||
} = await import('../helpers/approvalTestHelpers');
|
||||
|
||||
const userId = await getCurrentUserId();
|
||||
const authToken = await getAuthToken();
|
||||
|
||||
// Create and approve park
|
||||
const parkData = generateUniqueParkData('unit-001-park');
|
||||
const { submissionId: parkSubId, itemId: parkItemId } = await createTestParkSubmission(parkData, userId, tracker);
|
||||
const parkApproval = await approveSubmission(parkSubId, [parkItemId], authToken);
|
||||
|
||||
if (parkError) throw new Error(`Park creation failed: ${parkError.message}`);
|
||||
parkId = park.id;
|
||||
if (!parkApproval.success) {
|
||||
throw new Error(`Park creation failed: ${parkApproval.error || 'Unknown error'}`);
|
||||
}
|
||||
|
||||
// Get park ID from submission item
|
||||
const { data: parkItem } = await supabase
|
||||
.from('submission_items')
|
||||
.select('approved_entity_id')
|
||||
.eq('id', parkItemId)
|
||||
.single();
|
||||
|
||||
parkId = parkItem?.approved_entity_id || null;
|
||||
if (!parkId) throw new Error('No park ID after approval');
|
||||
|
||||
tracker.track('parks', parkId);
|
||||
|
||||
// Create ride with metric values
|
||||
const rideSlug = `test-ride-units-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
||||
const testData = {
|
||||
name: 'Test Ride Metric',
|
||||
slug: rideSlug,
|
||||
park_id: parkId,
|
||||
category: 'roller_coaster',
|
||||
status: 'operating',
|
||||
max_speed_kmh: 100.0, // km/h (metric)
|
||||
max_height_meters: 50.0, // meters (metric)
|
||||
length_meters: 1000.0, // meters (metric)
|
||||
drop_height_meters: 45.0, // meters (metric)
|
||||
height_requirement: 120 // cm (metric)
|
||||
// Create and approve ride with metric values
|
||||
const rideData = {
|
||||
...generateUniqueRideData(parkId, 'unit-001-ride'),
|
||||
max_speed_kmh: 100.0,
|
||||
max_height_meters: 50.0,
|
||||
length_meters: 1000.0,
|
||||
drop_height_meters: 45.0,
|
||||
height_requirement: 120
|
||||
};
|
||||
|
||||
const { submissionId: rideSubId, itemId: rideItemId } = await createTestRideSubmission(rideData, userId, tracker);
|
||||
const rideApproval = await approveSubmission(rideSubId, [rideItemId], authToken);
|
||||
|
||||
const { data: ride, error: rideError } = await supabase
|
||||
.from('rides')
|
||||
.insert({ ...testData, is_test_data: true })
|
||||
.select('id, max_speed_kmh, max_height_meters, length_meters, drop_height_meters, height_requirement')
|
||||
if (!rideApproval.success) {
|
||||
throw new Error(`Ride creation failed: ${rideApproval.error || 'Unknown error'}`);
|
||||
}
|
||||
|
||||
// Get ride ID from submission item
|
||||
const { data: rideItem } = await supabase
|
||||
.from('submission_items')
|
||||
.select('approved_entity_id')
|
||||
.eq('id', rideItemId)
|
||||
.single();
|
||||
|
||||
if (rideError) throw new Error(`Ride creation failed: ${rideError.message}`);
|
||||
if (!ride) throw new Error('Ride not returned');
|
||||
|
||||
rideId = ride.id;
|
||||
rideId = rideItem?.approved_entity_id || null;
|
||||
if (!rideId) throw new Error('No ride ID after approval');
|
||||
|
||||
tracker.track('rides', rideId);
|
||||
|
||||
// Fetch ride data for validation
|
||||
const { data: ride, error: rideError } = await supabase
|
||||
.from('rides')
|
||||
.select('id, max_speed_kmh, max_height_meters, length_meters, drop_height_meters, height_requirement')
|
||||
.eq('id', rideId)
|
||||
.single();
|
||||
|
||||
if (rideError || !ride) throw new Error('Ride not found after creation');
|
||||
|
||||
// Validate values are stored in metric
|
||||
const tolerance = 0.01; // Allow small floating point differences
|
||||
const tolerance = 0.01;
|
||||
|
||||
if (Math.abs((ride.max_speed_kmh ?? 0) - testData.max_speed_kmh) > tolerance) {
|
||||
throw new Error(`max_speed_kmh mismatch: expected ${testData.max_speed_kmh}, got ${ride.max_speed_kmh}`);
|
||||
if (Math.abs((ride.max_speed_kmh ?? 0) - 100.0) > tolerance) {
|
||||
throw new Error(`max_speed_kmh mismatch: expected 100.0, got ${ride.max_speed_kmh}`);
|
||||
}
|
||||
if (Math.abs((ride.max_height_meters ?? 0) - testData.max_height_meters) > tolerance) {
|
||||
throw new Error(`max_height_meters mismatch: expected ${testData.max_height_meters}, got ${ride.max_height_meters}`);
|
||||
if (Math.abs((ride.max_height_meters ?? 0) - 50.0) > tolerance) {
|
||||
throw new Error(`max_height_meters mismatch: expected 50.0, got ${ride.max_height_meters}`);
|
||||
}
|
||||
if (Math.abs((ride.length_meters ?? 0) - testData.length_meters) > tolerance) {
|
||||
throw new Error(`length_meters mismatch: expected ${testData.length_meters}, got ${ride.length_meters}`);
|
||||
if (Math.abs((ride.length_meters ?? 0) - 1000.0) > tolerance) {
|
||||
throw new Error(`length_meters mismatch: expected 1000.0, got ${ride.length_meters}`);
|
||||
}
|
||||
if (Math.abs((ride.height_requirement ?? 0) - testData.height_requirement) > tolerance) {
|
||||
throw new Error(`height_requirement mismatch: expected ${testData.height_requirement} cm, got ${ride.height_requirement}`);
|
||||
if (Math.abs((ride.height_requirement ?? 0) - 120) > tolerance) {
|
||||
throw new Error(`height_requirement mismatch: expected 120 cm, got ${ride.height_requirement}`);
|
||||
}
|
||||
|
||||
const duration = Date.now() - startTime;
|
||||
@@ -108,7 +137,7 @@ export const unitConversionTestSuite: TestSuite = {
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'fail',
|
||||
duration: Date.now() - startTime,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
error: formatTestError(error),
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} finally {
|
||||
@@ -131,44 +160,66 @@ export const unitConversionTestSuite: TestSuite = {
|
||||
let rideId: string | null = null;
|
||||
|
||||
try {
|
||||
// Create test park
|
||||
const parkSlug = `test-park-ver-units-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
||||
const { data: park, error: parkError } = await supabase
|
||||
.from('parks')
|
||||
.insert({
|
||||
name: 'Test Park Version Units',
|
||||
slug: parkSlug,
|
||||
park_type: 'theme_park',
|
||||
status: 'operating',
|
||||
is_test_data: true
|
||||
})
|
||||
.select('id')
|
||||
.single();
|
||||
// Import helpers and create via pipeline
|
||||
const {
|
||||
getCurrentUserId,
|
||||
getAuthToken,
|
||||
generateUniqueParkData,
|
||||
generateUniqueRideData,
|
||||
createTestParkSubmission,
|
||||
createTestRideSubmission,
|
||||
approveSubmission
|
||||
} = await import('../helpers/approvalTestHelpers');
|
||||
|
||||
const userId = await getCurrentUserId();
|
||||
const authToken = await getAuthToken();
|
||||
|
||||
// Create and approve park
|
||||
const parkData = generateUniqueParkData('unit-002-park');
|
||||
const { submissionId: parkSubId, itemId: parkItemId } = await createTestParkSubmission(parkData, userId, tracker);
|
||||
const parkApproval = await approveSubmission(parkSubId, [parkItemId], authToken);
|
||||
|
||||
if (parkError) throw new Error(`Park creation failed: ${parkError.message}`);
|
||||
parkId = park.id;
|
||||
if (!parkApproval.success) {
|
||||
throw new Error(`Park creation failed: ${parkApproval.error || 'Unknown error'}`);
|
||||
}
|
||||
|
||||
// Get park ID from submission item
|
||||
const { data: parkItem } = await supabase
|
||||
.from('submission_items')
|
||||
.select('approved_entity_id')
|
||||
.eq('id', parkItemId)
|
||||
.single();
|
||||
|
||||
parkId = parkItem?.approved_entity_id || null;
|
||||
if (!parkId) throw new Error('No park ID after approval');
|
||||
|
||||
tracker.track('parks', parkId);
|
||||
|
||||
// Create ride with metric values
|
||||
const rideSlug = `test-ride-ver-units-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
||||
const { data: ride, error: rideError } = await supabase
|
||||
.from('rides')
|
||||
.insert({
|
||||
name: 'Test Ride Version Metric',
|
||||
slug: rideSlug,
|
||||
park_id: parkId,
|
||||
category: 'roller_coaster',
|
||||
status: 'operating',
|
||||
max_speed_kmh: 120.0,
|
||||
max_height_meters: 60.0,
|
||||
height_requirement: 140,
|
||||
is_test_data: true
|
||||
})
|
||||
.select('id')
|
||||
// Create and approve ride with metric values
|
||||
const rideData = {
|
||||
...generateUniqueRideData(parkId, 'unit-002-ride'),
|
||||
max_speed_kmh: 120.0,
|
||||
max_height_meters: 60.0,
|
||||
height_requirement: 140
|
||||
};
|
||||
|
||||
const { submissionId: rideSubId, itemId: rideItemId } = await createTestRideSubmission(rideData, userId, tracker);
|
||||
const rideApproval = await approveSubmission(rideSubId, [rideItemId], authToken);
|
||||
|
||||
if (!rideApproval.success) {
|
||||
throw new Error(`Ride creation failed: ${rideApproval.error || 'Unknown error'}`);
|
||||
}
|
||||
|
||||
// Get ride ID from submission item
|
||||
const { data: rideItem } = await supabase
|
||||
.from('submission_items')
|
||||
.select('approved_entity_id')
|
||||
.eq('id', rideItemId)
|
||||
.single();
|
||||
|
||||
if (rideError) throw new Error(`Ride creation failed: ${rideError.message}`);
|
||||
rideId = ride.id;
|
||||
rideId = rideItem?.approved_entity_id || null;
|
||||
if (!rideId) throw new Error('No ride ID after approval');
|
||||
|
||||
tracker.track('rides', rideId);
|
||||
|
||||
// Poll for version creation
|
||||
@@ -226,7 +277,7 @@ export const unitConversionTestSuite: TestSuite = {
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'fail',
|
||||
duration: Date.now() - startTime,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
error: formatTestError(error),
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} finally {
|
||||
@@ -307,7 +358,7 @@ export const unitConversionTestSuite: TestSuite = {
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'fail',
|
||||
duration: Date.now() - startTime,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
error: formatTestError(error),
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user