import {
  BOOKING_READ,
  BOOKING_WRITE,
  EVENT_TYPE_READ,
  EVENT_TYPE_WRITE,
  SCHEDULE_READ,
  SCHEDULE_WRITE,
} from "@calcom/platform-constants";

import { hasPermission, hasPermissions, listPermissions } from "../permissions";

describe("Permissions Function: hasPermission", () => {
  let userPermissions: number;
  beforeEach(() => {
    userPermissions = 0;
  });
  it("it should return true if user has the permission", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = hasPermission(userPermissions, EVENT_TYPE_READ);
    expect(result).toEqual(true);
  });

  it("it should return false if user does not have the permission", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = hasPermission(userPermissions, BOOKING_WRITE);
    expect(result).toEqual(false);
  });

  it("it should return false if user does not have the permission", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = hasPermission(userPermissions, SCHEDULE_WRITE);
    expect(result).toEqual(false);
  });
});

describe("Permissions Function: hasPermissions", () => {
  let userPermissions: number;
  beforeEach(() => {
    userPermissions = 0;
  });
  it("it should return true if user has all the permissions", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = hasPermissions(userPermissions, [EVENT_TYPE_READ, SCHEDULE_READ]);
    expect(result).toEqual(true);
  });

  it("it should return false if user does not have all the permissions", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = hasPermissions(userPermissions, [BOOKING_WRITE, SCHEDULE_READ, EVENT_TYPE_READ]);
    expect(result).toEqual(false);
  });

  it("it should return false if user does not have all permissions", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = hasPermissions(userPermissions, [SCHEDULE_WRITE, SCHEDULE_READ]);
    expect(result).toEqual(false);
  });
});

describe("Permissions Function: listPermission", () => {
  let userPermissions: number;
  beforeEach(() => {
    userPermissions = 0;
  });
  it("it should return the list of permissions a user has", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    const result = listPermissions(userPermissions);
    const shouldContainPermissions = [EVENT_TYPE_READ, SCHEDULE_READ];
    const shouldNotContainPermissions = [SCHEDULE_WRITE, EVENT_TYPE_WRITE, BOOKING_READ, BOOKING_WRITE];
    shouldContainPermissions.forEach((permission) => expect(result).toContain(permission));
    shouldNotContainPermissions.forEach((permission) => expect(result).not.toContain(permission));
  });
  it("it should return the list of permissions a user has", () => {
    userPermissions |= EVENT_TYPE_READ;
    userPermissions |= SCHEDULE_READ;
    userPermissions |= BOOKING_WRITE;
    userPermissions |= BOOKING_READ;
    const result = listPermissions(userPermissions);
    const shouldContainPermissions = [EVENT_TYPE_READ, SCHEDULE_READ, BOOKING_WRITE, BOOKING_READ];
    const shouldNotContainPermissions = [SCHEDULE_WRITE, EVENT_TYPE_WRITE];
    shouldContainPermissions.forEach((permission) => expect(result).toContain(permission));
    shouldNotContainPermissions.forEach((permission) => expect(result).not.toContain(permission));
  });
});
