import assert from "node:assert/strict";
import { test } from "node:test";
import { disposicaoDoArquivo, extensaoDe, nomeLimpo, tamanhoLegivel } from "./nome-do-arquivo.ts";

test("nome limpo tira caminho, controle e caracteres proibidos", () => {
  assert.equal(nomeLimpo("C:\\Users\\x\\Aula 1: prensa?.mp4"), "Aula 1 prensa.mp4");
  assert.equal(nomeLimpo("../../etc/passwd"), "passwd");
  assert.equal(nomeLimpo("...oculto.pdf"), "oculto.pdf");
  assert.equal(nomeLimpo(""), "arquivo");
  assert.equal(nomeLimpo("a\u0000b\nc.zip"), "abc.zip");
  const longo = nomeLimpo("x".repeat(300) + ".pdf");
  assert.equal(longo.length, 180);
  assert.ok(longo.endsWith(".pdf"));
});

test("extensão em minúsculas e só quando faz sentido", () => {
  assert.equal(extensaoDe("Kit.ZIP"), "zip");
  assert.equal(extensaoDe("sem-extensao"), "");
  assert.equal(extensaoDe("ponto.no.fim."), "");
  assert.equal(extensaoDe(".htaccess"), "");
  assert.equal(extensaoDe("arquivo.tar.gz"), "gz");
});

test("cabeçalho de download com nome em UTF-8 e reserva em ASCII", () => {
  assert.equal(
    disposicaoDoArquivo("Moldes de caixinhas – ação \"final\".pdf"),
    `attachment; filename="Moldes de caixinhas _ acao final.pdf"; filename*=UTF-8''Moldes%20de%20caixinhas%20%E2%80%93%20a%C3%A7%C3%A3o%20final.pdf`,
  );
  assert.ok(disposicaoDoArquivo("video.mp4", true).startsWith("inline;"));
});

test("tamanho legível em português", () => {
  assert.equal(tamanhoLegivel(0), "0 KB");
  assert.equal(tamanhoLegivel(500), "1 KB");
  assert.equal(tamanhoLegivel(820 * 1024), "820 KB");
  assert.equal(tamanhoLegivel(1.5 * 1024 * 1024), "1,5 MB");
  assert.equal(tamanhoLegivel(412 * 1024 * 1024), "412 MB");
  assert.equal(tamanhoLegivel(6.8 * 1024 ** 3), "6,8 GB");
  assert.equal(tamanhoLegivel(20 * 1024 ** 3), "20 GB");
});
