veza/veza-backend-api/scripts/load_test_uploads.js
2025-12-12 21:34:34 -05:00

76 lines
2.4 KiB
JavaScript

import http from 'k6/http';
import { check, sleep } from 'k6';
import { randomString } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
export const options = {
vus: 20,
duration: '30s',
thresholds: {
'http_req_duration': ['p(95)<500'], // 95% of requests must complete below 500ms
},
};
const BASE_URL = __ENV.API_URL || 'http://localhost:8080/api/v1';
export default function () {
// 1. Initiate Upload
const userID = '00000000-0000-0000-0000-000000000001'; // Mock User ID
const initPayload = JSON.stringify({
filename: `loadtest_${randomString(8)}.mp3`,
total_size: 1024 * 1024 * 3, // 3MB
total_chunks: 3,
});
const params = {
headers: {
'Content-Type': 'application/json',
// Assuming dev/test environment with bypassed auth or mock token
'Authorization': 'Bearer local-dev-token',
},
};
const initRes = http.post(`${BASE_URL}/tracks/upload/init`, initPayload, params);
const isInitSuccess = check(initRes, {
'init status is 200': (r) => r.status === 200,
'has upload_id': (r) => r.json('upload_id') !== undefined,
});
if (!isInitSuccess) {
console.error(`Init failed: ${initRes.status} ${initRes.body}`);
sleep(1);
return;
}
const uploadID = initRes.json('upload_id');
// 2. Upload Chunks (3 chunks)
// We use a dummy file content. In K6, usually we send multipart/form-data.
// For simplicity and speed in this specific check, we assume the server handles the multipart correctly.
for (let i = 1; i <= 3; i++) {
const chunkData = {
file: http.file(randomString(1024 * 1024), `chunk_${i}.bin`), // 1MB dummy chunk
chunk_number: i.toString(),
total_chunks: '3',
};
const chunkRes = http.post(`${BASE_URL}/tracks/upload/${uploadID}`, chunkData, {
headers: { 'Authorization': 'Bearer local-dev-token' } // Boundary is handled automatically
});
check(chunkRes, {
[`chunk ${i} status is 200`]: (r) => r.status === 200,
});
sleep(0.1); // Small think time
}
// 3. Finish Upload
const finishRes = http.post(`${BASE_URL}/tracks/upload/${uploadID}/finish`, null, params);
check(finishRes, {
'finish status is 200': (r) => r.status === 200,
'has file_path': (r) => r.json('file_path') !== undefined,
});
}