138 lines
4.6 KiB
JavaScript
138 lines
4.6 KiB
JavaScript
// Hilfsfunktion für Fehler-Prüfung
|
|
async function pruefeReject(promise, expectedMsg, beschreibung) {
|
|
let threw = false;
|
|
let caughtErr = null;
|
|
try {
|
|
await promise;
|
|
} catch (err) {
|
|
threw = true;
|
|
caughtErr = err;
|
|
if (expectedMsg && !String(err && (err.message || err)).includes(expectedMsg)) {
|
|
throw new Error(`${beschreibung}: Erwartete Fehlermeldung "${expectedMsg}", aber erhalten: "${err ? err.message : err}"`);
|
|
}
|
|
}
|
|
if (!threw) {
|
|
throw new Error(`${beschreibung}: Funktion sollte Fehler werfen / rejecten, war aber erfolgreich.`);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------
|
|
// Mock-APIs definieren
|
|
// ----------------------------------------------------
|
|
const mockWetterApi = async (stadt) => {
|
|
if (stadt === "Berlin") {
|
|
return {
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => ({ stadt: "Berlin", temperatur: 21, wetterlage: "Sonnig", feuchtigkeit: "55%" })
|
|
};
|
|
} else if (stadt === "München") {
|
|
return {
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => ({ stadt: "München", temperatur: 18, wetterlage: "Regnerisch" })
|
|
};
|
|
} else {
|
|
return {
|
|
ok: false,
|
|
status: 404,
|
|
json: async () => ({ fehler: "Stadt nicht gefunden" })
|
|
};
|
|
}
|
|
};
|
|
|
|
const mockPostApi = async (userId) => {
|
|
if (userId === 10) {
|
|
return {
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => [
|
|
{ id: 1, titel: "Einführung in JS" },
|
|
{ id: 2, titel: "Async Await Guide" },
|
|
{ id: 3, titel: "REST-APIs verstehen" }
|
|
]
|
|
};
|
|
} else if (userId === 99) {
|
|
return [
|
|
{ id: 4, titel: "Einzelbeitrag" }
|
|
];
|
|
} else {
|
|
return {
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => []
|
|
};
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------
|
|
// 1. Test: holeWetterDaten (Erfolg)
|
|
// ----------------------------------------------------
|
|
const wetterBerlin = await holeWetterDaten("Berlin", mockWetterApi);
|
|
assert.deepStrictEqual(
|
|
wetterBerlin,
|
|
{ stadt: "Berlin", temperatur: 21, wetterlage: "Sonnig" },
|
|
"holeWetterDaten('Berlin') liefert unerwartetes Wetter-Objekt"
|
|
);
|
|
|
|
const wetterMuenchen = await holeWetterDaten("München", mockWetterApi);
|
|
assert.strictEqual(wetterMuenchen.temperatur, 18, "Temperatur für München sollte 18 sein");
|
|
assert.strictEqual(wetterMuenchen.wetterlage, "Regnerisch", "Wetterlage für München sollte Regnerisch sein");
|
|
|
|
// ----------------------------------------------------
|
|
// 2. Test: holeWetterDaten (404 Fehler)
|
|
// ----------------------------------------------------
|
|
await pruefeReject(
|
|
holeWetterDaten("Atlantis", mockWetterApi),
|
|
"Atlantis",
|
|
"holeWetterDaten für unbekannte Stadt muss Fehler werfen"
|
|
);
|
|
|
|
// ----------------------------------------------------
|
|
// 3. Test: aggregiereBenutzerPosts
|
|
// ----------------------------------------------------
|
|
const posts10 = await aggregiereBenutzerPosts(10, mockPostApi);
|
|
assert.deepStrictEqual(
|
|
posts10,
|
|
{
|
|
userId: 10,
|
|
anzahlPosts: 3,
|
|
postTitel: ["Einführung in JS", "Async Await Guide", "REST-APIs verstehen"]
|
|
},
|
|
"aggregiereBenutzerPosts(10) liefert falsches Aggregat"
|
|
);
|
|
|
|
const posts99 = await aggregiereBenutzerPosts(99, mockPostApi);
|
|
assert.strictEqual(posts99.anzahlPosts, 1, "User 99 sollte genau 1 Post haben");
|
|
assert.deepStrictEqual(posts99.postTitel, ["Einzelbeitrag"], "Post-Titel für User 99 fehlerhaft");
|
|
|
|
const postsLeer = await aggregiereBenutzerPosts(999, mockPostApi);
|
|
assert.strictEqual(postsLeer.anzahlPosts, 0, "User 999 sollte 0 Posts haben");
|
|
assert.deepStrictEqual(postsLeer.postTitel, [], "Leere Post-Titel-Liste erwartet");
|
|
|
|
// ----------------------------------------------------
|
|
// 4. Test: sichererApiAufruf
|
|
// ----------------------------------------------------
|
|
// 4a: Erfolgreiches Promise
|
|
const ergErfolg = await sichererApiAufruf(Promise.resolve("Daten geladen!"), "Standard");
|
|
assert.strictEqual(ergErfolg, "Daten geladen!", "sichererApiAufruf sollte den aufgelösten Wert zurückgeben");
|
|
|
|
// 4b: Fehlgeschlagenes Promise (muss abgefangen werden)
|
|
const ergFehler = await sichererApiAufruf(
|
|
Promise.reject(new Error("Netzwerk-Timeout")),
|
|
"Standard-Fallback"
|
|
);
|
|
assert.strictEqual(ergFehler, "Standard-Fallback", "sichererApiAufruf sollte Fallback zurückgeben bei Rejection");
|
|
|
|
// 4c: Async Funktion, die eine Exception wirft
|
|
const ergFnFehler = await sichererApiAufruf(
|
|
async () => { throw new Error("Kritischer API Crash"); },
|
|
{ status: "offline", data: [] }
|
|
);
|
|
assert.deepStrictEqual(
|
|
ergFnFehler,
|
|
{ status: "offline", data: [] },
|
|
"sichererApiAufruf sollte Fallback-Objekt bei geworfenem Fehler liefern"
|
|
);
|
|
|
|
console.log("✅ Alle Tests in JS 06 (Async/Await & REST-APIs) erfolgreich bestanden!");
|