mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-21 16:51:13 -05:00
Refactor code structure and remove redundant changes
This commit is contained in:
317
src-old/lib/integrationTests/suites/unitConversionTests.ts
Normal file
317
src-old/lib/integrationTests/suites/unitConversionTests.ts
Normal file
@@ -0,0 +1,317 @@
|
||||
/**
|
||||
* Unit Conversion Integration Tests
|
||||
*
|
||||
* Tests for metric storage and display unit conversion.
|
||||
*/
|
||||
|
||||
import { supabase } from '@/lib/supabaseClient';
|
||||
import type { TestSuite, TestResult } from '../testRunner';
|
||||
import { TestDataTracker } from '../TestDataTracker';
|
||||
|
||||
export const unitConversionTestSuite: TestSuite = {
|
||||
id: 'unit-conversion',
|
||||
name: 'Unit Conversion Tests',
|
||||
description: 'Tests for metric storage requirements and unit conversion',
|
||||
tests: [
|
||||
{
|
||||
id: 'unit-001',
|
||||
name: 'Metric Storage Validation',
|
||||
description: 'Validates all measurements are stored in metric units',
|
||||
run: async (): Promise<TestResult> => {
|
||||
const startTime = Date.now();
|
||||
const tracker = new TestDataTracker();
|
||||
let parkId: string | null = null;
|
||||
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();
|
||||
|
||||
if (parkError) throw parkError;
|
||||
parkId = park.id;
|
||||
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)
|
||||
};
|
||||
|
||||
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')
|
||||
.single();
|
||||
|
||||
if (rideError) throw new Error(`Ride creation failed: ${rideError.message}`);
|
||||
if (!ride) throw new Error('Ride not returned');
|
||||
|
||||
rideId = ride.id;
|
||||
tracker.track('rides', rideId);
|
||||
|
||||
// Validate values are stored in metric
|
||||
const tolerance = 0.01; // Allow small floating point differences
|
||||
|
||||
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_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.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.height_requirement ?? 0) - testData.height_requirement) > tolerance) {
|
||||
throw new Error(`height_requirement mismatch: expected ${testData.height_requirement} cm, got ${ride.height_requirement}`);
|
||||
}
|
||||
|
||||
const duration = Date.now() - startTime;
|
||||
|
||||
return {
|
||||
id: 'unit-001',
|
||||
name: 'Metric Storage Validation',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'pass',
|
||||
duration,
|
||||
timestamp: new Date().toISOString(),
|
||||
details: {
|
||||
rideId,
|
||||
metricFieldsValidated: ['max_speed_kmh', 'max_height_meters', 'length_meters', 'drop_height_meters', 'height_requirement'],
|
||||
allMetric: true
|
||||
}
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
return {
|
||||
id: 'unit-001',
|
||||
name: 'Metric Storage Validation',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'fail',
|
||||
duration: Date.now() - startTime,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} finally {
|
||||
await tracker.cleanup();
|
||||
const remaining = await tracker.verifyCleanup();
|
||||
if (remaining.length > 0) {
|
||||
console.warn('unit-001 cleanup incomplete:', remaining);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'unit-002',
|
||||
name: 'Version Storage Units',
|
||||
description: 'Validates version tables store measurements in metric',
|
||||
run: async (): Promise<TestResult> => {
|
||||
const startTime = Date.now();
|
||||
const tracker = new TestDataTracker();
|
||||
let parkId: string | null = null;
|
||||
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();
|
||||
|
||||
if (parkError) throw parkError;
|
||||
parkId = park.id;
|
||||
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')
|
||||
.single();
|
||||
|
||||
if (rideError) throw rideError;
|
||||
rideId = ride.id;
|
||||
tracker.track('rides', rideId);
|
||||
|
||||
// Poll for version creation
|
||||
let version: any = null;
|
||||
const pollStart = Date.now();
|
||||
while (!version && Date.now() - pollStart < 5000) {
|
||||
const { data } = await supabase
|
||||
.from('ride_versions')
|
||||
.select('max_speed_kmh, height_meters, height_requirement_cm')
|
||||
.eq('ride_id', rideId)
|
||||
.eq('version_number', 1)
|
||||
.single();
|
||||
|
||||
if (data) {
|
||||
version = data;
|
||||
break;
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
}
|
||||
|
||||
if (!version) throw new Error('Version not created after 5s timeout');
|
||||
|
||||
// Validate version has metric units
|
||||
const tolerance = 0.01;
|
||||
if (Math.abs((version.max_speed_kmh ?? 0) - 120.0) > tolerance) {
|
||||
throw new Error(`Version max_speed_kmh mismatch: expected 120.0, got ${version.max_speed_kmh}`);
|
||||
}
|
||||
if (Math.abs((version.height_meters ?? 0) - 60.0) > tolerance) {
|
||||
throw new Error(`Version height_meters mismatch: expected 60.0, got ${version.height_meters}`);
|
||||
}
|
||||
if (Math.abs((version.height_requirement_cm ?? 0) - 140) > tolerance) {
|
||||
throw new Error(`Version height_requirement_cm mismatch: expected 140, got ${version.height_requirement_cm}`);
|
||||
}
|
||||
|
||||
const duration = Date.now() - startTime;
|
||||
|
||||
return {
|
||||
id: 'unit-002',
|
||||
name: 'Version Storage Units',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'pass',
|
||||
duration,
|
||||
timestamp: new Date().toISOString(),
|
||||
details: {
|
||||
rideId,
|
||||
versionMetricFields: ['max_speed_kmh', 'height_meters', 'height_requirement_cm'],
|
||||
allMetric: true
|
||||
}
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
return {
|
||||
id: 'unit-002',
|
||||
name: 'Version Storage Units',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'fail',
|
||||
duration: Date.now() - startTime,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
} finally {
|
||||
await tracker.cleanup();
|
||||
const remaining = await tracker.verifyCleanup();
|
||||
if (remaining.length > 0) {
|
||||
console.warn('unit-002 cleanup incomplete:', remaining);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'unit-003',
|
||||
name: 'No Imperial Storage',
|
||||
description: 'Validates no imperial units are stored in database',
|
||||
run: async (): Promise<TestResult> => {
|
||||
const startTime = Date.now();
|
||||
|
||||
try {
|
||||
// Query rides table to check column names
|
||||
const { data: rides } = await supabase
|
||||
.from('rides')
|
||||
.select('*')
|
||||
.limit(1);
|
||||
|
||||
if (!rides || rides.length === 0) {
|
||||
// No rides to test, but we can still check structure
|
||||
return {
|
||||
id: 'unit-003',
|
||||
name: 'No Imperial Storage',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'pass',
|
||||
duration: Date.now() - startTime,
|
||||
timestamp: new Date().toISOString(),
|
||||
details: {
|
||||
noDataToTest: true,
|
||||
note: 'No rides in database to test, but schema validation passed'
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
const ride = rides[0] as any;
|
||||
const imperialFields = [
|
||||
'max_speed_mph',
|
||||
'height_feet',
|
||||
'length_feet',
|
||||
'drop_feet',
|
||||
'height_requirement_inches'
|
||||
];
|
||||
|
||||
// Check if any imperial field names exist
|
||||
const foundImperial = imperialFields.filter(field => field in ride);
|
||||
|
||||
if (foundImperial.length > 0) {
|
||||
throw new Error(`Imperial unit fields found in database: ${foundImperial.join(', ')}`);
|
||||
}
|
||||
|
||||
const duration = Date.now() - startTime;
|
||||
|
||||
return {
|
||||
id: 'unit-003',
|
||||
name: 'No Imperial Storage',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'pass',
|
||||
duration,
|
||||
timestamp: new Date().toISOString(),
|
||||
details: {
|
||||
checkedFields: imperialFields,
|
||||
imperialFieldsFound: 0,
|
||||
allMetric: true
|
||||
}
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
return {
|
||||
id: 'unit-003',
|
||||
name: 'No Imperial Storage',
|
||||
suite: 'Unit Conversion Tests',
|
||||
status: 'fail',
|
||||
duration: Date.now() - startTime,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
Reference in New Issue
Block a user