import { BixiACService } from './ac.service';

describe('# @bixi/ac BixiACService', () => {
  let ac: BixiACService;
  beforeEach(() => {
    ac = new BixiACService();
    ac.setPermissions(['per_a', 'per_b']);
    ac.setRoles(['role_a', 'role_b']);
  });

  it('# ac', () => {
    expect(ac.ac([])).toBe(true);
    expect(ac.ac('per_a')).toBe(true);
    expect(ac.ac('per_c')).toBe(false);
    expect(ac.ac(['per_a', 'per_b'])).toBe(true);
    expect(ac.ac(['per_b', 'per_c'])).toBe(false);
    expect(ac.ac(['per_c', 'per_d'])).toBe(false);

    expect(ac.ac([], { isRole: true })).toBe(true);
    expect(ac.ac('role_a', { isRole: true })).toBe(true);
    expect(ac.ac('role_d', { isRole: true })).toBe(false);
    expect(ac.ac(['role_a', 'role_b'], { isRole: true })).toBe(true);
    expect(ac.ac(['role_b', 'role_c'], { isRole: true })).toBe(false);
    expect(ac.ac(['role_c', 'role_d'], { isRole: true })).toBe(false);
  });

  it('# acAny', () => {
    expect(ac.acAny([])).toBe(false);
    expect(ac.acAny('per_a')).toBe(true);
    expect(ac.acAny('per_c')).toBe(false);
    expect(ac.acAny(['per_a', 'per_b'])).toBe(true);
    expect(ac.acAny(['per_b', 'per_c'])).toBe(true);
    expect(ac.acAny(['per_c', 'per_d'])).toBe(false);

    expect(ac.acAny([], { isRole: true })).toBe(false);
    expect(ac.acAny('role_a', { isRole: true })).toBe(true);
    expect(ac.acAny('role_d', { isRole: true })).toBe(false);
    expect(ac.acAny(['role_a', 'role_b'], { isRole: true })).toBe(true);
    expect(ac.acAny(['role_b', 'role_c'], { isRole: true })).toBe(true);
    expect(ac.acAny(['role_c', 'role_d'], { isRole: true })).toBe(false);
  });

  it('# ace', () => {
    expect(ac.ace([])).toBe(true);
    expect(ac.ace('per_a')).toBe(false);
    expect(ac.ace('per_c')).toBe(true);
    expect(ac.ace(['per_a', 'per_b'])).toBe(false);
    expect(ac.ace(['per_b', 'per_c'])).toBe(false);
    expect(ac.ace(['per_c', 'per_d'])).toBe(true);

    expect(ac.ace([], { isRole: true })).toBe(true);
    expect(ac.ace('role_a', { isRole: true })).toBe(false);
    expect(ac.ace('role_d', { isRole: true })).toBe(true);
    expect(ac.ace(['role_a', 'role_b'], { isRole: true })).toBe(false);
    expect(ac.ace(['role_b', 'role_c'], { isRole: true })).toBe(false);
    expect(ac.ace(['role_c', 'role_d'], { isRole: true })).toBe(true);
  });

  it('# aceAny', () => {
    expect(ac.aceAny([])).toBe(false);
    expect(ac.aceAny('per_a')).toBe(false);
    expect(ac.aceAny('per_c')).toBe(true);
    expect(ac.aceAny(['per_a', 'per_b'])).toBe(false);
    expect(ac.aceAny(['per_b', 'per_c'])).toBe(true);
    expect(ac.aceAny(['per_c', 'per_d'])).toBe(true);

    expect(ac.aceAny([], { isRole: true })).toBe(false);
    expect(ac.aceAny('role_a', { isRole: true })).toBe(false);
    expect(ac.aceAny('role_d', { isRole: true })).toBe(true);
    expect(ac.aceAny(['role_a', 'role_b'], { isRole: true })).toBe(false);
    expect(ac.aceAny(['role_b', 'role_c'], { isRole: true })).toBe(true);
    expect(ac.aceAny(['role_c', 'role_d'], { isRole: true })).toBe(true);
  });
});
