diff --git a/src/utils/__test__/country.utils.spec.ts b/src/utils/__test__/country.utils.spec.ts index bd5d4e7..5027ccc 100644 --- a/src/utils/__test__/country.utils.spec.ts +++ b/src/utils/__test__/country.utils.spec.ts @@ -1,38 +1,46 @@ -import { describe, beforeEach, afterEach, it, expect, vi } from "vitest"; -import { getCountry } from "../country.utils"; +import { describe, beforeEach, it, expect, vi, Mock } from 'vitest'; +import { getCountry } from '../country.utils'; +import Cookies from 'js-cookie'; -describe("getCountry", () => { - beforeEach(() => { - global.fetch = vi.fn(); - }); - afterEach(() => { - vi.resetAllMocks(); +vi.mock('js-cookie'); +global.fetch = vi.fn(); + +describe('getCountry', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.resetModules(); }); - it("should return the country code in lowercase when available", async () => { - // Mock fetch response - (global.fetch as vi.Mock).mockResolvedValue({ - text: async () => "loc=US\nother=info\n", + it('should return country code from Cloudflare trace', async () => { + (global.fetch as Mock).mockResolvedValueOnce({ + text: () => Promise.resolve('loc=US\nother=value'), }); - const country = await getCountry(); - expect(country).toBe("us"); + const result = await getCountry(); + expect(result).toBe('us'); }); - it("should return an empty string if the loc field is not present", async () => { - (global.fetch as vi.Mock).mockResolvedValue({ - text: async () => "other=info\n", - }); + it('should return country code from cookie when Cloudflare fails', async () => { + vi.clearAllMocks(); + vi.resetModules(); - const country = await getCountry(); - expect(country).toBe(""); - }); + (global.fetch as Mock).mockRejectedValueOnce(new Error('Network error')); + // Mock cookie value as a JSON string + (Cookies.get as Mock).mockReturnValue(JSON.stringify({ clients_country: "fr" })); - it("should return an empty string if the fetch fails", async () => { - (global.fetch as vi.Mock).mockRejectedValue(new Error("Fetch failed")); + const { getCountry } = await import('../country.utils'); + const result = await getCountry(); + expect(result).toBe('fr'); + }); - const country = await getCountry(); - expect(country).toBe(""); + it('should return empty string if no country data is available', async () => { + vi.clearAllMocks(); + vi.resetModules(); + (global.fetch as Mock).mockRejectedValueOnce(new Error('Network error')); + (Cookies.get as Mock).mockReturnValue(JSON.stringify({})); + const { getCountry } = await import('../country.utils'); + const result = await getCountry(); + expect(result).toBe(''); }); }); diff --git a/src/utils/country.utils.ts b/src/utils/country.utils.ts index 3d68263..14179ad 100644 --- a/src/utils/country.utils.ts +++ b/src/utils/country.utils.ts @@ -28,17 +28,15 @@ export const getCountry = async (): Promise => { try { const response = await fetch(cloudflareTrace).catch(() => null); if (!response) { - return JSON.parse(Cookies.get("website_status") || "{}")?.loc?.toLowerCase() || ""; + return JSON.parse(Cookies.get("website_status") || "{}")?.clients_country || ""; } const text = await response.text().catch(() => ""); const entries = text ? text.split("\n").map((v) => v.split("=", 2)) : []; const data: TraceData = entries.length ? Object.fromEntries(entries) : {}; - return data.loc?.toLowerCase() || JSON.parse(Cookies.get("website_status") || "{}")?.loc || ""; + return data.loc?.toLowerCase() || JSON.parse(Cookies.get("website_status") || "{}")?.clients_country || ""; } catch (error) { - return ""; - } finally { - countryPromise = null; + return JSON.parse(Cookies.get("website_status") || "{}")?.clients_country?.toLowerCase() || ""; } })();