diff --git a/frontend/src/core/utils/files.tsx b/frontend/src/core/utils/files.tsx index 4c4d6ca116..97e0574109 100644 --- a/frontend/src/core/utils/files.tsx +++ b/frontend/src/core/utils/files.tsx @@ -109,7 +109,8 @@ const extensionMap: Record = { lua: "lua", r: "r", matlab: "matlab", - julia: "jl", + julia: "julia", + jl: "julia", elm: "elm", haskell: "haskell", hs: "haskell", diff --git a/frontend/tests/unit/core/utils/files.test.ts b/frontend/tests/unit/core/utils/files.test.ts index f10aa44ad8..97a9d2a0d8 100644 --- a/frontend/tests/unit/core/utils/files.test.ts +++ b/frontend/tests/unit/core/utils/files.test.ts @@ -1,7 +1,11 @@ import { expect, test } from "@rstest/core"; import { FilePlayIcon, FileTextIcon, ImageIcon } from "lucide-react"; -import { canBrowserPreviewFile, getFileIcon } from "@/core/utils/files"; +import { + canBrowserPreviewFile, + checkCodeFile, + getFileIcon, +} from "@/core/utils/files"; test.each([ ["animation.apng", ImageIcon], @@ -15,3 +19,28 @@ test.each([ test("keeps the document icon for an unknown extension", () => { expect(getFileIcon("data.unknown").type).toBe(FileTextIcon); }); + +// `extensionMap` maps a file extension to a language name. Both halves of that +// direction matter: `checkCodeFile` tests extension membership, and the language +// is what the editor and previewers receive. +test("resolves a language from its extension", () => { + expect(checkCodeFile("script.hs")).toEqual({ + isCodeFile: true, + language: "haskell", + }); + expect(checkCodeFile("deploy.ex")).toEqual({ + isCodeFile: true, + language: "elixir", + }); + expect(checkCodeFile("analysis.jl")).toEqual({ + isCodeFile: true, + language: "julia", + }); +}); + +test("values the language name, never the extension it came from", () => { + expect(checkCodeFile("notes.julia")).toEqual({ + isCodeFile: true, + language: "julia", + }); +});