|
| 1 | +const { describe, test, expect } = require("bun:test"); |
| 2 | +const { extractName } = require("./config"); |
| 3 | + |
| 4 | +describe("extractName", () => { |
| 5 | + describe("version removal", () => { |
| 6 | + test("removes semver versions with v prefix", () => { |
| 7 | + expect(extractName({ name: "app-v1.2.3.tar.gz" })).toBe("app"); |
| 8 | + }); |
| 9 | + |
| 10 | + test("removes semver versions without v prefix", () => { |
| 11 | + expect(extractName({ name: "tool-1.0.0.zip" })).toBe("tool"); |
| 12 | + }); |
| 13 | + |
| 14 | + test("removes versions in the middle of name", () => { |
| 15 | + expect(extractName({ name: "cli-v2.5.1-darwin.tar.gz" })).toBe("cli"); |
| 16 | + }); |
| 17 | + |
| 18 | + test("handles real-world versioned filenames", () => { |
| 19 | + const ripgrepResult = extractName({ name: "ripgrep-14.1.0-x86_64-apple-darwin.tar.gz" }); |
| 20 | + expect(ripgrepResult.toLowerCase()).toContain("ripgrep"); |
| 21 | + const fzfResult = extractName({ name: "fzf-0.54.0-darwin_arm64.tar.gz" }); |
| 22 | + expect(fzfResult.toLowerCase()).toContain("fzf"); |
| 23 | + const helixResult = extractName({ name: "helix-24.07-x86_64-macos.tar.gz" }); |
| 24 | + expect(helixResult.toLowerCase()).toContain("helix"); |
| 25 | + }); |
| 26 | + |
| 27 | + test("handles versions at the start", () => { |
| 28 | + expect(extractName({ name: "v1.2.3-myapp.dmg" })).toBe("myapp"); |
| 29 | + }); |
| 30 | + }); |
| 31 | + |
| 32 | + describe("platform removal", () => { |
| 33 | + test("removes darwin platform indicator", () => { |
| 34 | + expect(extractName({ name: "tool_darwin.zip" })).toBe("tool"); |
| 35 | + }); |
| 36 | + |
| 37 | + test("removes macos platform indicator", () => { |
| 38 | + expect(extractName({ name: "app-macos.dmg" })).toBe("app"); |
| 39 | + }); |
| 40 | + |
| 41 | + test("removes osx platform indicator", () => { |
| 42 | + expect(extractName({ name: "binary_osx.tar.gz" })).toBe("binary"); |
| 43 | + }); |
| 44 | + |
| 45 | + test("removes apple platform indicator", () => { |
| 46 | + expect(extractName({ name: "cli-apple.pkg" })).toBe("cli"); |
| 47 | + }); |
| 48 | + |
| 49 | + test("removes linux platform indicator", () => { |
| 50 | + expect(extractName({ name: "tool_linux.tar.gz" })).toBe("tool"); |
| 51 | + }); |
| 52 | + |
| 53 | + test("removes windows platform indicator", () => { |
| 54 | + expect(extractName({ name: "app-windows.zip" })).toBe("app"); |
| 55 | + }); |
| 56 | + |
| 57 | + test("handles real-world platform filenames", () => { |
| 58 | + const deltaResult = extractName({ name: "delta-0.16.5-x86_64-apple-darwin.tar.gz" }); |
| 59 | + expect(deltaResult.toLowerCase()).toContain("delta"); |
| 60 | + const batResult = extractName({ name: "bat-v0.24.0-x86_64-unknown-linux-gnu.tar.gz" }); |
| 61 | + expect(batResult.toLowerCase()).toContain("bat"); |
| 62 | + }); |
| 63 | + }); |
| 64 | + |
| 65 | + describe("architecture removal", () => { |
| 66 | + test("removes x64 architecture", () => { |
| 67 | + expect(extractName({ name: "app_x64.zip" })).toBe("app"); |
| 68 | + }); |
| 69 | + |
| 70 | + test("removes x86_64 architecture when possible", () => { |
| 71 | + const result = extractName({ name: "tool-x86_64.tar.gz" }); |
| 72 | + expect(result).toBeDefined(); |
| 73 | + expect(result.length).toBeGreaterThan(0); |
| 74 | + }); |
| 75 | + |
| 76 | + test("removes arm64 architecture", () => { |
| 77 | + expect(extractName({ name: "binary-arm64.dmg" })).toBe("binary"); |
| 78 | + }); |
| 79 | + |
| 80 | + test("removes aarch64 architecture", () => { |
| 81 | + expect(extractName({ name: "cli_aarch64.pkg" })).toBe("cli"); |
| 82 | + }); |
| 83 | + |
| 84 | + test("removes universal architecture", () => { |
| 85 | + expect(extractName({ name: "app-universal.dmg" })).toBe("app"); |
| 86 | + }); |
| 87 | + |
| 88 | + test("removes amd64 architecture", () => { |
| 89 | + expect(extractName({ name: "tool_amd64.deb" })).toBe("tool"); |
| 90 | + }); |
| 91 | + }); |
| 92 | + |
| 93 | + describe("extension removal", () => { |
| 94 | + test("removes tar.gz extension", () => { |
| 95 | + expect(extractName({ name: "app.tar.gz" })).toBe("app"); |
| 96 | + }); |
| 97 | + |
| 98 | + test("removes tar.xz extension", () => { |
| 99 | + expect(extractName({ name: "tool.tar.xz" })).toBe("tool"); |
| 100 | + }); |
| 101 | + |
| 102 | + test("removes zip extension", () => { |
| 103 | + expect(extractName({ name: "binary.zip" })).toBe("binary"); |
| 104 | + }); |
| 105 | + |
| 106 | + test("removes dmg extension", () => { |
| 107 | + expect(extractName({ name: "App.dmg" })).toBe("App"); |
| 108 | + }); |
| 109 | + |
| 110 | + test("removes pkg extension", () => { |
| 111 | + expect(extractName({ name: "installer.pkg" })).toBe("installer"); |
| 112 | + }); |
| 113 | + |
| 114 | + test("removes deb extension", () => { |
| 115 | + expect(extractName({ name: "package.deb" })).toBe("package"); |
| 116 | + }); |
| 117 | + |
| 118 | + test("removes app extension", () => { |
| 119 | + expect(extractName({ name: "MyApp.app" })).toBe("MyApp"); |
| 120 | + }); |
| 121 | + }); |
| 122 | + |
| 123 | + describe("combined scenarios", () => { |
| 124 | + test("handles version + platform + arch + extension", () => { |
| 125 | + const result = extractName({ name: "ripgrep-14.1.0-x86_64-apple-darwin.tar.gz" }); |
| 126 | + expect(result.toLowerCase()).toContain("ripgrep"); |
| 127 | + }); |
| 128 | + |
| 129 | + test("handles underscores as separators", () => { |
| 130 | + expect(extractName({ name: "my_tool_v1.0.0_darwin_arm64.tar.gz" })).toBe("my_tool"); |
| 131 | + }); |
| 132 | + |
| 133 | + test("handles dashes as separators", () => { |
| 134 | + expect(extractName({ name: "my-tool-v1.0.0-darwin-arm64.tar.gz" })).toBe("my-tool"); |
| 135 | + }); |
| 136 | + |
| 137 | + test("handles mixed separators", () => { |
| 138 | + expect(extractName({ name: "my-tool_v1.0.0-darwin_arm64.tar.gz" })).toBe("my-tool"); |
| 139 | + }); |
| 140 | + |
| 141 | + test("handles real-world complex filenames", () => { |
| 142 | + expect(extractName({ name: "Pearcleaner.dmg" })).toBe("Pearcleaner"); |
| 143 | + const vscodeResult = extractName({ name: "Visual Studio Code-darwin-universal.dmg" }); |
| 144 | + expect(vscodeResult).toContain("Visual Studio Code"); |
| 145 | + const itermResult = extractName({ name: "iTerm2-3_5_4.dmg" }); |
| 146 | + expect(itermResult.toLowerCase()).toContain("iterm"); |
| 147 | + const ytdlpResult = extractName({ name: "yt-dlp_macos" }); |
| 148 | + expect(ytdlpResult.toLowerCase()).toContain("yt-dlp"); |
| 149 | + const ffmpegResult = extractName({ name: "ffmpeg-6.1-macOS-default.zip" }); |
| 150 | + expect(ffmpegResult.toLowerCase()).toContain("ffmpeg"); |
| 151 | + }); |
| 152 | + }); |
| 153 | + |
| 154 | + describe("edge cases", () => { |
| 155 | + test("handles names that are just version numbers", () => { |
| 156 | + const result = extractName({ name: "1.0.0.tar.gz" }); |
| 157 | + expect(typeof result).toBe("string"); |
| 158 | + }); |
| 159 | + |
| 160 | + test("handles single word names", () => { |
| 161 | + expect(extractName({ name: "git" })).toBe("git"); |
| 162 | + }); |
| 163 | + |
| 164 | + test("handles names with multiple dashes", () => { |
| 165 | + expect(extractName({ name: "my-super-cool-tool.zip" })).toBe("my-super-cool-tool"); |
| 166 | + }); |
| 167 | + |
| 168 | + test("handles names containing platform substrings", () => { |
| 169 | + const result = extractName({ name: "macchina-v6.3.1-macos-arm64.tar.gz" }); |
| 170 | + expect(result).toBeDefined(); |
| 171 | + expect(result.length).toBeGreaterThan(0); |
| 172 | + }); |
| 173 | + |
| 174 | + test("preserves case for app names", () => { |
| 175 | + expect(extractName({ name: "MyApp.dmg" })).toBe("MyApp"); |
| 176 | + expect(extractName({ name: "UPPERCASE.pkg" })).toBe("UPPERCASE"); |
| 177 | + }); |
| 178 | + }); |
| 179 | + |
| 180 | + describe("not too aggressive", () => { |
| 181 | + test("does not strip too much from simple names", () => { |
| 182 | + expect(extractName({ name: "fzf.tar.gz" })).toBe("fzf"); |
| 183 | + expect(extractName({ name: "git.zip" })).toBe("git"); |
| 184 | + }); |
| 185 | + |
| 186 | + test("preserves meaningful parts of complex names", () => { |
| 187 | + expect(extractName({ name: "github-cli.tar.gz" })).toBe("github-cli"); |
| 188 | + expect(extractName({ name: "docker-compose.zip" })).toBe("docker-compose"); |
| 189 | + }); |
| 190 | + |
| 191 | + test("handles names starting with platform-like words", () => { |
| 192 | + const result = extractName({ name: "macports.tar.gz" }); |
| 193 | + expect(result.length).toBeGreaterThan(0); |
| 194 | + }); |
| 195 | + }); |
| 196 | +}); |
0 commit comments