Files
AgrarmonitorConnector/test/eingangsrechnung-edit.test.js
T
bjoernpoettkerandClaude Opus 5.5 f54a0fe155 Eingangsrechnungen: Fehlergrund von update.php weitergeben
update.php antwortet bei Validierungsfehlern mit HTTP 422 und nennt den
Grund im Body. Bisher warf Axios dabei nur "Request failed with status
code 422". Jetzt werden 4xx-Antworten ausgewertet und msg bzw. der Body
in die Fehlermeldung uebernommen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:22:21 +02:00

183 lines
6.2 KiB
JavaScript

const assert = require('node:assert/strict');
const http = require('node:http');
const test = require('node:test');
const { AgrarmonitorConnector, MemoryCookieStore } = require('../dist');
// Gekuerzter Formularausschnitt, wie ihn editForm.php liefert.
const editForm = `
<form id="rechnung-detail">
<select name="typ" id="typ">
<option value="0" selected>Eingangsrechnung</option>
<option value="1">Gutschrift</option>
</select>
<select name="mengenUndPreisAnpassung">
<option value="0" selected>Preise und Mengen beibehalten</option>
<option value="1">Anpassen</option>
</select>
<input type="text" name="lieferscheinnummer" value="">
<input type="text" name="rechnungsnummer" id="rechnungsnummer" value="5355771416">
<input type="text" name="rechnungsdatum" value="19.08.26">
<select name="firma_id">
<option value="1">Andere GmbH</option>
<option value="3" selected>Poettker GmbH</option>
</select>
<select name="rgempf">
<option value="34079" selected>15550519 TUEV NORD Mobilitaet</option>
</select>
<input name="addressName" value="TUEV NORD Mobilitaet GmbH &amp; Co. KG">
<input name="additionalAddressLineOne" value="">
<input name="additionalAddressLineTwo" value="">
<input name="addressStreet" value="Postfach 810551">
<input name="addressPostalcode" value="30505">
<input name="addressCity" value="Hannover">
<select name="addressCountryISO3166">
<option value="DE" selected>Deutschland</option>
</select>
<textarea name="notiz">Zeile 1</textarea>
<button type="submit" name="speichern">Speichern</button>
</form>
<script>admin.Eingangsrechnungen.editRechnung(388444);</script>
`;
function createServer({ updateResponse = [], updateStatus = 200 } = {}) {
const requests = [];
const server = http.createServer((req, res) => {
let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
requests.push({ method: req.method, url: req.url, headers: req.headers, body });
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;
}
if (req.method === 'GET' && req.url === '/module/eingangsrechnungen/api/editForm.php?invoiceID=388444') {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(editForm);
return;
}
if (req.method === 'POST' && req.url === '/module/eingangsrechnungen/api/update.php') {
res.writeHead(updateStatus, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(updateResponse));
return;
}
res.writeHead(404);
res.end('not found');
});
});
return { server, requests };
}
async function startConnector(t, options) {
const { server, requests } = createServer(options);
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, requests };
}
test('getRechnungsdaten liest das Formular aus editForm.php', async t => {
const { connector } = await startConnector(t);
const daten = await connector.getRechnungsdaten(388444);
assert.equal(daten.lieferschein, '');
assert.equal(daten.rechnung, '5355771416');
assert.equal(daten.kundenId, 34079);
assert.equal(daten.adresstext, 'TUEV NORD Mobilitaet GmbH & Co. KG');
assert.equal(daten.datum.getFullYear(), 2026);
assert.equal(daten.datum.getMonth(), 7);
assert.equal(daten.datum.getDate(), 19);
});
test('setLieferscheinNummer schickt das komplette Formular als JSON an update.php', async t => {
const { connector, requests } = await startConnector(t);
await connector.setLieferscheinNummer(388444, '2026-001107');
const update = requests.find(request => request.url === '/module/eingangsrechnungen/api/update.php');
assert.ok(update, 'update.php wurde nicht aufgerufen');
assert.equal(update.method, 'POST');
assert.match(update.headers['content-type'], /^application\/json/);
assert.deepEqual(JSON.parse(update.body), {
rechnungID: 388444,
formData: {
typ: '0',
mengenUndPreisAnpassung: '0',
lieferscheinnummer: '2026-001107',
rechnungsnummer: '5355771416',
rechnungsdatum: '19.08.26',
firma_id: '3',
rgempf: '34079',
addressName: 'TUEV NORD Mobilitaet GmbH & Co. KG',
additionalAddressLineOne: '',
additionalAddressLineTwo: '',
addressStreet: 'Postfach 810551',
addressPostalcode: '30505',
addressCity: 'Hannover',
addressCountryISO3166: 'DE',
notiz: 'Zeile 1',
},
});
});
test('setRechnungsdaten meldet die Fehlermeldung aus update.php', async t => {
const { connector } = await startConnector(t, { updateResponse: { msg: 'Rechnung ist gesperrt' } });
await assert.rejects(
connector.setLieferscheinNummer(388444, '2026-001107'),
/Rechnung ist gesperrt/
);
});
test('setRechnungsdaten gibt bei HTTP 422 den Grund aus dem Body weiter', async t => {
const { connector } = await startConnector(t, {
updateStatus: 422,
updateResponse: { msg: 'Rechnungsdatum ungueltig' },
});
await assert.rejects(
connector.setLieferscheinNummer(388444, '2026-001107'),
/HTTP 422\): Rechnungsdatum ungueltig/
);
});
test('setRechnungsdaten zeigt bei 422 ohne msg den Body', async t => {
const { connector } = await startConnector(t, {
updateStatus: 422,
updateResponse: { errors: { rgempf: 'fehlt' } },
});
await assert.rejects(
connector.setLieferscheinNummer(388444, '2026-001107'),
/HTTP 422\): \{"errors":\{"rgempf":"fehlt"\}\}/
);
});