const assert = require('node:assert/strict');
const http = require('node:http');
const test = require('node:test');
const { AgrarmonitorConnector, MemoryCookieStore } = require('../dist');
const loginPage = `
Anmeldung - AGRARMONITOR
`;
function createServer() {
let loggedIn = false;
const requests = [];
const server = http.createServer((req, res) => {
requests.push({ method: req.method, url: req.url });
if (req.method === 'GET' && req.url === '/') {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(loggedIn ? 'Mein AM' : loginPage);
return;
}
if (req.method === 'POST' && req.url === '/login/api/login.php') {
let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
const parsed = JSON.parse(body);
assert.equal(req.headers['content-type'], 'application/json');
assert.equal(parsed.username, 'demo');
assert.equal(parsed.passwort, 'secret');
assert.equal(parsed.nonce, 'test-nonce');
assert.equal(parsed.ssoAction, '');
assert.equal(parsed.ssoReturn, '');
loggedIn = true;
res.writeHead(200, {
'Content-Type': 'application/json',
'Set-Cookie': 'agrar_session=test; Path=/',
});
res.end(JSON.stringify({ success: true }));
});
return;
}
res.writeHead(404);
res.end('not found');
});
return { server, requests };
}
test('autoRetry does not deadlock on login-internal requests', async t => {
const { server, requests } = createServer();
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
t.after(() => new Promise(resolve => server.close(resolve)));
const address = server.address();
const baseUrl = `http://127.0.0.1:${address.port}`;
const connector = new AgrarmonitorConnector({
baseUrl,
username: 'demo',
password: 'secret',
cookieStore: new MemoryCookieStore(),
});
const timeout = new Promise((_, reject) => {
const timer = setTimeout(() => reject(new Error('Login deadlocked')), 2000);
timer.unref();
});
await Promise.race([connector.init(), timeout]);
const response = await Promise.race([connector.http.get('/'), timeout]);
assert.equal(response.status, 200);
assert.equal(requests.filter(request => request.url === '/login/api/login.php').length, 1);
assert.ok(requests.filter(request => request.method === 'GET' && request.url === '/').length >= 3);
});