Aufgaben-Python/courses/javascript/12_async_await_und_fetch/test_aufgabe.js

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!");