#!/usr/bin/env node // scripts/seed-socket-test-data.ts // Copyright (C) 2026 Robert Colbert // All Rights Reserved /** * Seeds the database with test data for socket messaging tests. * * This script creates: * - Test user (if not exists) * - Test project (unique per run) * - Test chat session (unique per run) * - Test drone registrations (unique per run) * * IMPORTANT: This script does NOT delete existing data. It only creates new, * unique records. Tests are responsible for cleaning up their own data. * * Usage: * npx tsx scripts/seed-socket-test-data.ts * * Output: * JSON object with created resource IDs for test cleanup */ import mongoose from 'mongoose'; import { config } from 'dotenv'; import { IUser } from '@gadget/api'; import User from '../src/models/user'; import Project from '../src/models/project'; import ChatSession from '../src/models/chat-session'; import DroneRegistration from '../src/models/drone-registration'; import { AiProvider } from '../src/models/ai-provider'; config(); interface SeedResult { userId: string; projectId: string; chatSessionId: string; droneIds: string[]; providerId?: string; createdAt: string; note: string; } async function seedSocketTestData(): Promise { const NOW = new Date(); const timestamp = NOW.toISOString().replace(/[:.]/g, '-'); try { // Connect to database await mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/gadget-code'); console.log('Connected to MongoDB'); // Find or create test user let user = await User.findOne({ email: 'test-socket@gadget-code.test' }); if (!user) { user = new User({ email: 'test-socket@gadget-code.test', displayName: 'Socket Test User', passwordSalt: 'test-salt', passwordHash: 'test-hash', banned: false, admin: false, createdAt: NOW, updatedAt: NOW, }); await user.save(); console.log('Created test user:', user._id); } else { console.log('Found existing test user:', user._id); } // Find or create a test AI provider let provider = await AiProvider.findOne({ name: 'Test Socket Provider' }); if (!provider) { provider = new AiProvider({ name: 'Test Socket Provider', apiType: 'ollama', baseUrl: 'http://localhost:11434', enabled: true, models: [{ id: 'llama3.2', name: 'Llama 3.2', capabilities: { canCallTools: true, hasVision: false, hasEmbedding: false, hasThinking: false, isInstructTuned: true, }, }], lastModelRefresh: NOW, }); await provider.save(); console.log('Created test provider:', provider._id); } else { console.log('Found existing test provider:', provider._id); } // Create test project (unique per run) const project = new Project({ user: user._id, slug: `socket-test-${timestamp}`, name: `Socket Test Project ${timestamp}`, gitUrl: 'https://github.com/test/socket-test.git', createdAt: NOW, updatedAt: NOW, }); await project.save(); console.log('Created test project:', project._id); // Create test chat session (unique per run) const chatSession = new ChatSession({ user: user._id, project: project._id, provider: provider._id, selectedModel: 'llama3.2', mode: 'build', name: `Socket Test Session ${timestamp}`, stats: { toolCallCount: 0, fileOpCount: 0, subagentCount: 0, }, createdAt: NOW, updatedAt: NOW, }); await chatSession.save(); console.log('Created test chat session:', chatSession._id); // Create test drone registrations (unique per run) const droneCount = 3; const droneIds: string[] = []; for (let i = 0; i < droneCount; i++) { const drone = new DroneRegistration({ user: user._id, hostname: `test-drone-${timestamp}-${i}`, workspaceDir: `/tmp/socket-test-${timestamp}-${i}`, status: 'available', createdAt: NOW, updatedAt: NOW, }); await drone.save(); droneIds.push(drone._id.toHexString()); console.log(`Created test drone ${i + 1}/${droneCount}:`, drone._id); } const result: SeedResult = { userId: user._id.toHexString(), projectId: project._id.toHexString(), chatSessionId: chatSession._id.toHexString(), droneIds, providerId: provider._id.toHexString(), createdAt: NOW.toISOString(), note: 'TEST DATA - Safe to delete. Created for socket messaging tests.', }; console.log('\nāœ… Seed complete! Save this output for test cleanup:'); console.log(JSON.stringify(result, null, 2)); return result; } catch (error) { console.error('āŒ Seed failed:', error); process.exit(1); } finally { await mongoose.disconnect(); console.log('\nDisconnected from MongoDB'); } } // Run the seed seedSocketTestData() .then(() => { process.exit(0); }) .catch((error) => { console.error('Unhandled error:', error); process.exit(1); });