import assert from "node:assert/strict";
import test from "node:test";
import { ensureSystemRole, ensureSystemRoles, systemRoles } from "./system-roles.js";

test("ensureSystemRole upserts the requested system role", async () => {
  const calls: Array<{
    where: { code: string };
    update: {
      name: string;
      description: string;
      is_system_role: true;
    };
    create: {
      code: string;
      name: string;
      description: string;
      is_system_role: true;
    };
  }> = [];

  await ensureSystemRole(
    {
      role: {
        async upsert(args) {
          calls.push(args);
        },
      },
    },
    "admin",
  );

  assert.equal(calls.length, 1);
  assert.deepEqual(calls[0], {
    where: { code: "admin" },
    update: {
      name: "Admin",
      description: "Full tenant administration access",
      is_system_role: true,
    },
    create: {
      code: "admin",
      name: "Admin",
      description: "Full tenant administration access",
      is_system_role: true,
    },
  });
});

test("ensureSystemRole rejects unknown role codes", async () => {
  await assert.rejects(
    () =>
      ensureSystemRole(
        {
          role: {
            async upsert() {},
          },
        },
        "unknown",
      ),
    /Unknown system role code: unknown/,
  );
});

test("ensureSystemRoles upserts every configured system role", async () => {
  const seenCodes: string[] = [];

  await ensureSystemRoles({
    role: {
      async upsert(args) {
        seenCodes.push(args.where.code);
      },
    },
  });

  assert.deepEqual(
    seenCodes,
    systemRoles.map((role) => role.code),
  );
});
