// src/lib/auth/impersonation-guard.test.ts — détecteur d'impersonation partagé.
//
// ⚠️ PAS de `mock.module("@/lib/auth")` ici. Vérifié empiriquement (bun 1.3.14) :
// ce stub fuit vers les autres fichiers du même répertoire — `@/lib/auth` et
// `../auth` sont la MÊME entrée de registre — et `admin.test.ts`,
// `two-factor.test.ts`, `username.test.ts` assertent sur la vraie instance
// (`auth.api.enableTwoFactor`…). La réinstallation du module réel en `afterAll`
// ne restaure PAS les bindings. On teste donc le prédicat pur sans mock, et le
// chemin d'échec de `isImpersonating()` avec la vraie `headers()` (qui lève
// hors contexte de requête — exactement le cas que la garde doit absorber).
import { describe, expect, it, mock } from "bun:test";

mock.module("server-only", () => ({}));

describe("sessionIsImpersonated", () => {
  it("est vrai quand la session porte impersonatedBy", async () => {
    const { sessionIsImpersonated } = await import("./impersonation-guard");
    expect(
      sessionIsImpersonated({ session: { impersonatedBy: "admin-1" } }),
    ).toBe(true);
  });

  it("est faux pour une session normale", async () => {
    const { sessionIsImpersonated } = await import("./impersonation-guard");
    expect(sessionIsImpersonated({ session: {} })).toBe(false);
    expect(sessionIsImpersonated({ session: { impersonatedBy: null } })).toBe(
      false,
    );
  });

  it("est faux quand il n'y a pas de session", async () => {
    const { sessionIsImpersonated } = await import("./impersonation-guard");
    expect(sessionIsImpersonated(null)).toBe(false);
    expect(sessionIsImpersonated({ session: null })).toBe(false);
  });
});

describe("isImpersonating", () => {
  it("ne lève pas hors contexte de requête et répond faux", async () => {
    const { isImpersonating } = await import("./impersonation-guard");
    expect(await isImpersonating()).toBe(false);
  });
});
