import { describe, expect, it } from "vitest";
import {
  resolveDeveloperAccessGate,
  shouldFetchDeveloperRequestStatus,
  shouldShowDeveloperAccessLoading,
} from "./developerAccessGate";

describe("developer access gate", () => {
  it("fetches request status only for user roles", () => {
    expect(shouldFetchDeveloperRequestStatus("user")).toBe(true);
    expect(shouldFetchDeveloperRequestStatus("tenant_admin")).toBe(false);
    expect(shouldFetchDeveloperRequestStatus("rp_admin")).toBe(false);
  });

  it("resolves access and request states from the request status", () => {
    expect(resolveDeveloperAccessGate("super_admin", "pending")).toEqual({
      hasDeveloperAccess: true,
      isDeveloperRequestPending: true,
      canRequestDeveloperAccess: false,
    });

    expect(resolveDeveloperAccessGate("user", "approved")).toEqual({
      hasDeveloperAccess: true,
      isDeveloperRequestPending: false,
      canRequestDeveloperAccess: false,
    });

    expect(resolveDeveloperAccessGate("user", "pending")).toEqual({
      hasDeveloperAccess: false,
      isDeveloperRequestPending: true,
      canRequestDeveloperAccess: false,
    });

    expect(resolveDeveloperAccessGate("user", "none")).toEqual({
      hasDeveloperAccess: false,
      isDeveloperRequestPending: false,
      canRequestDeveloperAccess: true,
    });
  });

  it("shows the loading gate only for user requests", () => {
    expect(shouldShowDeveloperAccessLoading("user", true, false)).toBe(true);
    expect(shouldShowDeveloperAccessLoading("user", false, true)).toBe(true);
    expect(shouldShowDeveloperAccessLoading("tenant_admin", true, true)).toBe(
      false,
    );
  });
});
