gadget/gadget-code/scripts/seed-socket-test-data.ts
2026-04-30 16:51:33 -04:00

182 lines
5.2 KiB
JavaScript

#!/usr/bin/env node
// scripts/seed-socket-test-data.ts
// Copyright (C) 2026 Robert Colbert <rob.colbert@openplatform.us>
// 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<SeedResult> {
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);
});