Ctrl K
ComunidadGuías…

shared/utils/currency.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { isCurrency, parseCurrency } from "./currency";

describe("isCurrency", () => {
  it("recognizes USD format", () => {
    expect(isCurrency("$100")).toBe(true);
    expect(isCurrency("$400")).toBe(true);
    expect(isCurrency("$3000")).toBe(true);
    expect(isCurrency("$1,234.56")).toBe(true);
    expect(isCurrency("$1234.56")).toBe(true);
  });

  it("recognizes Euro format", () => {
    expect(isCurrency("€100")).toBe(true);
    expect(isCurrency("100€")).toBe(true);
    expect(isCurrency("€1.234,56")).toBe(true);
    expect(isCurrency("1.234,56€")).toBe(true);
  });

  it("recognizes other currency symbols", () => {
    expect(isCurrency("£500")).toBe(true);
    expect(isCurrency("¥1000")).toBe(true);
    expect(isCurrency("₹50,000")).toBe(true);
    expect(isCurrency("R$1.234,56")).toBe(true);
  });

  it("recognizes negative currency values", () => {
    expect(isCurrency("-$100")).toBe(true);
    expect(isCurrency("($100)")).toBe(true);
    expect(isCurrency("-€50")).toBe(true);
  });

  it("returns false for non-currency values", () => {
    expect(isCurrency("100")).toBe(false);
    expect(isCurrency("hello")).toBe(false);
    expect(isCurrency("")).toBe(false);
    expect(isCurrency("1,234.56")).toBe(false);
  });
});

describe("parseCurrency", () => {
  it("parses USD format", () => {
    expect(parseCurrency("$100")).toBe(100);
    expect(parseCurrency("$400")).toBe(400);
    expect(parseCurrency("$3000")).toBe(3000);
    expect(parseCurrency("$1,234.56")).toBe(1234.56);
    expect(parseCurrency("$1234.56")).toBe(1234.56);
    expect(parseCurrency("$0.99")).toBe(0.99);
  });

  it("parses Euro format (European style)", () => {
    expect(parseCurrency("€100")).toBe(100);
    expect(parseCurrency("100€")).toBe(100);
    expect(parseCurrency("€1.234,56")).toBe(1234.56);
    expect(parseCurrency("1.234,56€")).toBe(1234.56);
    expect(parseCurrency("€1234,56")).toBe(1234.56);
  });

  it("parses other currencies", () => {
    expect(parseCurrency("£500")).toBe(500);
    expect(parseCurrency("¥1000")).toBe(1000);
    expect(parseCurrency("₹50,000")).toBe(50000);
    expect(parseCurrency("R$1.234,56")).toBe(1234.56);
  });

  it("parses negative values", () => {
    expect(parseCurrency("-$100")).toBe(-100);
    expect(parseCurrency("($100)")).toBe(-100);
    expect(parseCurrency("-€50")).toBe(-50);
    expect(parseCurrency("($1,234.56)")).toBe(-1234.56);
  });

  it("parses negative values with the sign after the symbol", () => {
    expect(parseCurrency("€ -1.234,50")).toBe(-1234.5);
    expect(parseCurrency("$-100")).toBe(-100);
    expect(parseCurrency("-1.234,50 €")).toBe(-1234.5);
  });

  it("parses negative values with a trailing sign", () => {
    expect(parseCurrency("500- €")).toBe(-500);
    expect(parseCurrency("$1,234.56-")).toBe(-1234.56);
  });

  it("handles whitespace", () => {
    expect(parseCurrency("  $100  ")).toBe(100);
    expect(parseCurrency("$ 100")).toBe(100);
    expect(parseCurrency("100 €")).toBe(100);
  });

  it("returns null for invalid values", () => {
    expect(parseCurrency("")).toBe(null);
    expect(parseCurrency("hello")).toBe(null);
    expect(parseCurrency("abc$123")).toBe(null);
  });

  it("handles large numbers", () => {
    expect(parseCurrency("$1,000,000.00")).toBe(1000000);
    expect(parseCurrency("€1.000.000,00")).toBe(1000000);
  });

  it("sorts currency values correctly", () => {
    const values = ["$400", "$3000", "$100", "$50"];
    const sorted = values.sort((a, b) => {
      const aVal = parseCurrency(a);
      const bVal = parseCurrency(b);
      if (aVal !== null && bVal !== null) {
        return aVal - bVal;
      }
      return 0;
    });
    expect(sorted).toEqual(["$50", "$100", "$400", "$3000"]);
  });

  it("sorts currency values in descending order correctly", () => {
    const values = ["$400", "$3000", "$100", "$50"];
    const sorted = values.sort((a, b) => {
      const aVal = parseCurrency(a);
      const bVal = parseCurrency(b);
      if (aVal !== null && bVal !== null) {
        return bVal - aVal; // descending
      }
      return 0;
    });
    expect(sorted).toEqual(["$3000", "$400", "$100", "$50"]);
  });
});