// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assert} from 'chai';
import sinon from 'sinon';

import * as permissions from './permissions.js';
import * as example from 'shared/test/constants-permissions.js';
import * as exampleIssues from 'shared/test/constants-issueV0.js';

import {prpcClient} from 'prpc-client-instance.js';

let dispatch;

describe('permissions reducers', () => {
  it('root reducer initial state', () => {
    const actual = permissions.reducer(undefined, {type: null});
    const expected = {
      byName: {},
      requests: {
        batchGet: {error: null, requesting: false},
      },
    };
    assert.deepEqual(actual, expected);
  });

  it('byName updates on BATCH_GET_SUCCESS', () => {
    const action = {
      type: permissions.BATCH_GET_SUCCESS,
      permissionSets: [example.PERMISSION_SET_ISSUE],
    };
    const actual = permissions.byNameReducer({}, action);
    const expected = {
      [example.PERMISSION_SET_ISSUE.resource]: example.PERMISSION_SET_ISSUE,
    };
    assert.deepEqual(actual, expected);
  });
});

describe('permissions selectors', () => {
  it('byName', () => {
    const state = {permissions: {byName: example.BY_NAME}};
    const actual = permissions.byName(state);
    assert.deepEqual(actual, example.BY_NAME);
  });
});

describe('permissions action creators', () => {
  beforeEach(() => {
    sinon.stub(prpcClient, 'call');
    dispatch = sinon.stub();
  });

  afterEach(() => {
    prpcClient.call.restore();
  });

  describe('batchGet', () => {
    it('success', async () => {
      const response = {permissionSets: [example.PERMISSION_SET_ISSUE]};
      prpcClient.call.returns(Promise.resolve(response));

      await permissions.batchGet([exampleIssues.NAME])(dispatch);

      sinon.assert.calledWith(dispatch, {type: permissions.BATCH_GET_START});

      const args = {names: [exampleIssues.NAME]};
      sinon.assert.calledWith(
          prpcClient.call, 'monorail.v3.Permissions',
          'BatchGetPermissionSets', args);

      const action = {
        type: permissions.BATCH_GET_SUCCESS,
        permissionSets: [example.PERMISSION_SET_ISSUE],
      };
      sinon.assert.calledWith(dispatch, action);
    });

    it('failure', async () => {
      prpcClient.call.throws();

      await permissions.batchGet([exampleIssues.NAME])(dispatch);

      const action = {
        type: permissions.BATCH_GET_FAILURE,
        error: sinon.match.any,
      };
      sinon.assert.calledWith(dispatch, action);
    });

    it('fills in permissions field', async () => {
      const response = {permissionSets: [{resource: exampleIssues.NAME}]};
      prpcClient.call.returns(Promise.resolve(response));

      await permissions.batchGet([exampleIssues.NAME])(dispatch);

      const action = {
        type: permissions.BATCH_GET_SUCCESS,
        permissionSets: [{resource: exampleIssues.NAME, permissions: []}],
      };
      sinon.assert.calledWith(dispatch, action);
    });
  });
});
