import assert from "node:assert/strict";
import { describe, it } from "node:test";

import { cfopDaDevolucao, textoParaNota } from "./devolucao-regras.ts";

describe("nota de devolução", () => {
  it("o CFOP da entrada espelha o da venda", () => {
    /* Produção própria vendida dentro do estado volta como 1201. */
    assert.equal(cfopDaDevolucao(5101, true), 1201);
    /* Revenda dentro do estado volta como 1202. */
    assert.equal(cfopDaDevolucao(5102, true), 1202);
    /* De outro estado, a família muda de 1 para 2. */
    assert.equal(cfopDaDevolucao(6101, false), 2201);
    assert.equal(cfopDaDevolucao(6102, false), 2202);
    /* Venda com substituição tributária tem devolução própria. */
    assert.equal(cfopDaDevolucao(5405, true), 1411);
    assert.equal(cfopDaDevolucao(5401, true), 1410);
    /* CFOP desconhecido cai na devolução de mercadoria. */
    assert.equal(cfopDaDevolucao(null, true), 1202);
  });

  it("limpa o texto que a SEFAZ recusa sem dizer o porquê", () => {
    /* Travessão e aspas curvas derrubam o XML por regra de formato. */
    assert.equal(textoParaNota("Devolução da nota 16 — defeito"), "Devolução da nota 16 - defeito");
    assert.equal(textoParaNota("cliente disse “não serve”"), 'cliente disse "não serve"');
    assert.equal(textoParaNota("produto errado 🙃"), "produto errado");
    /* Acento é aceito na nota e continua como veio. */
    assert.equal(textoParaNota("Devolução por avaria"), "Devolução por avaria");
    assert.equal(textoParaNota("  espaço    demais  "), "espaço demais");
  });
});
