const assert = require('node:assert/strict'); const http = require('node:http'); const test = require('node:test'); const { AgrarmonitorConnector, MemoryCookieStore } = require('../dist'); // Kopfzeile der Detailseite /eingangsrechnungen/detail/, wie sie AM aktuell liefert. const statusZeile = inhalt => `

${inhalt}

`; const seiten = { // Seit AM den Link "Zahlung erfassen" hinter dem Buchungsstatus anzeigt. 387605: statusZeile(` Empfangen am 21.09.26 - Gebucht am 27.09.26 - Zahlung erfassen`), 387606: statusZeile(` Empfangen am 21.09.26 - Nicht gebucht`), 387607: statusZeile(` Nicht empfangen - Nicht gebucht`), // Altes Layout ohne id am Buchungsstatus. 387608: statusZeile(` Empfangen am 01.10.26 - Gebucht am 02.10.26`), }; async function startConnector(t) { const server = http.createServer((req, res) => { req.resume(); req.on('end', () => { if (req.method === 'POST' && req.url === '/login/api/login.php') { res.writeHead(200, { 'Content-Type': 'application/json', 'Set-Cookie': 'agrar_session=test; Path=/' }); res.end(JSON.stringify({ success: true })); return; } if (req.method === 'GET' && req.url === '/') { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end('Mein AM'); return; } const match = /^\/eingangsrechnungen\/detail\/(\d+)$/.exec(req.url ?? ''); if (req.method === 'GET' && match && seiten[match[1]]) { res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end(seiten[match[1]]); return; } res.writeHead(404); res.end('not found'); }); }); await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); t.after(() => new Promise(resolve => server.close(resolve))); const connector = new AgrarmonitorConnector({ baseUrl: `http://127.0.0.1:${server.address().port}`, username: 'demo', password: 'secret', cookieStore: new MemoryCookieStore(), }); await connector.init(); return connector; } const tag = d => d && [d.getFullYear(), d.getMonth() + 1, d.getDate()]; test('Detailseite: Buchungsdatum trotz nachfolgendem "Zahlung erfassen"', async t => { const connector = await startConnector(t); const meta = await connector.getEingangsrechnungDetailMeta(387605); assert.deepEqual(tag(meta.eingangsDatum), [2026, 9, 21]); assert.deepEqual(tag(meta.buchungsDatum), [2026, 9, 27]); }); test('Detailseite: nicht gebucht liefert kein Buchungsdatum', async t => { const connector = await startConnector(t); const meta = await connector.getEingangsrechnungDetailMeta(387606); assert.deepEqual(tag(meta.eingangsDatum), [2026, 9, 21]); assert.equal(meta.buchungsDatum, null); }); test('Detailseite: nicht empfangen und nicht gebucht', async t => { const connector = await startConnector(t); const meta = await connector.getEingangsrechnungDetailMeta(387607); assert.equal(meta.eingangsDatum, null); assert.equal(meta.buchungsDatum, null); }); test('Detailseite: altes Layout ohne #bookedStatus', async t => { const connector = await startConnector(t); const meta = await connector.getEingangsrechnungDetailMeta(387608); assert.deepEqual(tag(meta.eingangsDatum), [2026, 10, 1]); assert.deepEqual(tag(meta.buchungsDatum), [2026, 10, 2]); });