import { describe, expect, test } from "bun:test"; import { URL_CALENDRIER, compterEvenements, recupererFluxCalendrier, } from "./extension/nextcloud.js"; const FLUX_VALIDE = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nSUMMARY:Atelier\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"; function fetchQuiRenvoie(corps: string, status = 200) { return async () => new Response(corps, { status }); } describe("recupererFluxCalendrier", () => { test("succès : 200 + VCALENDAR → { ok:true, flux }", async () => { const res = await recupererFluxCalendrier(fetchQuiRenvoie(FLUX_VALIDE)); expect(res).toEqual({ ok: true, flux: FLUX_VALIDE }); }); test("non-connecté : 200 + page de login HTML → non-connecte", async () => { const res = await recupererFluxCalendrier( fetchQuiRenvoie("Login"), ); expect(res).toEqual({ ok: false, erreur: "non-connecte" }); }); test("non-connecté : status 401 → non-connecte", async () => { const res = await recupererFluxCalendrier(fetchQuiRenvoie("", 401)); expect(res).toEqual({ ok: false, erreur: "non-connecte" }); }); test("non-connecté : status 403 → non-connecte", async () => { const res = await recupererFluxCalendrier(fetchQuiRenvoie("", 403)); expect(res).toEqual({ ok: false, erreur: "non-connecte" }); }); test("serveur : status 500 → serveur", async () => { const res = await recupererFluxCalendrier(fetchQuiRenvoie("", 500)); expect(res).toEqual({ ok: false, erreur: "serveur" }); }); test("réseau : fetch lève → reseau", async () => { const res = await recupererFluxCalendrier(async () => { throw new TypeError("Failed to fetch"); }); expect(res).toEqual({ ok: false, erreur: "reseau" }); }); test("BOM / espaces en tête : reste un succès", async () => { const corps = "\r\n" + FLUX_VALIDE; const res = await recupererFluxCalendrier(fetchQuiRenvoie(corps)); expect(res).toEqual({ ok: true, flux: corps }); }); test("appelle fetchImpl avec URL_CALENDRIER et credentials:include", async () => { let urlVue: unknown; let optionsVues: unknown; await recupererFluxCalendrier(async (url, options) => { urlVue = url; optionsVues = options; return new Response(FLUX_VALIDE); }); expect(urlVue).toBe(URL_CALENDRIER); expect(optionsVues).toEqual({ credentials: "include" }); }); }); describe("compterEvenements", () => { test("compte 2 VEVENT", () => { const flux = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"; expect(compterEvenements(flux)).toBe(2); }); test("compte 0 quand aucun VEVENT", () => { expect(compterEvenements("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n")).toBe(0); }); test("ignore un BEGIN:VEVENT au milieu d'une DESCRIPTION", () => { const flux = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDESCRIPTION:texte BEGIN:VEVENT piège\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"; expect(compterEvenements(flux)).toBe(1); }); });