diff --git a/.changeset/metal-bottles-travel.md b/.changeset/metal-bottles-travel.md new file mode 100644 index 000000000..9bd7dd5f8 --- /dev/null +++ b/.changeset/metal-bottles-travel.md @@ -0,0 +1,5 @@ +--- +"@lingo.dev/_spec": patch +--- + +Add unit test for utility function in locales.ts diff --git a/packages/spec/src/locales.spec.ts b/packages/spec/src/locales.spec.ts index 0291979c7..1f679b4d2 100644 --- a/packages/spec/src/locales.spec.ts +++ b/packages/spec/src/locales.spec.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { normalizeLocale } from "./locales"; +import { getLocaleCodeDelimiter, normalizeLocale, resolveLocaleCode, resolveOverriddenLocale } from "./locales"; describe("normalizeLocale", () => { it("should return normalized locale for short locale codes", () => { @@ -24,3 +24,61 @@ describe("normalizeLocale", () => { expect(normalizeLocale("zh-rCN")).toEqual("zh-CN"); }); }); + +describe("resolveLocaleCode", () => { + it("should resolve a short locale code to the first full locale code in the map", () => { + expect(resolveLocaleCode("en")).toEqual("en-US"); + expect(resolveLocaleCode("fr")).toEqual("fr-FR"); + expect(resolveLocaleCode("az")).toEqual("az-AZ"); + }); + + it("should return the full locale code if it is already provided", () => { + expect(resolveLocaleCode("en-US")).toEqual("en-US"); + expect(resolveLocaleCode("fr-CA")).toEqual("fr-CA"); + expect(resolveLocaleCode("es-MX")).toEqual("es-MX"); + }); + + it("should throw an error for an invalid or unsupported locale code", () => { + expect(() => resolveLocaleCode("az-US")).toThrow("Invalid locale code"); + expect(() => resolveLocaleCode("au")).toThrow("Invalid locale code"); + }); + + it("should return first code for locales with multiple variants", () => { + expect(resolveLocaleCode("sr")).toEqual("sr-RS"); + expect(resolveLocaleCode("zh")).toEqual("zh-CN"); + }); +}); + +describe("getLocaleCodeDelimiter", () => { + it("should return '-' for locale codes with hyphen delimiter", () => { + expect(getLocaleCodeDelimiter("en-US")).toEqual("-"); + expect(getLocaleCodeDelimiter("fr-FR")).toEqual("-"); + }); + + it("should return '_' for locale codes with underscore delimiter", () => { + expect(getLocaleCodeDelimiter("en_US")).toEqual("_"); + expect(getLocaleCodeDelimiter("fr_FR")).toEqual("_"); + }); + + it("should return undefined for locale codes without a recognized delimiter", () => { + expect(getLocaleCodeDelimiter("enUS")).toBeNull(); + expect(getLocaleCodeDelimiter("frFR")).toBeNull(); + }); +}); + +describe("resolveOverridenLocale", () => { + it("should return the same locale if no delimiter is provided", () => { + expect(resolveOverriddenLocale("en-US")).toEqual("en-US"); + expect(resolveOverriddenLocale("fr_FR")).toEqual("fr_FR"); + }); + + it("should replace the delimiter with the specified one", () => { + expect(resolveOverriddenLocale("en-US", "_")).toEqual("en_US"); + expect(resolveOverriddenLocale("fr_FR", "-")).toEqual("fr-FR"); + }); + + it("should return the same locale if no recognized delimiter is found", () => { + expect(resolveOverriddenLocale("enUS", "_")).toEqual("enUS"); + expect(resolveOverriddenLocale("frFR", "-")).toEqual("frFR"); + }); +}); diff --git a/packages/spec/src/locales.ts b/packages/spec/src/locales.ts index 29703633a..d19e14568 100644 --- a/packages/spec/src/locales.ts +++ b/packages/spec/src/locales.ts @@ -222,7 +222,6 @@ export const localeCodeSchema = Z.string().refine((value) => localeCodes.include message: "Invalid locale code", }); - /** * Resolves a locale code to its full locale representation. * @@ -234,9 +233,7 @@ export const localeCodeSchema = Z.string().refine((value) => localeCodes.include * @return {LocaleCodeFull} The resolved full locale code * @throws {Error} If the provided locale code is invalid. */ - - -export const resolveLocaleCode = (value: LocaleCode): LocaleCodeFull => { +export const resolveLocaleCode = (value: string): LocaleCodeFull => { const existingFullLocaleCode = Object.values(localeMap) .flat() .includes(value as any);