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. test("bundles the CLI outside the dev app archive", async () => {
  49. const previous = process.env.OPENCODE_CHANNEL
  50. process.env.OPENCODE_CHANNEL = "dev"
  51. const module = await import("./electron-builder.config.ts?cli-resource")
  52. const config = module.default as Configuration
  53. if (previous === undefined) delete process.env.OPENCODE_CHANNEL
  54. else process.env.OPENCODE_CHANNEL = previous
  55. expect(config.files).toContain("!resources/opencode-cli*")
  56. expect(config.extraResources).toContainEqual({
  57. from: "resources/",
  58. to: "",
  59. filter: ["opencode-cli*"],
  60. })
  61. })
  62. for (const channel of ["beta", "prod"] as const) {
  63. test(`does not bundle the CLI in ${channel} builds`, async () => {
  64. const previous = process.env.OPENCODE_CHANNEL
  65. process.env.OPENCODE_CHANNEL = channel
  66. const module = await import(`./electron-builder.config.ts?no-cli-resource=${channel}`)
  67. const config = module.default as Configuration
  68. if (previous === undefined) delete process.env.OPENCODE_CHANNEL
  69. else process.env.OPENCODE_CHANNEL = previous
  70. expect(config.extraResources).not.toContainEqual({
  71. from: "resources/",
  72. to: "",
  73. filter: ["opencode-cli*"],
  74. })
  75. })
  76. }