aded k6 and script and updated code with better logic and indexing on schema
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
import { writeFile } from 'node:fs/promises';
|
||||
|
||||
const BASE_URL = process.env.API_BASE_URL || 'http://localhost:3000';
|
||||
const USER_COUNT = Number(process.env.SEED_USERS || 20);
|
||||
const SESSION_COUNT = Number(process.env.SEED_SESSIONS || 50);
|
||||
|
||||
const runId = `${Date.now()}`;
|
||||
const generated = {
|
||||
generatedAt: new Date().toISOString(),
|
||||
runId,
|
||||
teacher: null,
|
||||
users: [],
|
||||
sessions: [],
|
||||
};
|
||||
|
||||
async function request(path, method = 'GET', body) {
|
||||
const response = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
...(body ? { body: JSON.stringify(body) } : {}),
|
||||
});
|
||||
|
||||
const text = await response.text();
|
||||
let data;
|
||||
|
||||
try {
|
||||
data = JSON.parse(text);
|
||||
} catch {
|
||||
throw new Error(`${method} ${path}: Invalid JSON response: ${text}`);
|
||||
}
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`${method} ${path} failed (${response.status}): ${JSON.stringify(data)}`
|
||||
);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function entityId(data) {
|
||||
const entity = data.result ?? data.data ?? data;
|
||||
const id = entity._id ?? entity.id;
|
||||
|
||||
if (!id) {
|
||||
throw new Error(`Could not find created record ID: ${JSON.stringify(data)}`);
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log(`Seeding ${BASE_URL}`);
|
||||
|
||||
const teacherResponse = await request('/teachers/', 'POST', {
|
||||
fullName: `Load Test Teacher ${runId}`,
|
||||
email: `teacher-${runId}@example.invalid`,
|
||||
specialization: 'Mathematics',
|
||||
experience: '5 years',
|
||||
});
|
||||
|
||||
generated.teacher = {
|
||||
id: entityId(teacherResponse),
|
||||
email: `teacher-${runId}@example.invalid`,
|
||||
};
|
||||
|
||||
for (let i = 1; i <= USER_COUNT; i++) {
|
||||
const email = `user-${runId}-${i}@example.invalid`;
|
||||
|
||||
const response = await request('/users/', 'POST', {
|
||||
fullName: `Load Test User ${i}`,
|
||||
email,
|
||||
phone: String(9000000000 + i),
|
||||
});
|
||||
|
||||
generated.users.push({
|
||||
id: entityId(response),
|
||||
email,
|
||||
});
|
||||
|
||||
if (i % 10 === 0 || i === USER_COUNT) {
|
||||
console.log(`Created ${i}/${USER_COUNT} users`);
|
||||
}
|
||||
}
|
||||
|
||||
// Start tomorrow and spread sessions one hour apart.
|
||||
const firstStart = Date.now() + 24 * 60 * 60 * 1000;
|
||||
|
||||
for (let i = 0; i < SESSION_COUNT; i++) {
|
||||
const start = new Date(firstStart + i * 60 * 60 * 1000);
|
||||
const end = new Date(start.getTime() + 30 * 60 * 1000);
|
||||
|
||||
const response = await request('/sessions/', 'POST', {
|
||||
teacherId: generated.teacher.id,
|
||||
startTime: start.toISOString(),
|
||||
endTime: end.toISOString(),
|
||||
});
|
||||
|
||||
generated.sessions.push({
|
||||
id: entityId(response),
|
||||
startTime: start.toISOString(),
|
||||
endTime: end.toISOString(),
|
||||
dateTimestamp: start.toISOString(),
|
||||
});
|
||||
|
||||
if ((i + 1) % 10 === 0 || i + 1 === SESSION_COUNT) {
|
||||
console.log(`Created ${i + 1}/${SESSION_COUNT} sessions`);
|
||||
}
|
||||
}
|
||||
|
||||
await writeFile(
|
||||
new URL('../k6/seed-data.json', import.meta.url),
|
||||
JSON.stringify(generated, null, 2) + '\n'
|
||||
);
|
||||
|
||||
console.log('\nSeeding completed successfully.');
|
||||
console.log(`Teacher: 1`);
|
||||
console.log(`Users: ${generated.users.length}`);
|
||||
console.log(`Sessions: ${generated.sessions.length}`);
|
||||
console.log('Saved IDs to k6/seed-data.json');
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error('\nSeeding failed:', error.message);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
Reference in New Issue
Block a user