src/lib/form/__tests__/field-type-aliases.test.ts

Total Symbols
1
Lines of Code
472
Avg Complexity
1.0
Symbol Types
1

File Relationships

graph LR makeValues["makeValues"] makeValues -->|calls| makeValues click makeValues "../symbols/59208ff403b8298f.html"

Symbols by Kind

function 1

All Symbols

Name Kind Visibility Status Lines Signature
makeValues function - 8-10 makeValues(entries: [FieldType, string][]): : Map<FieldType, string>

Full Source

import { describe, it, expect } from "vitest";
import {
  deriveFieldValueFromTemplate,
  FIELD_TYPE_DERIVATIONS,
} from "@/lib/form/field-type-aliases";
import type { FieldType } from "@/types";

function makeValues(entries: [FieldType, string][]): Map<FieldType, string> {
  return new Map(entries);
}

describe("deriveFieldValueFromTemplate", () => {
  describe("name group", () => {
    describe("first-name", () => {
      it("derives first-name from full-name", () => {
        const values = makeValues([["full-name", "João Silva"]]);
        expect(deriveFieldValueFromTemplate("first-name", values)).toBe("João");
      });

      it("derives first-name from name", () => {
        const values = makeValues([["name", "Maria Pereira"]]);
        expect(deriveFieldValueFromTemplate("first-name", values)).toBe(
          "Maria",
        );
      });

      it("prefers full-name over name for first-name derivation", () => {
        const values = makeValues([
          ["full-name", "João Silva"],
          ["name", "Carlos Costa"],
        ]);
        expect(deriveFieldValueFromTemplate("first-name", values)).toBe("João");
      });

      it("returns single word when full-name has only one word", () => {
        const values = makeValues([["full-name", "João"]]);
        expect(deriveFieldValueFromTemplate("first-name", values)).toBe("João");
      });

      it("returns null when no name-related type exists", () => {
        const values = makeValues([["email", "test@example.com"]]);
        expect(deriveFieldValueFromTemplate("first-name", values)).toBeNull();
      });
    });

    describe("last-name", () => {
      it("derives last-name from full-name", () => {
        const values = makeValues([["full-name", "João Da Silva"]]);
        expect(deriveFieldValueFromTemplate("last-name", values)).toBe(
          "Da Silva",
        );
      });

      it("derives last-name from name", () => {
        const values = makeValues([["name", "Ana Souza"]]);
        expect(deriveFieldValueFromTemplate("last-name", values)).toBe("Souza");
      });

      it("returns null for last-name when full-name has single word", () => {
        const values = makeValues([["full-name", "João"]]);
        expect(deriveFieldValueFromTemplate("last-name", values)).toBeNull();
      });

      it("prefers full-name over name for last-name derivation", () => {
        const values = makeValues([
          ["full-name", "João Silva"],
          ["name", "Carlos Costa"],
        ]);
        expect(deriveFieldValueFromTemplate("last-name", values)).toBe("Silva");
      });
    });

    describe("full-name", () => {
      it("derives full-name from name", () => {
        const values = makeValues([["name", "João Silva"]]);
        expect(deriveFieldValueFromTemplate("full-name", values)).toBe(
          "João Silva",
        );
      });

      it("combines first-name + last-name into full-name", () => {
        const values = makeValues([
          ["first-name", "João"],
          ["last-name", "Silva"],
        ]);
        expect(deriveFieldValueFromTemplate("full-name", values)).toBe(
          "João Silva",
        );
      });

      it("falls back to first-name alone when last-name is absent", () => {
        const values = makeValues([["first-name", "João"]]);
        expect(deriveFieldValueFromTemplate("full-name", values)).toBe("João");
      });

      it("prefers name over first-name+last-name combination", () => {
        const values = makeValues([
          ["name", "Carlos Costa"],
          ["first-name", "João"],
          ["last-name", "Silva"],
        ]);
        expect(deriveFieldValueFromTemplate("full-name", values)).toBe(
          "Carlos Costa",
        );
      });

      it("returns null when no related type exists", () => {
        const values = makeValues([["email", "test@example.com"]]);
        expect(deriveFieldValueFromTemplate("full-name", values)).toBeNull();
      });
    });

    describe("name", () => {
      it("derives name from full-name", () => {
        const values = makeValues([["full-name", "João Silva"]]);
        expect(deriveFieldValueFromTemplate("name", values)).toBe("João Silva");
      });

      it("combines first-name + last-name into name", () => {
        const values = makeValues([
          ["first-name", "Ana"],
          ["last-name", "Ferreira"],
        ]);
        expect(deriveFieldValueFromTemplate("name", values)).toBe(
          "Ana Ferreira",
        );
      });

      it("falls back to first-name alone", () => {
        const values = makeValues([["first-name", "Ana"]]);
        expect(deriveFieldValueFromTemplate("name", values)).toBe("Ana");
      });
    });
  });

  describe("phone group", () => {
    it("derives phone from mobile", () => {
      const values = makeValues([["mobile", "11999998888"]]);
      expect(deriveFieldValueFromTemplate("phone", values)).toBe("11999998888");
    });

    it("derives phone from whatsapp when mobile is absent", () => {
      const values = makeValues([["whatsapp", "11977776666"]]);
      expect(deriveFieldValueFromTemplate("phone", values)).toBe("11977776666");
    });

    it("derives mobile from phone", () => {
      const values = makeValues([["phone", "1133334444"]]);
      expect(deriveFieldValueFromTemplate("mobile", values)).toBe("1133334444");
    });

    it("derives mobile from whatsapp when phone is absent", () => {
      const values = makeValues([["whatsapp", "11977776666"]]);
      expect(deriveFieldValueFromTemplate("mobile", values)).toBe(
        "11977776666",
      );
    });

    it("derives whatsapp from mobile", () => {
      const values = makeValues([["mobile", "11999998888"]]);
      expect(deriveFieldValueFromTemplate("whatsapp", values)).toBe(
        "11999998888",
      );
    });

    it("derives whatsapp from phone when mobile is absent", () => {
      const values = makeValues([["phone", "1133334444"]]);
      expect(deriveFieldValueFromTemplate("whatsapp", values)).toBe(
        "1133334444",
      );
    });

    it("returns null for phone when no related type exists", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("phone", values)).toBeNull();
    });

    it("returns null for mobile when no related type exists", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("mobile", values)).toBeNull();
    });

    it("returns null for whatsapp when no related type exists", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("whatsapp", values)).toBeNull();
    });
  });

  describe("authentication group", () => {
    it("derives confirm-password from password", () => {
      const values = makeValues([["password", "Secret123!"]]);
      expect(deriveFieldValueFromTemplate("confirm-password", values)).toBe(
        "Secret123!",
      );
    });

    it("returns null for confirm-password when password is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(
        deriveFieldValueFromTemplate("confirm-password", values),
      ).toBeNull();
    });
  });

  describe("postal code group", () => {
    it("derives zip-code from cep", () => {
      const values = makeValues([["cep", "01310-100"]]);
      expect(deriveFieldValueFromTemplate("zip-code", values)).toBe(
        "01310-100",
      );
    });

    it("derives cep from zip-code", () => {
      const values = makeValues([["zip-code", "01310-100"]]);
      expect(deriveFieldValueFromTemplate("cep", values)).toBe("01310-100");
    });

    it("returns null for zip-code when cep is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("zip-code", values)).toBeNull();
    });

    it("returns null for cep when zip-code is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("cep", values)).toBeNull();
    });
  });

  describe("financial group", () => {
    it("derives price from money", () => {
      const values = makeValues([["money", "99.90"]]);
      expect(deriveFieldValueFromTemplate("price", values)).toBe("99.90");
    });

    it("derives price from amount when money is absent", () => {
      const values = makeValues([["amount", "150.00"]]);
      expect(deriveFieldValueFromTemplate("price", values)).toBe("150.00");
    });

    it("returns null for price when money and amount are absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("price", values)).toBeNull();
    });

    it("derives money from price", () => {
      const values = makeValues([["price", "49.99"]]);
      expect(deriveFieldValueFromTemplate("money", values)).toBe("49.99");
    });

    it("derives money from amount when price is absent", () => {
      const values = makeValues([["amount", "300.00"]]);
      expect(deriveFieldValueFromTemplate("money", values)).toBe("300.00");
    });

    it("returns null for money when price and amount are absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("money", values)).toBeNull();
    });

    it("derives amount from money", () => {
      const values = makeValues([["money", "250.00"]]);
      expect(deriveFieldValueFromTemplate("amount", values)).toBe("250.00");
    });

    it("derives amount from price when money is absent", () => {
      const values = makeValues([["price", "199.00"]]);
      expect(deriveFieldValueFromTemplate("amount", values)).toBe("199.00");
    });

    it("returns null for amount when money and price are absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("amount", values)).toBeNull();
    });
  });

  describe("date variants group", () => {
    it("derives birth-date from date", () => {
      const values = makeValues([["date", "1990-01-01"]]);
      expect(deriveFieldValueFromTemplate("birth-date", values)).toBe(
        "1990-01-01",
      );
    });

    it("derives start-date from date", () => {
      const values = makeValues([["date", "2025-03-01"]]);
      expect(deriveFieldValueFromTemplate("start-date", values)).toBe(
        "2025-03-01",
      );
    });

    it("derives end-date from date", () => {
      const values = makeValues([["date", "2025-12-31"]]);
      expect(deriveFieldValueFromTemplate("end-date", values)).toBe(
        "2025-12-31",
      );
    });

    it("derives due-date from date", () => {
      const values = makeValues([["date", "2025-06-30"]]);
      expect(deriveFieldValueFromTemplate("due-date", values)).toBe(
        "2025-06-30",
      );
    });

    it("returns null for birth-date when date is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("birth-date", values)).toBeNull();
    });

    it("returns null for start-date when date is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("start-date", values)).toBeNull();
    });

    it("returns null for end-date when date is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("end-date", values)).toBeNull();
    });

    it("returns null for due-date when date is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("due-date", values)).toBeNull();
    });
  });

  describe("product group", () => {
    it("derives product-name from product", () => {
      const values = makeValues([["product", "Camiseta Azul"]]);
      expect(deriveFieldValueFromTemplate("product-name", values)).toBe(
        "Camiseta Azul",
      );
    });

    it("derives product from product-name", () => {
      const values = makeValues([["product-name", "Notebook Pro"]]);
      expect(deriveFieldValueFromTemplate("product", values)).toBe(
        "Notebook Pro",
      );
    });

    it("returns null for product-name when product is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("product-name", values)).toBeNull();
    });

    it("returns null for product when product-name is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("product", values)).toBeNull();
    });
  });

  describe("company group", () => {
    it("derives supplier from company", () => {
      const values = makeValues([["company", "ACME Ltda"]]);
      expect(deriveFieldValueFromTemplate("supplier", values)).toBe(
        "ACME Ltda",
      );
    });

    it("derives company from supplier", () => {
      const values = makeValues([["supplier", "Distribuidora XYZ"]]);
      expect(deriveFieldValueFromTemplate("company", values)).toBe(
        "Distribuidora XYZ",
      );
    });

    it("returns null for supplier when company is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("supplier", values)).toBeNull();
    });

    it("returns null for company when supplier is absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("company", values)).toBeNull();
    });
  });

  describe("document group", () => {
    it("derives cpf-cnpj from cpf", () => {
      const values = makeValues([["cpf", "123.456.789-09"]]);
      expect(deriveFieldValueFromTemplate("cpf-cnpj", values)).toBe(
        "123.456.789-09",
      );
    });

    it("derives cpf-cnpj from cnpj when cpf is absent", () => {
      const values = makeValues([["cnpj", "12.345.678/0001-95"]]);
      expect(deriveFieldValueFromTemplate("cpf-cnpj", values)).toBe(
        "12.345.678/0001-95",
      );
    });

    it("prefers cpf over cnpj for cpf-cnpj derivation", () => {
      const values = makeValues([
        ["cpf", "123.456.789-09"],
        ["cnpj", "12.345.678/0001-95"],
      ]);
      expect(deriveFieldValueFromTemplate("cpf-cnpj", values)).toBe(
        "123.456.789-09",
      );
    });

    it("returns null for cpf-cnpj when cpf and cnpj are absent", () => {
      const values = makeValues([["email", "test@example.com"]]);
      expect(deriveFieldValueFromTemplate("cpf-cnpj", values)).toBeNull();
    });
  });

  describe("no derivation available", () => {
    it("returns null for types without any derivation rules (email)", () => {
      const values = makeValues([["name", "João Silva"]]);
      expect(deriveFieldValueFromTemplate("email", values)).toBeNull();
    });

    it("returns null for types without any derivation rules (cpf)", () => {
      const values = makeValues([["name", "João Silva"]]);
      expect(deriveFieldValueFromTemplate("cpf", values)).toBeNull();
    });

    it("returns null when map is empty", () => {
      expect(deriveFieldValueFromTemplate("full-name", new Map())).toBeNull();
    });

    it("returns null when map has unrelated types only", () => {
      const values = makeValues([
        ["email", "test@example.com"],
        ["cpf", "123.456.789-09"],
      ]);
      expect(deriveFieldValueFromTemplate("first-name", values)).toBeNull();
    });
  });

  describe("FIELD_TYPE_DERIVATIONS completeness", () => {
    it("exports a non-empty derivations map", () => {
      expect(Object.keys(FIELD_TYPE_DERIVATIONS).length).toBeGreaterThan(0);
    });

    it("every derivation function returns a string or null", () => {
      const values = makeValues([
        ["name", "Test Name"],
        ["full-name", "Test Full Name"],
        ["first-name", "Test"],
        ["last-name", "Name"],
        ["phone", "11999998888"],
        ["mobile", "11999998888"],
        ["whatsapp", "11999998888"],
        ["password", "pass123"],
        ["cep", "01310-100"],
        ["zip-code", "01310-100"],
        ["money", "100.00"],
        ["price", "100.00"],
        ["amount", "100.00"],
        ["date", "2025-01-01"],
        ["product", "Product X"],
        ["product-name", "Product X"],
        ["company", "Company Y"],
        ["supplier", "Supplier Z"],
        ["cpf", "123.456.789-09"],
        ["cnpj", "12.345.678/0001-95"],
      ]);

      for (const [type, fn] of Object.entries(FIELD_TYPE_DERIVATIONS)) {
        const result = fn!(values);
        expect(
          result === null || typeof result === "string",
          `derivation for "${type}" should return string or null`,
        ).toBe(true);
      }
    });
  });
});