import { describe, expect, it } from "vitest"

import { buendelPasst } from "./ota"
import type { Buendelangabe } from "../api"

const buendel = (teil: Partial<Buendelangabe> = {}): Buendelangabe => ({
  version: "2026.8.24.1",
  sha256: "a".repeat(64),
  bytes: 224186,
  gebaut: "2026-08-24T00:00:00Z",
  url: "/audi_dashboard_static/app/bundle.zip",
  ...teil,
})

/* buendelPasst() entscheidet, ob der Update-Knopf überhaupt erscheint - ein
   Fehler hier zeigt entweder einen Knopf, der ins Leere läuft (kein Bündel
   da), oder verbirgt ein echtes Update dauerhaft. */
describe("buendelPasst", () => {
  it("lehnt ab, wenn kein Bündel vorliegt", () => {
    expect(buendelPasst(null, "2026.8.23.2")).toBe(false)
  })

  it("lehnt ab, wenn Bündel- und eigene Version übereinstimmen", () => {
    expect(buendelPasst(buendel({ version: "2026.8.24.1" }), "2026.8.24.1")).toBe(false)
  })

  it("akzeptiert bei abweichender Version", () => {
    expect(buendelPasst(buendel({ version: "2026.8.24.2" }), "2026.8.24.1")).toBe(true)
  })

  it("lehnt ab, wenn die eigene Version unbekannt ist", () => {
    // null heißt "diese App weiß nicht, welche Version sie ist" (z. B. im
    // Dev-Server ohne eingebautes __APP_VERSION__) - dann lässt sich ein
    // Update nicht sinnvoll anbieten, weil "abweichend" nicht feststellbar ist.
    expect(buendelPasst(buendel(), null)).toBe(false)
  })

  it("lehnt ab, wenn dem Bündel Pflichtfelder fehlen", () => {
    expect(buendelPasst(buendel({ url: "" }), "2026.8.23.2")).toBe(false)
    expect(buendelPasst(buendel({ sha256: "" }), "2026.8.23.2")).toBe(false)
    expect(buendelPasst(buendel({ version: "" }), "2026.8.23.2")).toBe(false)
  })
})
