96 lines
3.9 KiB
JavaScript
96 lines
3.9 KiB
JavaScript
'use strict';
|
|
|
|
const http = require('http');
|
|
const { createApp } = require('../src/server');
|
|
|
|
async function request(server, opts) {
|
|
return new Promise((resolve, reject) => {
|
|
const port = server.address().port;
|
|
const headers = { ...(opts.headers || {}) };
|
|
if (opts.cookie) headers['Cookie'] = opts.cookie;
|
|
if (opts.body) headers['Content-Type'] = 'application/json';
|
|
const req = http.request({
|
|
hostname: '127.0.0.1',
|
|
port,
|
|
path: opts.path,
|
|
method: opts.method || 'GET',
|
|
headers,
|
|
}, (res) => {
|
|
const chunks = [];
|
|
res.on('data', (c) => chunks.push(c));
|
|
res.on('end', () => {
|
|
const body = Buffer.concat(chunks).toString('utf8');
|
|
let json = null;
|
|
try { json = JSON.parse(body); } catch (_) {}
|
|
resolve({ status: res.statusCode, headers: res.headers, body, json });
|
|
});
|
|
});
|
|
req.on('error', reject);
|
|
if (opts.body) req.write(JSON.stringify(opts.body));
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
function assert(cond, msg) {
|
|
if (!cond) throw new Error('assertion failed: ' + msg);
|
|
process.stdout.write(` ✓ ${msg}\n`);
|
|
}
|
|
|
|
async function main() {
|
|
const { server, shutdown } = createApp();
|
|
await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
|
|
const port = server.address().port;
|
|
process.stdout.write(`smoke: server listening on 127.0.0.1:${port}\n`);
|
|
|
|
try {
|
|
const badLogin = await request(server, { method: 'POST', path: '/api/auth/login', body: { password: 'wrong' } });
|
|
assert(badLogin.status === 401, 'wrong password returns 401');
|
|
|
|
const login = await request(server, { method: 'POST', path: '/api/auth/login', body: { password: process.env.SITE_PASSWORD } });
|
|
assert(login.status === 200, 'correct password returns 200');
|
|
assert(login.json && login.json.success === true, 'login response has success: true');
|
|
const cookie = login.headers['set-cookie']?.[0]?.split(';')[0];
|
|
assert(cookie && cookie.startsWith('auth_token='), 'auth_token cookie set');
|
|
|
|
const checkAuth = await request(server, { path: '/api/auth/check', cookie });
|
|
assert(checkAuth.json && checkAuth.json.authenticated === true, 'auth check returns authenticated');
|
|
|
|
const stats = await request(server, { path: '/api/stats', cookie });
|
|
assert(stats.status === 200, 'GET /api/stats returns 200');
|
|
assert(stats.json && stats.json.activeBots === 0, 'initial activeBots is 0');
|
|
assert(typeof stats.json.totalBotsSpawned === 'number', 'totalBotsSpawned is a number');
|
|
|
|
const proxyList = await request(server, { path: '/api/proxy/list', cookie });
|
|
assert(proxyList.status === 200, 'GET /api/proxy/list returns 200');
|
|
assert(proxyList.json && Array.isArray(proxyList.json.proxies), 'proxies is an array');
|
|
|
|
const strategies = await request(server, { path: '/api/test/strategies', cookie });
|
|
assert(strategies.status === 200, 'GET /api/test/strategies returns 200');
|
|
assert(strategies.json && Array.isArray(strategies.json.available), 'strategies has available list');
|
|
|
|
const badStart = await request(server, {
|
|
method: 'POST', path: '/api/test/start', cookie,
|
|
body: { target: 'not-a-url', bots: 1 },
|
|
});
|
|
assert(badStart.status === 400, 'invalid target returns 400');
|
|
|
|
const healthz = await request(server, { path: '/api/healthz' });
|
|
assert(healthz.status === 200, 'GET /api/healthz returns 200');
|
|
assert(healthz.json && healthz.json.status, 'healthz has status');
|
|
|
|
const metrics = await request(server, { path: '/api/metrics' });
|
|
assert(metrics.status === 200, 'GET /api/metrics returns 200');
|
|
assert(metrics.body.includes('crackedflooder_bots_active'), 'metrics has crackedflooder_bots_active');
|
|
|
|
process.stdout.write('smoke: all checks passed\n');
|
|
shutdown();
|
|
setTimeout(() => process.exit(0), 1000);
|
|
} catch (err) {
|
|
process.stderr.write(`smoke FAILED: ${err.message}\n`);
|
|
shutdown();
|
|
setTimeout(() => process.exit(1), 1000);
|
|
}
|
|
}
|
|
|
|
main();
|