Files
AgrarmonitorConnector/test/eingangsrechnung-detail.test.js
bjoernpoettkerandClaude Opus 5.5 9bda65eec0 Eingangsrechnungen: Buchungsstatus aus #bookedStatus lesen
Seit AM hinter dem Buchungsstatus "Zahlung erfassen" anzeigt, lieferte der
letzte Teil der Statuszeile kein Buchungsdatum mehr. Fallback fürs alte
Layout sucht den Teil mit "gebucht".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 14:02:07 +01:00

94 lines
3.7 KiB
JavaScript

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/<id>, wie sie AM aktuell liefert.
const statusZeile = inhalt => `<html><body><div class="content"><h3>${inhalt}</h3></div></body></html>`;
const seiten = {
// Seit AM den Link "Zahlung erfassen" hinter dem Buchungsstatus anzeigt.
387605: statusZeile(`
<a id="receivedStatus" class="pointer">Empfangen am 21.09.26</a> -
<a id="bookedStatus" class="pointer">Gebucht am 27.09.26</a>
- <a class="pointer" id="addPayment">Zahlung erfassen</a>`),
387606: statusZeile(`
<a id="receivedStatus" class="pointer">Empfangen am 21.09.26</a> -
<a id="bookedStatus" class="pointer">Nicht gebucht</a>`),
387607: statusZeile(`
<a id="receivedStatus" class="pointer">Nicht empfangen</a> -
<a id="bookedStatus" class="pointer">Nicht gebucht</a>`),
// Altes Layout ohne id am Buchungsstatus.
387608: statusZeile(`
<a id="receivedStatus" class="pointer">Empfangen am 01.10.26</a> - 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('<html><body>Mein AM</body></html>');
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]);
});