mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-02-09 06:15:41 -05:00
139 lines
4.6 KiB
JavaScript
139 lines
4.6 KiB
JavaScript
// Simple API diagnostic test
|
|
import http from 'k6/http';
|
|
import { check } from 'k6';
|
|
import { getEnvironmentConfig } from './configs/environment.js';
|
|
import { getAuthenticatedUser, getAuthHeaders } from './utils/auth.js';
|
|
|
|
const config = getEnvironmentConfig();
|
|
|
|
export const options = {
|
|
stages: [
|
|
{ duration: __ENV.RAMP_UP || '1m', target: parseInt(__ENV.VUS) || 1 },
|
|
{ duration: __ENV.DURATION || '5m', target: parseInt(__ENV.VUS) || 1 },
|
|
{ duration: __ENV.RAMP_DOWN || '1m', target: 0 },
|
|
],
|
|
thresholds: {
|
|
checks: ['rate>0.70'], // Reduced for high concurrency testing
|
|
http_req_duration: ['p(95)<30000'], // Increased for cloud testing with high load
|
|
http_req_failed: ['rate<0.3'], // Increased to account for high concurrency
|
|
},
|
|
cloud: {
|
|
projectID: __ENV.K6_CLOUD_PROJECT_ID,
|
|
name: 'AutoGPT Platform - Core API Validation Test',
|
|
},
|
|
// Timeout configurations to prevent early termination
|
|
setupTimeout: '60s',
|
|
teardownTimeout: '60s',
|
|
noConnectionReuse: false,
|
|
userAgent: 'k6-load-test/1.0',
|
|
};
|
|
|
|
export default function () {
|
|
// Get load multiplier - how many concurrent requests each VU should make
|
|
const requestsPerVU = parseInt(__ENV.REQUESTS_PER_VU) || 1;
|
|
|
|
try {
|
|
// Step 1: Get authenticated user (cached per VU)
|
|
const userAuth = getAuthenticatedUser();
|
|
|
|
// Handle authentication failure gracefully (null returned from auth fix)
|
|
if (!userAuth || !userAuth.access_token) {
|
|
console.log(`⚠️ VU ${__VU} has no valid authentication - skipping core API test`);
|
|
check(null, {
|
|
'Core API: Failed gracefully without crashing VU': () => true,
|
|
});
|
|
return; // Exit iteration gracefully without crashing
|
|
}
|
|
|
|
const headers = getAuthHeaders(userAuth.access_token);
|
|
|
|
console.log(`🚀 VU ${__VU} making ${requestsPerVU} concurrent API requests...`);
|
|
|
|
// Create array of API requests to run concurrently
|
|
const requests = [];
|
|
|
|
for (let i = 0; i < requestsPerVU; i++) {
|
|
// Add core API requests that represent realistic user workflows
|
|
requests.push({
|
|
method: 'GET',
|
|
url: `${config.API_BASE_URL}/api/credits`,
|
|
params: { headers }
|
|
});
|
|
|
|
requests.push({
|
|
method: 'GET',
|
|
url: `${config.API_BASE_URL}/api/graphs`,
|
|
params: { headers }
|
|
});
|
|
|
|
requests.push({
|
|
method: 'GET',
|
|
url: `${config.API_BASE_URL}/api/blocks`,
|
|
params: { headers }
|
|
});
|
|
}
|
|
|
|
// Execute all requests concurrently
|
|
const responses = http.batch(requests);
|
|
|
|
// Validate results
|
|
let creditsSuccesses = 0;
|
|
let graphsSuccesses = 0;
|
|
let blocksSuccesses = 0;
|
|
|
|
for (let i = 0; i < responses.length; i++) {
|
|
const response = responses[i];
|
|
const apiType = i % 3; // 0=credits, 1=graphs, 2=blocks
|
|
|
|
if (apiType === 0) {
|
|
// Credits API request
|
|
const creditsCheck = check(response, {
|
|
'Credits API: Status is 200': (r) => r.status === 200,
|
|
'Credits API: Response has credits': (r) => {
|
|
try {
|
|
const data = JSON.parse(r.body);
|
|
return data && typeof data.credits === 'number';
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
},
|
|
});
|
|
if (creditsCheck) creditsSuccesses++;
|
|
} else if (apiType === 1) {
|
|
// Graphs API request
|
|
const graphsCheck = check(response, {
|
|
'Graphs API: Status is 200': (r) => r.status === 200,
|
|
'Graphs API: Response is array': (r) => {
|
|
try {
|
|
const data = JSON.parse(r.body);
|
|
return Array.isArray(data);
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
},
|
|
});
|
|
if (graphsCheck) graphsSuccesses++;
|
|
} else {
|
|
// Blocks API request
|
|
const blocksCheck = check(response, {
|
|
'Blocks API: Status is 200': (r) => r.status === 200,
|
|
'Blocks API: Response has blocks': (r) => {
|
|
try {
|
|
const data = JSON.parse(r.body);
|
|
return data && (Array.isArray(data) || typeof data === 'object');
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
},
|
|
});
|
|
if (blocksCheck) blocksSuccesses++;
|
|
}
|
|
}
|
|
|
|
console.log(`✅ VU ${__VU} completed: ${creditsSuccesses}/${requestsPerVU} credits, ${graphsSuccesses}/${requestsPerVU} graphs, ${blocksSuccesses}/${requestsPerVU} blocks successful`);
|
|
|
|
} catch (error) {
|
|
console.error(`💥 Test failed: ${error.message}`);
|
|
console.error(`💥 Stack: ${error.stack}`);
|
|
}
|
|
} |