import test from "node:test";
import assert from "node:assert/strict";

import { caminhoNaLoja, enderecoDaPassagem, origemDaLoja } from "./passagem-do-login.ts";

/*
  A origem vem do navegador (parametro do retorno do Google) e o caminho de
  volta tambem. O que sai daqui vira endereco de redirecionamento, entao nada
  pode levar para fora da loja.
*/

test("origem do dominio proprio passa so com protocolo e host", () => {
  assert.deepEqual(origemDaLoja("https://espiaelasatelier.com.br"), {
    origem: "https://espiaelasatelier.com.br",
    dominio: "espiaelasatelier.com.br",
  });
  assert.deepEqual(origemDaLoja(" https://Loja.Exemplo.com.br "), {
    origem: "https://loja.exemplo.com.br",
    dominio: "loja.exemplo.com.br",
  });
});

test("origem sem https, com caminho, credencial ou lixo e recusada", () => {
  assert.equal(origemDaLoja("http://espiaelasatelier.com.br"), null);
  assert.equal(origemDaLoja("https://espiaelasatelier.com.br/checkout"), null);
  assert.equal(origemDaLoja("https://espiaelasatelier.com.br/?x=1"), null);
  assert.equal(origemDaLoja("https://user:senha@espiaelasatelier.com.br"), null);
  assert.equal(origemDaLoja("javascript:alert(1)"), null);
  assert.equal(origemDaLoja("//espiaelasatelier.com.br"), null);
  assert.equal(origemDaLoja(""), null);
  assert.equal(origemDaLoja(null), null);
  assert.equal(origemDaLoja(`https://${"a".repeat(320)}.com`), null);
});

test("na maquina de quem programa, http local vale", () => {
  assert.deepEqual(origemDaLoja("http://aurora.localhost:3001"), {
    origem: "http://aurora.localhost:3001",
    dominio: "aurora.localhost",
  });
  assert.deepEqual(origemDaLoja("http://localhost:3001"), { origem: "http://localhost:3001", dominio: "localhost" });
  assert.equal(origemDaLoja("http://localhost.exemplo.com"), null);
});

test("caminho com o slug volta como veio", () => {
  assert.equal(caminhoNaLoja("espiaelasatelier", "/espiaelasatelier/checkout"), "/espiaelasatelier/checkout");
  assert.equal(caminhoNaLoja("espiaelasatelier", "/espiaelasatelier"), "/espiaelasatelier");
  assert.equal(caminhoNaLoja("espiaelasatelier", "/espiaelasatelier?aba=1"), "/espiaelasatelier?aba=1");
});

test("caminho do dominio proprio ganha o slug na frente", () => {
  assert.equal(caminhoNaLoja("espiaelasatelier", "/p/123"), "/espiaelasatelier/p/123");
  assert.equal(caminhoNaLoja("espiaelasatelier", "/"), "/espiaelasatelier");
  assert.equal(caminhoNaLoja("espiaelasatelier", "/espiaelasatelierx/p/1"), "/espiaelasatelier/espiaelasatelierx/p/1");
});

test("caminho que sai da loja vira a area do cliente", () => {
  for (const ruim of ["https://outro.com", "//outro.com", "/\\outro.com", "outro", "/a\nb", "", null, "/".repeat(600)]) {
    assert.equal(caminhoNaLoja("espiaelasatelier", ruim), "/espiaelasatelier/cliente", String(ruim).slice(0, 20));
  }
});

test("endereco da passagem fica no dominio da loja", () => {
  const endereco = new URL(enderecoDaPassagem("https://espiaelasatelier.com.br", "abc123", "/espiaelasatelier/checkout"));
  assert.equal(endereco.origin, "https://espiaelasatelier.com.br");
  assert.equal(endereco.pathname, "/api/client-portal/session/bootstrap");
  assert.equal(endereco.searchParams.get("passagem"), "abc123");
  assert.equal(endereco.searchParams.get("next"), "/espiaelasatelier/checkout");
});
