Eu fiz esse teste pro campo "texto", pois ele precisa ser obrigatório. Então eu testei os casos q daria o erro de campo obrigatório:
describe("campos obrigatórios", () => {
test.each([
["vazio", ""],
["undefined", undefined],
["null", null]
])("Deve lançar erro quando texto for %s", (_, valor) => {
const executar = () => golombService.encode(valor, 2);
expect(executar).toThrow(ErroValidacao);
expect(executar).toThrow(MENSAGENS_ERRO.CAMPO_OBRIGATORIO("texto"));
});
No teste do controller eu fiz assim testando só um valor q vai dar o erro de campo obrigatório. Eu devo testar os outros também ou seria uma repetição desnecessária?:
describe("campos obrigatórios", () => {
test("Deve chamar next quando texto for obrigatório", () => {
req.body.texto = undefined;
const erro = new ErroValidacao(MENSAGENS_ERRO.CAMPO_OBRIGATORIO("texto"));
golombService.encode.mockImplementation(() => {
throw erro;
});
golombController.encode(req, res, next);
expect(golombService.encode).toHaveBeenCalledWith(undefined, 4);
expect(next).toHaveBeenCalledWith(erro);
expect(res.status).not.toHaveBeenCalled();
expect(res.json).not.toHaveBeenCalled();
});
Meu código no controller:
const encode = (req, res, next) => {
try {
const { texto, k } = req.body;
const resultado = golombService.encode(texto, k);
return res.status(200).json({ resultado });
} catch (erro) {
next(erro);
}
};
Meu código no service:
const encode = (texto, k) => {
golombValidation.validarEncodeGolomb(texto, k);
const comprimido = [];
const stopBit = "1";
for(let i = 0; i < texto.length; i++){
const charCode = texto.charCodeAt(i);
const tamanhoPrefixo = Math.floor(charCode / k);
const resto = charCode % k;
const tamanhoSufixo = Math.ceil(Math.log2(k));
const prefixo = "0".repeat(tamanhoPrefixo);
const sufixo = resto.toString(2).padStart(tamanhoSufixo, "0");
const codeword = prefixo + stopBit + sufixo;
comprimido.push(codeword);
}
return comprimido;
}