import {
  DEFAULT_PERMISSIONS_BY_ROLE,
  GRUPOS_CONFIGURACION,
  nivelConfiguracion,
  tieneAlgunAccesoConfiguracion,
} from "./default-permissions";
import {
  clavesDelCatalogo,
  entradaDe,
} from "../taller-parametros/taller-parametros.catalogo";

describe("default-permissions", () => {
  it("todo grupo del catálogo está en GRUPOS_CONFIGURACION (y viceversa)", () => {
    const gruposCatalogo = new Set(
      clavesDelCatalogo().map((c) => entradaDe(c).grupo),
    );
    expect([...gruposCatalogo].sort()).toEqual(
      [...GRUPOS_CONFIGURACION].sort(),
    );
  });

  it("los 5 roles declaran configuracion.<grupo> para todos los grupos", () => {
    for (const [rol, permisos] of Object.entries(DEFAULT_PERMISSIONS_BY_ROLE)) {
      for (const grupo of GRUPOS_CONFIGURACION) {
        expect([rol, `configuracion.${grupo}` in permisos]).toEqual([
          rol,
          true,
        ]);
      }
    }
  });

  it("configuracion.operacion y confirmarPago: write solo para super_admin y admin", () => {
    for (const [rol, permisos] of Object.entries(DEFAULT_PERMISSIONS_BY_ROLE)) {
      const esperado =
        rol === "super_admin" || rol === "admin" ? "write" : "none";
      expect([rol, permisos["configuracion.operacion"]]).toEqual([
        rol,
        esperado,
      ]);
      expect([rol, permisos.confirmarPago]).toEqual([rol, esperado]);
    }
  });

  it("operacion cuenta como acceso de configuración", () => {
    expect(
      tieneAlgunAccesoConfiguracion({ "configuracion.operacion": "read" }),
    ).toBe(true);
    expect(
      nivelConfiguracion({ "configuracion.operacion": "write" }, "operacion"),
    ).toBe("write");
    expect(nivelConfiguracion({}, "operacion")).toBe("none");
  });
});
