theme-preload.test.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { beforeEach, describe, expect, test } from "bun:test"
  2. const src = await Bun.file(new URL("../public/oc-theme-preload.js", import.meta.url)).text()
  3. const run = () => Function(src)()
  4. beforeEach(() => {
  5. document.head.innerHTML = ""
  6. document.documentElement.removeAttribute("data-theme")
  7. document.documentElement.removeAttribute("data-color-scheme")
  8. localStorage.clear()
  9. Object.defineProperty(window, "matchMedia", {
  10. value: () =>
  11. ({
  12. matches: false,
  13. }) as MediaQueryList,
  14. configurable: true,
  15. })
  16. })
  17. describe("theme preload", () => {
  18. test("migrates legacy oc-1 to oc-2 before mount", () => {
  19. localStorage.setItem("opencode-theme-id", "oc-1")
  20. localStorage.setItem("opencode-theme-css-light", "--background-base:#fff;")
  21. localStorage.setItem("opencode-theme-css-dark", "--background-base:#000;")
  22. run()
  23. expect(document.documentElement.dataset.theme).toBe("oc-2")
  24. expect(document.documentElement.dataset.colorScheme).toBe("light")
  25. expect(localStorage.getItem("opencode-theme-id")).toBe("oc-2")
  26. expect(localStorage.getItem("opencode-theme-css-light")).toBeNull()
  27. expect(localStorage.getItem("opencode-theme-css-dark")).toBeNull()
  28. expect(document.getElementById("oc-theme-preload")).toBeNull()
  29. })
  30. test("keeps cached css for non-default themes", () => {
  31. localStorage.setItem("opencode-theme-id", "nightowl")
  32. localStorage.setItem("opencode-theme-css-light", "--background-base:#fff;")
  33. run()
  34. expect(document.documentElement.dataset.theme).toBe("nightowl")
  35. expect(document.getElementById("oc-theme-preload")?.textContent).toContain("--background-base:#fff;")
  36. })
  37. })