import { describe, expect, it } from "bun:test"; import { iniciarFiltroDelta, regexColunaFiltroDelta, zColunaFiltroDelta, zFiltroDelta, } from "../filtroDelta"; describe("filtroDelta - validação de colunas", () => { it("deve validar nomes de colunas e propriedades contendo qualquer combinação de \\w, . e -", () => { const colunasValidasCombinadas = [ "coluna-teste", "dados.item-1", "minha-tabela.meu-campo", "uuid-550e8400-e29b-41d4-a716-446655440000", "objeto-a.propriedade-b.campo_c", "campo-1", "parametro-a-b-c", "coluna.", ".coluna", "coluna..sub", "a-b.c-d.e", "-coluna-", "..", ".", "-", "---", "dados.item_1-x.teste.", "prefixo..meio--fim", ]; for (const coluna of colunasValidasCombinadas) { expect(regexColunaFiltroDelta.test(coluna)).toBe(true); expect(zColunaFiltroDelta.parse(coluna)).toBe(coluna); } }); it("deve validar nomes de colunas convencionais com letras, números e sublinhados", () => { const colunasConvencionais = [ "nome", "idade", "usuario_id", "_id", "dados.propriedade", "tabela.campo_123.sub_valor", ]; for (const coluna of colunasConvencionais) { expect(regexColunaFiltroDelta.test(coluna)).toBe(true); expect(zColunaFiltroDelta.parse(coluna)).toBe(coluna); } }); it("deve rejeitar nomes de colunas inválidos", () => { const colunasInvalidas = [ "", "coluna com espaco", "coluna;drop", "coluna/sub", "coluna@dominio", "coluna#1", "coluna$valor", "coluna'teste'", 'coluna"teste"', "(coluna)", "coluna=1", "coluna\nteste", ]; for (const coluna of colunasInvalidas) { expect(regexColunaFiltroDelta.test(coluna)).toBe(false); expect(() => zColunaFiltroDelta.parse(coluna)).toThrow("Coluna inválida"); } }); it("deve permitir criar filtro delta completo com colunas contendo hífen", () => { const filtro = { condicoes: [ { id: "{c1}", coluna: "dados-usuario.primeiro-nome", operador: "=", valor: "Luiz", }, { id: "{c2}", coluna: "configuracao-sistema.status-ativo", operador: "=", valor: true, }, ], formula: "{c1} E {c2}", }; const resultado = zFiltroDelta.parse(filtro); expect(resultado.condicoes).toHaveLength(2); expect(resultado.condicoes[0].coluna).toBe("dados-usuario.primeiro-nome"); expect(resultado.condicoes[1].coluna).toBe("configuracao-sistema.status-ativo"); }); it("deve funcionar com a fábrica iniciarFiltroDelta usando tipos de colunas com hífen", () => { const { criarFiltroDelta } = iniciarFiltroDelta(); const filtro = criarFiltroDelta({ condicoes: [ { id: "{1}", coluna: "item-id", operador: "!=", valor: "abc", }, { id: "{2}", coluna: "parametros.taxa-padrao", operador: ">=", valor: 10, }, ], formula: "{1} OU {2}", }); expect(filtro.condicoes[0].coluna).toBe("item-id"); expect(filtro.condicoes[1].coluna).toBe("parametros.taxa-padrao"); }); });