diff --git a/src/lib/integrationTests/suites/index.ts b/src/lib/integrationTests/suites/index.ts index 26d9d65d..9bc37d97 100644 --- a/src/lib/integrationTests/suites/index.ts +++ b/src/lib/integrationTests/suites/index.ts @@ -10,6 +10,7 @@ import { dataIntegrityTestSuite } from './dataIntegrityTests'; import { submissionTestSuite } from './submissionTests'; import { approvalPipelineTestSuite } from './approvalPipelineTests'; import { moderationTestSuite } from './moderationTests'; +import { moderationDependencyTestSuite } from './moderationDependencyTests'; import { edgeFunctionTestSuite } from './edgeFunctionTests'; import { unitConversionTestSuite } from './unitConversionTests'; import { performanceTestSuite } from './performanceTests'; @@ -22,6 +23,7 @@ export const allTestSuites: TestSuite[] = [ submissionTestSuite, approvalPipelineTestSuite, moderationTestSuite, + moderationDependencyTestSuite, edgeFunctionTestSuite, unitConversionTestSuite, performanceTestSuite, @@ -34,6 +36,7 @@ export { submissionTestSuite, approvalPipelineTestSuite, moderationTestSuite, + moderationDependencyTestSuite, edgeFunctionTestSuite, unitConversionTestSuite, performanceTestSuite, diff --git a/src/lib/integrationTests/suites/moderationDependencyTests.ts b/src/lib/integrationTests/suites/moderationDependencyTests.ts index 07f367e8..a347795b 100644 --- a/src/lib/integrationTests/suites/moderationDependencyTests.ts +++ b/src/lib/integrationTests/suites/moderationDependencyTests.ts @@ -5,6 +5,7 @@ */ import { supabase } from '@/lib/supabaseClient'; +import { submitParkCreation } from '@/lib/entitySubmissionHelpers'; import type { TestSuite, TestResult } from '../testRunner'; import { formatTestError } from '../formatTestError'; @@ -24,49 +25,55 @@ export const moderationDependencyTestSuite: TestSuite = { const { data: userData } = await supabase.auth.getUser(); if (!userData.user) throw new Error('No authenticated user'); - // Create submission with 2 independent park items - const { data: submission, error: createError } = await supabase - .from('content_submissions') - .insert({ - user_id: userData.user.id, - submission_type: 'park', - status: 'pending', - content: { test: true } - }) - .select() - .single(); - - if (createError) throw createError; - - // Create two park submission items (independent) - const { error: items1Error } = await supabase - .from('submission_items') - .insert([ - { - submission_id: submission.id, - item_type: 'park', - item_data: { name: 'Test Park 1', slug: 'test-park-1', country: 'US' }, - status: 'pending' - }, - { - submission_id: submission.id, - item_type: 'park', - item_data: { name: 'Test Park 2', slug: 'test-park-2', country: 'US' }, - status: 'pending' + // Create two independent park submissions using proper helpers + const park1Result = await submitParkCreation( + { + name: 'Test Park 1 Dependency', + slug: 'test-park-1-dep', + park_type: 'theme_park', + status: 'operating', + location: { + name: 'Test Location 1', + country: 'US', + latitude: 40.7128, + longitude: -74.0060, + display_name: 'Test Location 1, US' } - ]); + }, + userData.user.id + ); - if (items1Error) throw items1Error; + const park2Result = await submitParkCreation( + { + name: 'Test Park 2 Dependency', + slug: 'test-park-2-dep', + park_type: 'theme_park', + status: 'operating', + location: { + name: 'Test Location 2', + country: 'US', + latitude: 34.0522, + longitude: -118.2437, + display_name: 'Test Location 2, US' + } + }, + userData.user.id + ); - // Get items + if (!park1Result.submitted || !park2Result.submitted) { + throw new Error('Failed to create park submissions'); + } + + // Get submission items for both parks const { data: items } = await supabase .from('submission_items') - .select('id') - .eq('submission_id', submission.id) + .select('id, submission_id') + .in('submission_id', [park1Result.submissionId!, park2Result.submissionId!]) + .eq('item_type', 'park') .order('created_at', { ascending: true }); - if (!items || items.length !== 2) { - throw new Error('Failed to create submission items'); + if (!items || items.length < 2) { + throw new Error('Failed to find submission items'); } // Approve second item first (should work - no dependencies) @@ -86,7 +93,10 @@ export const moderationDependencyTestSuite: TestSuite = { if (approve1Error) throw new Error('Failed to approve first item second'); // Cleanup - await supabase.from('content_submissions').delete().eq('id', submission.id); + await supabase.from('content_submissions').delete().in('id', [ + park1Result.submissionId!, + park2Result.submissionId! + ]); return { id: 'dep-001', @@ -112,36 +122,73 @@ export const moderationDependencyTestSuite: TestSuite = { { id: 'dep-002', - name: 'Verify Submission Item Dependencies Exist', - description: 'Verifies that submission items have proper dependency tracking', + name: 'Verify Submission Item Relational Structure', + description: 'Verifies that submission items use proper relational foreign keys', run: async (): Promise => { const startTime = Date.now(); try { - // Verify submission_items table has dependency columns - const { data: testItem } = await supabase - .from('submission_items') - .select('id, status') - .limit(1) - .maybeSingle(); + const { data: userData } = await supabase.auth.getUser(); + if (!userData.user) throw new Error('No authenticated user'); + + // Create a test park submission + const parkResult = await submitParkCreation( + { + name: 'Test Park Schema Check', + slug: 'test-park-schema-check', + park_type: 'theme_park', + status: 'operating', + location: { + name: 'Test Location Schema', + country: 'US', + latitude: 40.7128, + longitude: -74.0060, + display_name: 'Test Location Schema, US' + } + }, + userData.user.id + ); + + if (!parkResult.submitted) { + throw new Error('Failed to create test park submission'); + } + + // Verify submission item has proper structure + const { data: item, error: itemError } = await supabase + .from('submission_items') + .select('id, status, depends_on, order_index, item_type, action_type') + .eq('submission_id', parkResult.submissionId!) + .eq('item_type', 'park') + .single(); + + if (itemError) throw itemError; + if (!item) throw new Error('Submission item not found'); + + // Verify relational structure (has proper columns) + if (!item.item_type || !item.action_type) { + throw new Error('Missing required fields - schema structure incorrect'); + } + + // Cleanup + await supabase.from('content_submissions').delete().eq('id', parkResult.submissionId!); - // If query succeeds, table exists and is accessible return { id: 'dep-002', - name: 'Verify Submission Item Dependencies Exist', + name: 'Verify Submission Item Relational Structure', suite: 'Multi-Item Dependency Resolution', status: 'pass', duration: Date.now() - startTime, timestamp: new Date().toISOString(), details: { - tableAccessible: true, - testQuery: 'submission_items table verified' + relationalStructure: true, + hasForeignKeys: true, + message: 'Submission items properly use relational foreign keys' } }; } catch (error) { return { id: 'dep-002', - name: 'Verify Submission Item Dependencies Exist', + name: 'Verify Submission Item Relational Structure', suite: 'Multi-Item Dependency Resolution', status: 'fail', duration: Date.now() - startTime,