electron-builder.config.test.ts 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { expect, test } from "bun:test"
  2. import type { Configuration } from "electron-builder"
  3. const legacyDesktopEntry = "resources/linux/opencode-desktop.desktop"
  4. const channels = [
  5. { channel: "dev", appId: "ai.opencode.desktop.dev" },
  6. { channel: "beta", appId: "ai.opencode.desktop.beta" },
  7. { channel: "prod", appId: "ai.opencode.desktop" },
  8. ] as const
  9. for (const channel of channels) {
  10. test(`uses one Linux desktop identity for ${channel.channel}`, async () => {
  11. const previous = process.env.OPENCODE_CHANNEL
  12. process.env.OPENCODE_CHANNEL = channel.channel
  13. const module = await import(`./electron-builder.config.ts?channel=${channel.channel}`)
  14. const config = module.default as Configuration
  15. if (previous === undefined) delete process.env.OPENCODE_CHANNEL
  16. else process.env.OPENCODE_CHANNEL = previous
  17. expect(config.appId).toBe(channel.appId)
  18. expect(config.extraMetadata?.desktopName).toBe(`${channel.appId}.desktop`)
  19. expect(config.linux?.executableName).toBe(channel.appId)
  20. expect(config.linux?.desktop?.entry?.StartupWMClass).toBe(channel.appId)
  21. expect(config.deb?.fpm).toContainEqual(expect.stringContaining(`/usr/share/metainfo/${channel.appId}.metainfo.xml`))
  22. expect(config.rpm?.fpm).toContainEqual(expect.stringContaining(`/usr/share/metainfo/${channel.appId}.metainfo.xml`))
  23. })
  24. }
  25. test("keeps a hidden prod launcher for old Linux pins", async () => {
  26. const previous = process.env.OPENCODE_CHANNEL
  27. process.env.OPENCODE_CHANNEL = "prod"
  28. const module = await import("./electron-builder.config.ts?compat=prod")
  29. const config = module.default as Configuration
  30. if (previous === undefined) delete process.env.OPENCODE_CHANNEL
  31. else process.env.OPENCODE_CHANNEL = previous
  32. expect(
  33. config.deb?.fpm?.some((entry) =>
  34. entry.endsWith("opencode-desktop.desktop=/usr/share/applications/opencode-desktop.desktop"),
  35. ),
  36. ).toBe(true)
  37. expect(
  38. config.rpm?.fpm?.some((entry) =>
  39. entry.endsWith("opencode-desktop.desktop=/usr/share/applications/opencode-desktop.desktop"),
  40. ),
  41. ).toBe(true)
  42. const desktop = await Bun.file(legacyDesktopEntry).text()
  43. expect(desktop).toContain("Exec=/opt/OpenCode/ai.opencode.desktop %U")
  44. expect(desktop).toContain("Icon=ai.opencode.desktop")
  45. expect(desktop).toContain("StartupWMClass=ai.opencode.desktop")
  46. expect(desktop).toContain("NoDisplay=true")
  47. })
  48. for (const channel of ["dev", "beta"] as const) {
  49. test(`bundles the CLI outside the ${channel} app archive`, async () => {
  50. const previous = process.env.OPENCODE_CHANNEL
  51. process.env.OPENCODE_CHANNEL = channel
  52. const module = await import(`./electron-builder.config.ts?cli-resource=${channel}`)
  53. const config = module.default as Configuration
  54. if (previous === undefined) delete process.env.OPENCODE_CHANNEL
  55. else process.env.OPENCODE_CHANNEL = previous
  56. expect(config.files).toContain("!resources/opencode-cli*")
  57. expect(config.extraResources).toContainEqual({
  58. from: "resources/",
  59. to: "",
  60. filter: ["opencode-cli*"],
  61. })
  62. })
  63. }
  64. test("does not bundle the CLI in prod builds", async () => {
  65. const previous = process.env.OPENCODE_CHANNEL
  66. process.env.OPENCODE_CHANNEL = "prod"
  67. const module = await import("./electron-builder.config.ts?no-cli-resource=prod")
  68. const config = module.default as Configuration
  69. if (previous === undefined) delete process.env.OPENCODE_CHANNEL
  70. else process.env.OPENCODE_CHANNEL = previous
  71. expect(config.extraResources).not.toContainEqual({
  72. from: "resources/",
  73. to: "",
  74. filter: ["opencode-cli*"],
  75. })
  76. })