import * as fs from "fs";
import * as path from "path";
import { InsertOnlyRepository } from "../common/insert-only-repository";

// maeplu-mirror.service.ts es la UNICA excepcion permitida a "maeplu es de
// solo lectura" — y aun asi, solo puede INSERTAR filas nuevas. Esta prueba
// falla si el archivo alguna vez llama a otro metodo de escritura sobre su
// propio repositorio. Es una capa de defensa adicional sobre la garantia
// estructural de InsertOnlyRepository (que ni siquiera expone esos metodos):
// mismo patron de doble red que productos.readonly.spec.ts usa para el lado
// de solo-lectura de maeplu.
describe("MaepluMirrorService solo puede INSERTAR en maeplu, nunca actualizar/borrar", () => {
  const FORBIDDEN = ["save", "update", "delete", "remove", "upsert"];

  it("maeplu-mirror.service.ts no llama a metodos de escritura distintos de insert", () => {
    const source = fs.readFileSync(
      path.join(__dirname, "maeplu-mirror.service.ts"),
      "utf8",
    );

    for (const method of FORBIDDEN) {
      const pattern = new RegExp(`repository\\s*\\.\\s*${method}\\s*\\(`);
      expect(source).not.toMatch(pattern);
    }

    expect(source).toMatch(/repository\s*\.\s*insert\s*\(/);
  });

  it("InsertOnlyRepository no expone metodos de escritura distintos de insert", () => {
    const instance = new InsertOnlyRepository<any>({} as any);
    for (const method of FORBIDDEN) {
      expect((instance as any)[method]).toBeUndefined();
    }
  });
});
