mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-24 11:11:13 -05:00
feat: Implement test data generation improvements
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { useState } from 'react';
|
||||
import { useState, useEffect } from 'react';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { Checkbox } from '@/components/ui/checkbox';
|
||||
@@ -10,19 +10,20 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/component
|
||||
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog';
|
||||
import { supabase } from '@/integrations/supabase/client';
|
||||
import { useToast } from '@/hooks/use-toast';
|
||||
import { Beaker, CheckCircle, XCircle, ChevronDown, Trash2, AlertTriangle } from 'lucide-react';
|
||||
import { Beaker, CheckCircle, ChevronDown, Trash2, AlertTriangle } from 'lucide-react';
|
||||
import { clearTestData, getTestDataStats } from '@/lib/testDataGenerator';
|
||||
|
||||
const PRESETS = {
|
||||
small: { label: 'Small', description: '~20 submissions - Quick test', counts: '5 parks, 10 rides, 3 companies' },
|
||||
medium: { label: 'Medium', description: '~100 submissions - Standard testing', counts: '20 parks, 50 rides, 20 companies' },
|
||||
large: { label: 'Large', description: '~500 submissions - Performance testing', counts: '100 parks, 250 rides, 100 companies' },
|
||||
stress: { label: 'Stress', description: '~2000 submissions - Load testing', counts: '400 parks, 1000 rides, 400 companies' }
|
||||
small: { label: 'Small', description: '~30 submissions - Quick test', counts: '5 parks, 10 rides, 3 companies, 2 models, 5 photo sets' },
|
||||
medium: { label: 'Medium', description: '~125 submissions - Standard testing', counts: '20 parks, 50 rides, 20 companies, 10 models, 25 photo sets' },
|
||||
large: { label: 'Large', description: '~600 submissions - Performance testing', counts: '100 parks, 250 rides, 100 companies, 50 models, 100 photo sets' },
|
||||
stress: { label: 'Stress', description: '~2600 submissions - Load testing', counts: '400 parks, 1000 rides, 400 companies, 200 models, 500 photo sets' }
|
||||
};
|
||||
|
||||
export function TestDataGenerator() {
|
||||
const { toast } = useToast();
|
||||
const [preset, setPreset] = useState<'small' | 'medium' | 'large' | 'stress'>('small');
|
||||
const [fieldDensity, setFieldDensity] = useState<'mixed' | 'minimal' | 'standard' | 'maximum'>('mixed');
|
||||
const [entityTypes, setEntityTypes] = useState({
|
||||
parks: true,
|
||||
rides: true,
|
||||
@@ -30,7 +31,8 @@ export function TestDataGenerator() {
|
||||
operators: true,
|
||||
property_owners: true,
|
||||
designers: true,
|
||||
ride_models: true
|
||||
ride_models: true,
|
||||
photos: true
|
||||
});
|
||||
const [options, setOptions] = useState({
|
||||
includeDependencies: true,
|
||||
@@ -47,6 +49,10 @@ export function TestDataGenerator() {
|
||||
.filter(([_, enabled]) => enabled)
|
||||
.map(([type]) => type);
|
||||
|
||||
useEffect(() => {
|
||||
loadStats();
|
||||
}, []);
|
||||
|
||||
const loadStats = async () => {
|
||||
try {
|
||||
const data = await getTestDataStats();
|
||||
@@ -64,6 +70,7 @@ export function TestDataGenerator() {
|
||||
const { data, error } = await supabase.functions.invoke('seed-test-data', {
|
||||
body: {
|
||||
preset,
|
||||
fieldDensity,
|
||||
entityTypes: selectedEntityTypes,
|
||||
...options
|
||||
}
|
||||
@@ -76,7 +83,7 @@ export function TestDataGenerator() {
|
||||
|
||||
toast({
|
||||
title: 'Test Data Generated',
|
||||
description: `Successfully created ${Object.values(data.summary).reduce((a: number, b: number) => a + b, 0)} submissions in ${data.time}s`
|
||||
description: `Successfully created test data in ${data.time}s`
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Generation error:', error);
|
||||
@@ -122,7 +129,7 @@ export function TestDataGenerator() {
|
||||
<CardTitle>Test Data Generator</CardTitle>
|
||||
</div>
|
||||
<CardDescription>
|
||||
Generate realistic test submissions for testing the moderation queue and versioning systems
|
||||
Generate comprehensive test submissions with varying field density and photo support
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-6">
|
||||
@@ -158,6 +165,39 @@ export function TestDataGenerator() {
|
||||
</RadioGroup>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label className="text-base font-semibold">Field Population Density</Label>
|
||||
<p className="text-sm text-muted-foreground mt-1 mb-3">
|
||||
Controls how many optional fields are populated in generated entities
|
||||
</p>
|
||||
<RadioGroup value={fieldDensity} onValueChange={(v: any) => setFieldDensity(v)} className="space-y-2">
|
||||
<div className="flex items-center space-x-2">
|
||||
<RadioGroupItem value="mixed" id="mixed" />
|
||||
<Label htmlFor="mixed" className="cursor-pointer">
|
||||
<span className="font-medium">Mixed</span> - Random levels (most realistic)
|
||||
</Label>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<RadioGroupItem value="minimal" id="minimal" />
|
||||
<Label htmlFor="minimal" className="cursor-pointer">
|
||||
<span className="font-medium">Minimal</span> - Required fields only
|
||||
</Label>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<RadioGroupItem value="standard" id="standard" />
|
||||
<Label htmlFor="standard" className="cursor-pointer">
|
||||
<span className="font-medium">Standard</span> - 50% optional fields
|
||||
</Label>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<RadioGroupItem value="maximum" id="maximum" />
|
||||
<Label htmlFor="maximum" className="cursor-pointer">
|
||||
<span className="font-medium">Maximum</span> - All fields + technical data
|
||||
</Label>
|
||||
</div>
|
||||
</RadioGroup>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label className="text-base font-semibold">Entity Types</Label>
|
||||
<div className="mt-2 grid grid-cols-2 gap-3">
|
||||
@@ -219,6 +259,9 @@ export function TestDataGenerator() {
|
||||
<li>• Created {results.summary.rides} ride submissions</li>
|
||||
<li>• Created {results.summary.companies} company submissions</li>
|
||||
<li>• Created {results.summary.rideModels} ride model submissions</li>
|
||||
{results.summary.photos > 0 && (
|
||||
<li>• Created {results.summary.photos} photo submissions ({results.summary.totalPhotoItems || 0} photos)</li>
|
||||
)}
|
||||
<li className="font-medium mt-2">Time taken: {results.time}s</li>
|
||||
</ul>
|
||||
</AlertDescription>
|
||||
|
||||
@@ -3,10 +3,10 @@ import type { ParkSubmissionData, RideSubmissionData, CompanySubmissionData, Rid
|
||||
|
||||
// Preset configurations
|
||||
export const PRESETS = {
|
||||
small: { parks: 5, rides: 10, companies: 3, rideModels: 2, photos: 0 },
|
||||
medium: { parks: 20, rides: 50, companies: 20, rideModels: 10, photos: 0 },
|
||||
large: { parks: 100, rides: 250, companies: 100, rideModels: 50, photos: 0 },
|
||||
stress: { parks: 400, rides: 1000, companies: 400, rideModels: 200, photos: 0 }
|
||||
small: { parks: 5, rides: 10, companies: 3, rideModels: 2, photos: 5 },
|
||||
medium: { parks: 20, rides: 50, companies: 20, rideModels: 10, photos: 25 },
|
||||
large: { parks: 100, rides: 250, companies: 100, rideModels: 50, photos: 100 },
|
||||
stress: { parks: 400, rides: 1000, companies: 400, rideModels: 200, photos: 500 }
|
||||
} as const;
|
||||
|
||||
// Word lists for realistic names
|
||||
|
||||
Reference in New Issue
Block a user