import { describe, it, expect, vi, beforeEach } from "vitest"; import { toCzk, getRate } from "../services/exchange-rates"; // Mock global fetch const mockFetch = vi.fn(); global.fetch = mockFetch; describe("exchange-rates", () => { beforeEach(() => { mockFetch.mockReset(); }); describe("toCzk", () => { it("returns amount unchanged for CZK", async () => { const result = await toCzk(123.45, "CZK"); expect(result).toBe(123.45); }); it("throws for unknown currency when API fails and no cache", async () => { mockFetch.mockRejectedValue(new Error("Network error")); await expect(toCzk(100, "XYZ")).rejects.toThrow( /Nepodařilo se získat aktuální kurzy/, ); }); it("throws for unknown currency even when API succeeds", async () => { mockFetch.mockResolvedValue({ ok: true, json: async () => ({ rates: [{ currencyCode: "EUR", rate: 25, amount: 1 }], }), }); await expect(toCzk(100, "XYZ")).rejects.toThrow(/Neznámá měna: XYZ/); }); it("converts EUR using fetched rate", async () => { mockFetch.mockResolvedValue({ ok: true, json: async () => ({ rates: [{ currencyCode: "EUR", rate: 25, amount: 1 }], }), }); const result = await toCzk(100, "EUR"); expect(result).toBe(2500); }); }); describe("getRate", () => { it("returns 1 for CZK", async () => { const result = await getRate("CZK"); expect(result).toBe(1); }); it("throws for unknown currency", async () => { mockFetch.mockResolvedValue({ ok: true, json: async () => ({ rates: [{ currencyCode: "EUR", rate: 25, amount: 1 }], }), }); await expect(getRate("XYZ")).rejects.toThrow(/Neznámá měna: XYZ/); }); }); });