Kontrolle: Abschnitt Aufträge lädt auch bei ausgefallenen Projektkonten
Scheitert getProjektkonten, wird die Auftragsliste trotzdem geholt; kommt sie, bleibt der Abschnitt bedienbar und der Fehler der Projekte steht eigens daneben. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b556a459bb
commit
07d36f64e9
2 files changed
+60
-11
No files matched your search
@@ -11,12 +11,30 @@ const ohneProjektLeer = () => ({ berechnetCents: 0, bezahltCents: 0, anzahl: 0 }
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Lädt Projektkonten und, nur bei eingeschaltetem Schalter (`auftraegeAktiv === true`), die Aufträge des Kunden.
|
* Lädt Projektkonten und, nur bei eingeschaltetem Schalter (`auftraegeAktiv === true`), die Aufträge des Kunden.
|
||||||
* Scheitert getProjektkonten, geht der Fehler weiter (keine Aufträge, sie würden ohne Schalter 404 liefern).
|
|
||||||
* Scheitert nur listAuftraege, bleiben die Projektkonten und der Fehler steht eigens da.
|
* Scheitert nur listAuftraege, bleiben die Projektkonten und der Fehler steht eigens da.
|
||||||
* -> { konten, auftraege: Liste | null, auftraegeFehler: Text | '' }
|
* Scheitert getProjektkonten, wird die Auftragsliste trotzdem geholt (der Server prüft den Schalter ohnehin und antwortet bei
|
||||||
|
* „aus“ mit 404): kommt sie, bleibt der Abschnitt Aufträge bedienbar und der Fehler steht als `kontenFehler` daneben;
|
||||||
|
* kommt sie nicht, geht der Fehler der Projektkonten weiter.
|
||||||
|
* -> { konten, auftraege: Liste | null, auftraegeFehler: Text | '', kontenFehler?: Text (nur bei ausgefallenen Projektkonten) }
|
||||||
*/
|
*/
|
||||||
export async function ladeAuftraegeAnsicht(kundeId, { getProjektkonten, listAuftraege }) {
|
export async function ladeAuftraegeAnsicht(kundeId, { getProjektkonten, listAuftraege }) {
|
||||||
const antwort = await getProjektkonten(kundeId)
|
let antwort
|
||||||
|
try {
|
||||||
|
antwort = await getProjektkonten(kundeId)
|
||||||
|
} catch (kontenErr) {
|
||||||
|
let liste
|
||||||
|
try {
|
||||||
|
liste = await listAuftraege(kundeId)
|
||||||
|
} catch {
|
||||||
|
throw kontenErr
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
konten: {},
|
||||||
|
kontenFehler: (kontenErr && kontenErr.message) || KONTEN_FEHLER,
|
||||||
|
auftraege: Array.isArray(liste?.auftraege) ? liste.auftraege : [],
|
||||||
|
auftraegeFehler: '',
|
||||||
|
}
|
||||||
|
}
|
||||||
const konten = istObjekt(antwort) ? antwort : {}
|
const konten = istObjekt(antwort) ? antwort : {}
|
||||||
if (konten.auftraegeAktiv !== true) return { konten, auftraege: null, auftraegeFehler: '' }
|
if (konten.auftraegeAktiv !== true) return { konten, auftraege: null, auftraegeFehler: '' }
|
||||||
try {
|
try {
|
||||||
@@ -33,7 +51,8 @@ export async function ladeAuftraegeAnsicht(kundeId, { getProjektkonten, listAuft
|
|||||||
* auftraegeAktiv, auftraegeStatus: 'aus' | 'bereit' | 'fehler', auftraegeFehler,
|
* auftraegeAktiv, auftraegeStatus: 'aus' | 'bereit' | 'fehler', auftraegeFehler,
|
||||||
* konten, ohneProjekt, stripeOk, kunde, auftraege }
|
* konten, ohneProjekt, stripeOk, kunde, auftraege }
|
||||||
* Ohne Daten gibt es keinen Aufträge-Abschnitt (der Schalter ist noch unbekannt). Scheitert das Neuladen, nachdem Daten
|
* Ohne Daten gibt es keinen Aufträge-Abschnitt (der Schalter ist noch unbekannt). Scheitert das Neuladen, nachdem Daten
|
||||||
* da sind, bleiben die alten Daten stehen und die Meldung kommt als `nachladeFehler` daneben.
|
* da sind, bleiben die alten Daten stehen und die Meldung kommt als `nachladeFehler` daneben. Waren die Projektkonten
|
||||||
|
* ausgefallen und die Aufträge trotzdem da (`data.kontenFehler`), ist `projekteStatus` „fehler“ und die Aufträge sind bereit.
|
||||||
*/
|
*/
|
||||||
export function ansichtsZustand({ data, error } = {}) {
|
export function ansichtsZustand({ data, error } = {}) {
|
||||||
if (!data) {
|
if (!data) {
|
||||||
@@ -52,12 +71,14 @@ export function ansichtsZustand({ data, error } = {}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const k = istObjekt(data.konten) ? data.konten : {}
|
const k = istObjekt(data.konten) ? data.konten : {}
|
||||||
const auftraegeAktiv = k.auftraegeAktiv === true
|
const kontenFehler = typeof data.kontenFehler === 'string' ? data.kontenFehler : ''
|
||||||
|
// Mit ausgefallenen Projektkonten gilt der Schalter als an, wenn der Server die Auftragsliste geliefert hat
|
||||||
|
const auftraegeAktiv = kontenFehler ? Array.isArray(data.auftraege) : k.auftraegeAktiv === true
|
||||||
const auftraegeStatus = !auftraegeAktiv ? 'aus' : data.auftraegeFehler ? 'fehler' : 'bereit'
|
const auftraegeStatus = !auftraegeAktiv ? 'aus' : data.auftraegeFehler ? 'fehler' : 'bereit'
|
||||||
return {
|
return {
|
||||||
projekteStatus: 'bereit',
|
projekteStatus: kontenFehler ? 'fehler' : 'bereit',
|
||||||
fehler: '',
|
fehler: kontenFehler ? error || kontenFehler : '',
|
||||||
nachladeFehler: error || '',
|
nachladeFehler: kontenFehler ? '' : error || '',
|
||||||
auftraegeAktiv,
|
auftraegeAktiv,
|
||||||
auftraegeStatus,
|
auftraegeStatus,
|
||||||
auftraegeFehler: auftraegeStatus === 'fehler' ? data.auftraegeFehler : '',
|
auftraegeFehler: auftraegeStatus === 'fehler' ? data.auftraegeFehler : '',
|
||||||
|
|||||||
@@ -72,11 +72,39 @@ test('Aufträge scheitern allein: die Projektkonten bleiben, der Fehler steht ei
|
|||||||
assert.equal(AUFTRAEGE_FEHLER, 'Die Aufträge konnten nicht geladen werden.')
|
assert.equal(AUFTRAEGE_FEHLER, 'Die Aufträge konnten nicht geladen werden.')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('Projektkonten scheitern: der Fehler geht weiter, die Aufträge werden nicht abgerufen', async () => {
|
test('Projektkonten scheitern, Aufträge laden: der Abschnitt Aufträge bleibt bedienbar, der Konten-Fehler steht eigens da', async () => {
|
||||||
const fehler = Object.assign(new Error('Interner Fehler.'), { status: 500 })
|
const fehler = Object.assign(new Error('Interner Fehler.'), { status: 500 })
|
||||||
const api = fakeApi({ projektkonten: fehler, auftraege: { auftraege: [] } })
|
const liste = [{ id: 'a1', nummer: 'AB-2026-0001', status: 'versendet' }]
|
||||||
|
const api = fakeApi({ projektkonten: fehler, auftraege: { auftraege: liste } })
|
||||||
|
const result = await ladeAuftraegeAnsicht('k1', api)
|
||||||
|
assert.deepEqual(api.calls, [['konten', 'k1'], ['auftraege', 'k1']])
|
||||||
|
assert.deepEqual(result, { konten: {}, kontenFehler: 'Interner Fehler.', auftraege: liste, auftraegeFehler: '' })
|
||||||
|
const ohneText = await ladeAuftraegeAnsicht('k1', fakeApi({ projektkonten: new Error(''), auftraege: { auftraege: liste } }))
|
||||||
|
assert.equal(ohneText.kontenFehler, KONTEN_FEHLER)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('Projektkonten und Aufträge scheitern: der Fehler der Projektkonten geht weiter (Schalter aus gibt 404)', async () => {
|
||||||
|
const fehler = Object.assign(new Error('Interner Fehler.'), { status: 500 })
|
||||||
|
const api = fakeApi({ projektkonten: fehler, auftraege: Object.assign(new Error('Nicht gefunden.'), { status: 404 }) })
|
||||||
await assert.rejects(ladeAuftraegeAnsicht('k1', api), (e) => e === fehler)
|
await assert.rejects(ladeAuftraegeAnsicht('k1', api), (e) => e === fehler)
|
||||||
assert.deepEqual(api.calls, [['konten', 'k1']])
|
assert.deepEqual(api.calls, [['konten', 'k1'], ['auftraege', 'k1']])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('ansichtsZustand: Projekte-Fehler mit geladenen Aufträgen – Projekte „fehler“, Aufträge „bereit“', () => {
|
||||||
|
const liste = [{ id: 'a1' }]
|
||||||
|
const z = ansichtsZustand({ data: { konten: {}, kontenFehler: 'Interner Fehler.', auftraege: liste, auftraegeFehler: '' }, error: '' })
|
||||||
|
assert.equal(z.projekteStatus, 'fehler')
|
||||||
|
assert.equal(z.fehler, 'Interner Fehler.')
|
||||||
|
assert.equal(z.auftraegeAktiv, true) // der Server hat die Liste geliefert, der Schalter ist also an
|
||||||
|
assert.equal(z.auftraegeStatus, 'bereit')
|
||||||
|
assert.deepEqual(z.auftraege, liste)
|
||||||
|
assert.deepEqual(z.konten, [])
|
||||||
|
assert.equal(z.nachladeFehler, '')
|
||||||
|
// scheitert auch ein späteres Neuladen, steht dessen Meldung im Fehlerkasten; die Aufträge bleiben stehen
|
||||||
|
const spaeter = ansichtsZustand({ data: { konten: {}, kontenFehler: 'Interner Fehler.', auftraege: liste, auftraegeFehler: '' }, error: 'Netz weg' })
|
||||||
|
assert.equal(spaeter.projekteStatus, 'fehler')
|
||||||
|
assert.equal(spaeter.fehler, 'Netz weg')
|
||||||
|
assert.equal(spaeter.auftraegeStatus, 'bereit')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('ansichtsZustand: vor der ersten Antwort „laden“, nach einem Fehler „fehler“ mit der Meldung', () => {
|
test('ansichtsZustand: vor der ersten Antwort „laden“, nach einem Fehler „fehler“ mit der Meldung', () => {
|
||||||
|
|||||||
Reference in new issue
Block a user