// Copyright 2019 The Chromium Authors. All rights reserved.
// 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 {prpcClient} from 'prpc-client-instance.js';
import * as projectV0 from './projectV0.js';
import {store} from './base.js';
import * as example from 'shared/test/constants-projectV0.js';
import {restrictionLabelsForPermissions} from 'shared/convertersV0.js';
import {fieldTypes, SITEWIDE_DEFAULT_COLUMNS} from 'shared/issue-fields.js';

describe('project reducers', () => {
  it('root reducer initial state', () => {
    const actual = projectV0.reducer(undefined, {type: null});
    const expected = {
      name: null,
      configs: {},
      presentationConfigs: {},
      customPermissions: {},
      visibleMembers: {},
      templates: {},
      requests: {
        fetchConfig: {
          error: null,
          requesting: false,
        },
        fetchCustomPermissions: {
          error: null,
          requesting: false,
        },
        fetchMembers: {
          error: null,
          requesting: false,
        },
        fetchPresentationConfig: {
          error: null,
          requesting: false,
        },
        fetchTemplates: {
          error: null,
          requesting: false,
        },
      },
    };
    assert.deepEqual(actual, expected);
  });

  it('name', () => {
    const action = {type: projectV0.SELECT, projectName: example.PROJECT_NAME};
    assert.deepEqual(projectV0.nameReducer(null, action), example.PROJECT_NAME);
  });

  it('configs updates when fetching Config', () => {
    const action = {
      type: projectV0.FETCH_CONFIG_SUCCESS,
      projectName: example.PROJECT_NAME,
      config: example.CONFIG,
    };
    const expected = {[example.PROJECT_NAME]: example.CONFIG};
    assert.deepEqual(projectV0.configsReducer({}, action), expected);
  });

  it('customPermissions', () => {
    const action = {
      type: projectV0.FETCH_CUSTOM_PERMISSIONS_SUCCESS,
      projectName: example.PROJECT_NAME,
      permissions: example.CUSTOM_PERMISSIONS,
    };
    const expected = {[example.PROJECT_NAME]: example.CUSTOM_PERMISSIONS};
    assert.deepEqual(projectV0.customPermissionsReducer({}, action), expected);
  });

  it('presentationConfigs', () => {
    const action = {
      type: projectV0.FETCH_PRESENTATION_CONFIG_SUCCESS,
      projectName: example.PROJECT_NAME,
      presentationConfig: example.PRESENTATION_CONFIG,
    };
    const expected = {[example.PROJECT_NAME]: example.PRESENTATION_CONFIG};
    assert.deepEqual(projectV0.presentationConfigsReducer({}, action),
      expected);
  });

  it('visibleMembers', () => {
    const action = {
      type: projectV0.FETCH_VISIBLE_MEMBERS_SUCCESS,
      projectName: example.PROJECT_NAME,
      visibleMembers: example.VISIBLE_MEMBERS,
    };
    const expected = {[example.PROJECT_NAME]: example.VISIBLE_MEMBERS};
    assert.deepEqual(projectV0.visibleMembersReducer({}, action), expected);
  });

  it('templates', () => {
    const action = {
      type: projectV0.FETCH_TEMPLATES_SUCCESS,
      projectName: example.PROJECT_NAME,
      templates: [example.TEMPLATE_DEF],
    };
    const expected = {[example.PROJECT_NAME]: [example.TEMPLATE_DEF]};
    assert.deepEqual(projectV0.templatesReducer({}, action), expected);
  });
});

describe('project selectors', () => {
  it('viewedProjectName', () => {
    const actual = projectV0.viewedProjectName(example.STATE);
    assert.deepEqual(actual, example.PROJECT_NAME);
  });

  it('viewedVisibleMembers', () => {
    assert.deepEqual(projectV0.viewedVisibleMembers({}), {});
    assert.deepEqual(projectV0.viewedVisibleMembers({projectV0: {}}), {});
    assert.deepEqual(projectV0.viewedVisibleMembers(
        {projectV0: {visibleMembers: {}}}), {});
    const actual = projectV0.viewedVisibleMembers(example.STATE);
    assert.deepEqual(actual, example.VISIBLE_MEMBERS);
  });

  it('viewedCustomPermissions', () => {
    assert.deepEqual(projectV0.viewedCustomPermissions({}), []);
    assert.deepEqual(projectV0.viewedCustomPermissions({projectV0: {}}), []);
    assert.deepEqual(projectV0.viewedCustomPermissions(
        {projectV0: {customPermissions: {}}}), []);
    const actual = projectV0.viewedCustomPermissions(example.STATE);
    assert.deepEqual(actual, example.CUSTOM_PERMISSIONS);
  });

  it('viewedPresentationConfig', () => {
    assert.deepEqual(projectV0.viewedPresentationConfig({}), {});
    assert.deepEqual(projectV0.viewedPresentationConfig({projectV0: {}}), {});
    const actual = projectV0.viewedPresentationConfig(example.STATE);
    assert.deepEqual(actual, example.PRESENTATION_CONFIG);
  });

  it('defaultColumns', () => {
    assert.deepEqual(projectV0.defaultColumns({}), SITEWIDE_DEFAULT_COLUMNS);
    assert.deepEqual(
        projectV0.defaultColumns({projectV0: {}}), SITEWIDE_DEFAULT_COLUMNS);
    assert.deepEqual(
        projectV0.defaultColumns({projectV0: {presentationConfig: {}}}),
        SITEWIDE_DEFAULT_COLUMNS);
    const expected = ['ID', 'Summary', 'AllLabels'];
    assert.deepEqual(projectV0.defaultColumns(example.STATE), expected);
  });

  it('defaultQuery', () => {
    assert.deepEqual(projectV0.defaultQuery({}), '');
    assert.deepEqual(projectV0.defaultQuery({projectV0: {}}), '');
    const actual = projectV0.defaultQuery(example.STATE);
    assert.deepEqual(actual, example.DEFAULT_QUERY);
  });

  it('fieldDefs', () => {
    assert.deepEqual(projectV0.fieldDefs({projectV0: {}}), []);
    assert.deepEqual(projectV0.fieldDefs({projectV0: {config: {}}}), []);
    const actual = projectV0.fieldDefs(example.STATE);
    assert.deepEqual(actual, example.FIELD_DEFS);
  });

  it('labelDefMap', () => {
    const labelDefs = (permissions) =>
        restrictionLabelsForPermissions(permissions).map((labelDef) =>
            [labelDef.label.toLowerCase(), labelDef]);

    assert.deepEqual(
      projectV0.labelDefMap({projectV0: {}}), new Map(labelDefs([])));
    assert.deepEqual(
      projectV0.labelDefMap({projectV0: {config: {}}}), new Map(labelDefs([])));
    const expected = new Map([
      ['one', {label: 'One'}],
      ['enum', {label: 'EnUm'}],
      ['enum-options', {label: 'eNuM-Options'}],
      ['hello-world', {label: 'hello-world', docstring: 'hmmm'}],
      ['hello-me', {label: 'hello-me', docstring: 'hmmm'}],
      ...labelDefs(example.CUSTOM_PERMISSIONS),
    ]);
    assert.deepEqual(projectV0.labelDefMap(example.STATE), expected);
  });

  it('labelPrefixValueMap', () => {
    const builtInLabelPrefixes = [
      ['Restrict', new Set(['View-EditIssue', 'AddIssueComment-EditIssue'])],
      ['Restrict-View', new Set(['EditIssue'])],
      ['Restrict-AddIssueComment', new Set(['EditIssue'])],
    ];
    assert.deepEqual(projectV0.labelPrefixValueMap({projectV0: {}}),
        new Map(builtInLabelPrefixes));

    assert.deepEqual(projectV0.labelPrefixValueMap(
        {projectV0: {config: {}}}), new Map(builtInLabelPrefixes));

    const expected = new Map([
      ['Restrict', new Set(['View-Google', 'View-Security', 'EditIssue-Google',
          'EditIssue-Security', 'AddIssueComment-Google',
          'AddIssueComment-Security', 'DeleteIssue-Google',
          'DeleteIssue-Security', 'FlagSpam-Google', 'FlagSpam-Security',
          'View-EditIssue', 'AddIssueComment-EditIssue'])],
      ['Restrict-View', new Set(['Google', 'Security', 'EditIssue'])],
      ['Restrict-EditIssue', new Set(['Google', 'Security'])],
      ['Restrict-AddIssueComment', new Set(['Google', 'Security', 'EditIssue'])],
      ['Restrict-DeleteIssue', new Set(['Google', 'Security'])],
      ['Restrict-FlagSpam', new Set(['Google', 'Security'])],
      ['eNuM', new Set(['Options'])],
      ['hello', new Set(['world', 'me'])],
    ]);
    assert.deepEqual(projectV0.labelPrefixValueMap(example.STATE), expected);
  });

  it('labelPrefixFields', () => {
    const fields1 = projectV0.labelPrefixFields({projectV0: {}});
    assert.deepEqual(fields1, ['Restrict']);
    const fields2 = projectV0.labelPrefixFields({projectV0: {config: {}}});
    assert.deepEqual(fields2, ['Restrict']);
    const expected = [
      'hello', 'Restrict', 'Restrict-View', 'Restrict-EditIssue',
      'Restrict-AddIssueComment', 'Restrict-DeleteIssue', 'Restrict-FlagSpam'
    ];
    assert.deepEqual(projectV0.labelPrefixFields(example.STATE), expected);
  });

  it('enumFieldDefs', () => {
    assert.deepEqual(projectV0.enumFieldDefs({projectV0: {}}), []);
    assert.deepEqual(projectV0.enumFieldDefs({projectV0: {config: {}}}), []);
    const expected = [example.FIELD_DEF_ENUM];
    assert.deepEqual(projectV0.enumFieldDefs(example.STATE), expected);
  });

  it('optionsPerEnumField', () => {
    assert.deepEqual(projectV0.optionsPerEnumField({projectV0: {}}), new Map());
    const expected = new Map([
      ['enum', [
        {label: 'eNuM-Options', optionName: 'Options'},
      ]],
    ]);
    assert.deepEqual(projectV0.optionsPerEnumField(example.STATE), expected);
  });

  it('viewedPresentationConfigLoaded', () => {
    const loadConfigAction = {
      type: projectV0.FETCH_PRESENTATION_CONFIG_SUCCESS,
      projectName: example.PROJECT_NAME,
      presentationConfig: example.PRESENTATION_CONFIG,
    };
    const selectProjectAction = {
      type: projectV0.SELECT,
      projectName: example.PROJECT_NAME,
    };
    let projectState = {};

    assert.equal(false, projectV0.viewedPresentationConfigLoaded(
        {projectV0: projectState}));

    projectState = projectV0.reducer(projectState, selectProjectAction);
    projectState = projectV0.reducer(projectState, loadConfigAction);

    assert.equal(true, projectV0.viewedPresentationConfigLoaded(
        {projectV0: projectState}));
  });

  it('fetchingPresentationConfig', () => {
    const projectState = projectV0.reducer(undefined, {type: null});
    assert.equal(false,
        projectState.requests.fetchPresentationConfig.requesting);
  });

  describe('extractTypeForFieldName', () => {
    let typeExtractor;

    describe('built-in fields', () => {
      beforeEach(() => {
        typeExtractor = projectV0.extractTypeForFieldName({});
      });

      it('not case sensitive', () => {
        assert.deepEqual(typeExtractor('id'), fieldTypes.ISSUE_TYPE);
        assert.deepEqual(typeExtractor('iD'), fieldTypes.ISSUE_TYPE);
        assert.deepEqual(typeExtractor('Id'), fieldTypes.ISSUE_TYPE);
      });

      it('gets type for ID', () => {
        assert.deepEqual(typeExtractor('ID'), fieldTypes.ISSUE_TYPE);
      });

      it('gets type for Project', () => {
        assert.deepEqual(typeExtractor('Project'), fieldTypes.PROJECT_TYPE);
      });

      it('gets type for Attachments', () => {
        assert.deepEqual(typeExtractor('Attachments'), fieldTypes.INT_TYPE);
      });

      it('gets type for AllLabels', () => {
        assert.deepEqual(typeExtractor('AllLabels'), fieldTypes.LABEL_TYPE);
      });

      it('gets type for AllLabels', () => {
        assert.deepEqual(typeExtractor('AllLabels'), fieldTypes.LABEL_TYPE);
      });

      it('gets type for Blocked', () => {
        assert.deepEqual(typeExtractor('Blocked'), fieldTypes.STR_TYPE);
      });

      it('gets type for BlockedOn', () => {
        assert.deepEqual(typeExtractor('BlockedOn'), fieldTypes.ISSUE_TYPE);
      });

      it('gets type for Blocking', () => {
        assert.deepEqual(typeExtractor('Blocking'), fieldTypes.ISSUE_TYPE);
      });

      it('gets type for CC', () => {
        assert.deepEqual(typeExtractor('CC'), fieldTypes.USER_TYPE);
      });

      it('gets type for Closed', () => {
        assert.deepEqual(typeExtractor('Closed'), fieldTypes.TIME_TYPE);
      });

      it('gets type for Component', () => {
        assert.deepEqual(typeExtractor('Component'), fieldTypes.COMPONENT_TYPE);
      });

      it('gets type for ComponentModified', () => {
        assert.deepEqual(typeExtractor('ComponentModified'),
            fieldTypes.TIME_TYPE);
      });

      it('gets type for MergedInto', () => {
        assert.deepEqual(typeExtractor('MergedInto'), fieldTypes.ISSUE_TYPE);
      });

      it('gets type for Modified', () => {
        assert.deepEqual(typeExtractor('Modified'), fieldTypes.TIME_TYPE);
      });

      it('gets type for Reporter', () => {
        assert.deepEqual(typeExtractor('Reporter'), fieldTypes.USER_TYPE);
      });

      it('gets type for Stars', () => {
        assert.deepEqual(typeExtractor('Stars'), fieldTypes.INT_TYPE);
      });

      it('gets type for Status', () => {
        assert.deepEqual(typeExtractor('Status'), fieldTypes.STATUS_TYPE);
      });

      it('gets type for StatusModified', () => {
        assert.deepEqual(typeExtractor('StatusModified'), fieldTypes.TIME_TYPE);
      });

      it('gets type for Summary', () => {
        assert.deepEqual(typeExtractor('Summary'), fieldTypes.STR_TYPE);
      });

      it('gets type for Type', () => {
        assert.deepEqual(typeExtractor('Type'), fieldTypes.ENUM_TYPE);
      });

      it('gets type for Owner', () => {
        assert.deepEqual(typeExtractor('Owner'), fieldTypes.USER_TYPE);
      });

      it('gets type for OwnerModified', () => {
        assert.deepEqual(typeExtractor('OwnerModified'), fieldTypes.TIME_TYPE);
      });

      it('gets type for Opened', () => {
        assert.deepEqual(typeExtractor('Opened'), fieldTypes.TIME_TYPE);
      });
    });

    it('gets types for custom fields', () => {
      typeExtractor = projectV0.extractTypeForFieldName({projectV0: {
        name: example.PROJECT_NAME,
        configs: {[example.PROJECT_NAME]: {fieldDefs: [
          {fieldRef: {fieldName: 'CustomIntField', type: 'INT_TYPE'}},
          {fieldRef: {fieldName: 'CustomStrField', type: 'STR_TYPE'}},
          {fieldRef: {fieldName: 'CustomUserField', type: 'USER_TYPE'}},
          {fieldRef: {fieldName: 'CustomEnumField', type: 'ENUM_TYPE'}},
          {fieldRef: {fieldName: 'CustomApprovalField',
            type: 'APPROVAL_TYPE'}},
        ]}},
      }});

      assert.deepEqual(typeExtractor('CustomIntField'), fieldTypes.INT_TYPE);
      assert.deepEqual(typeExtractor('CustomStrField'), fieldTypes.STR_TYPE);
      assert.deepEqual(typeExtractor('CustomUserField'), fieldTypes.USER_TYPE);
      assert.deepEqual(typeExtractor('CustomEnumField'), fieldTypes.ENUM_TYPE);
      assert.deepEqual(typeExtractor('CustomApprovalField'),
          fieldTypes.APPROVAL_TYPE);
    });

    it('defaults to string type for other fields', () => {
      typeExtractor = projectV0.extractTypeForFieldName({projectV0: {
        name: example.PROJECT_NAME,
        configs: {[example.PROJECT_NAME]: {fieldDefs: [
          {fieldRef: {fieldName: 'CustomIntField', type: 'INT_TYPE'}},
          {fieldRef: {fieldName: 'CustomUserField', type: 'USER_TYPE'}},
        ]}},
      }});

      assert.deepEqual(typeExtractor('FakeUserField'), fieldTypes.STR_TYPE);
      assert.deepEqual(typeExtractor('NotOwner'), fieldTypes.STR_TYPE);
    });
  });

  describe('extractFieldValuesFromIssue', () => {
    let clock;
    let issue;
    let fieldExtractor;

    describe('built-in fields', () => {
      beforeEach(() => {
        // Built-in fields will always act the same, regardless of
        // project config.
        fieldExtractor = projectV0.extractFieldValuesFromIssue({});

        // Set clock to some specified date for relative time.
        const initialTime = 365 * 24 * 60 * 60;

        issue = {
          localId: 33,
          projectName: 'chromium',
          summary: 'Test summary',
          attachmentCount: 22,
          starCount: 2,
          componentRefs: [{path: 'Infra'}, {path: 'Monorail>UI'}],
          blockedOnIssueRefs: [{localId: 30, projectName: 'chromium'}],
          blockingIssueRefs: [{localId: 60, projectName: 'chromium'}],
          labelRefs: [{label: 'Restrict-View-Google'}, {label: 'Type-Defect'}],
          reporterRef: {displayName: 'test@example.com'},
          ccRefs: [{displayName: 'test@example.com'}],
          ownerRef: {displayName: 'owner@example.com'},
          closedTimestamp: initialTime - 120, // 2 minutes ago
          modifiedTimestamp: initialTime - 60, // a minute ago
          openedTimestamp: initialTime - 24 * 60 * 60, // a day ago
          componentModifiedTimestamp: initialTime - 60, // a minute ago
          statusModifiedTimestamp: initialTime - 60, // a minute ago
          ownerModifiedTimestamp: initialTime - 60, // a minute ago
          statusRef: {status: 'Duplicate'},
          mergedIntoIssueRef: {localId: 31, projectName: 'chromium'},
        };

        clock = sinon.useFakeTimers({
          now: new Date(initialTime * 1000),
          shouldAdvanceTime: false,
        });
      });

      afterEach(() => {
        clock.restore();
      });

      it('computes strings for ID', () => {
        const fieldName = 'ID';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['chromium:33']);
      });

      it('computes strings for Project', () => {
        const fieldName = 'Project';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['chromium']);
      });

      it('computes strings for Attachments', () => {
        const fieldName = 'Attachments';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['22']);
      });

      it('computes strings for AllLabels', () => {
        const fieldName = 'AllLabels';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['Restrict-View-Google', 'Type-Defect']);
      });

      it('computes strings for Blocked when issue is blocked', () => {
        const fieldName = 'Blocked';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['Yes']);
      });

      it('computes strings for Blocked when issue is not blocked', () => {
        const fieldName = 'Blocked';
        issue.blockedOnIssueRefs = [];

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['No']);
      });

      it('computes strings for BlockedOn', () => {
        const fieldName = 'BlockedOn';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['chromium:30']);
      });

      it('computes strings for Blocking', () => {
        const fieldName = 'Blocking';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['chromium:60']);
      });

      it('computes strings for CC', () => {
        const fieldName = 'CC';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['test@example.com']);
      });

      it('computes strings for Closed', () => {
        const fieldName = 'Closed';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['2 minutes ago']);
      });

      it('computes strings for Component', () => {
        const fieldName = 'Component';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['Infra', 'Monorail>UI']);
      });

      it('computes strings for ComponentModified', () => {
        const fieldName = 'ComponentModified';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['a minute ago']);
      });

      it('computes strings for MergedInto', () => {
        const fieldName = 'MergedInto';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['chromium:31']);
      });

      it('computes strings for Modified', () => {
        const fieldName = 'Modified';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['a minute ago']);
      });

      it('computes strings for Reporter', () => {
        const fieldName = 'Reporter';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['test@example.com']);
      });

      it('computes strings for Stars', () => {
        const fieldName = 'Stars';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['2']);
      });

      it('computes strings for Status', () => {
        const fieldName = 'Status';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['Duplicate']);
      });

      it('computes strings for StatusModified', () => {
        const fieldName = 'StatusModified';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['a minute ago']);
      });

      it('computes strings for Summary', () => {
        const fieldName = 'Summary';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['Test summary']);
      });

      it('computes strings for Type', () => {
        const fieldName = 'Type';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['Defect']);
      });

      it('computes strings for Owner', () => {
        const fieldName = 'Owner';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['owner@example.com']);
      });

      it('computes strings for OwnerModified', () => {
        const fieldName = 'OwnerModified';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['a minute ago']);
      });

      it('computes strings for Opened', () => {
        const fieldName = 'Opened';

        assert.deepEqual(fieldExtractor(issue, fieldName),
            ['a day ago']);
      });
    });

    describe('custom approval fields', () => {
      beforeEach(() => {
        const fieldDefs = [
          {fieldRef: {type: 'APPROVAL_TYPE', fieldName: 'Goose-Approval'}},
          {fieldRef: {type: 'APPROVAL_TYPE', fieldName: 'Chicken-Approval'}},
          {fieldRef: {type: 'APPROVAL_TYPE', fieldName: 'Dodo-Approval'}},
        ];
        fieldExtractor = projectV0.extractFieldValuesFromIssue({
          projectV0: {
            name: example.PROJECT_NAME,
            configs: {
              [example.PROJECT_NAME]: {
                projectName: 'chromium',
                fieldDefs,
              },
            },
          },
        });

        issue = {
          localId: 33,
          projectName: 'bird',
          approvalValues: [
            {fieldRef: {type: 'APPROVAL_TYPE', fieldName: 'Goose-Approval'},
              approverRefs: []},
            {fieldRef: {type: 'APPROVAL_TYPE', fieldName: 'Chicken-Approval'},
              status: 'APPROVED'},
            {fieldRef: {type: 'APPROVAL_TYPE', fieldName: 'Dodo-Approval'},
              status: 'NEED_INFO', approverRefs: [
                {displayName: 'kiwi@bird.test'},
                {displayName: 'mini-dino@bird.test'},
              ],
            },
          ],
        };
      });

      it('handles approval approver columns', () => {
        assert.deepEqual(fieldExtractor(issue, 'goose-approval-approver'), []);
        assert.deepEqual(fieldExtractor(issue, 'chicken-approval-approver'),
            []);
        assert.deepEqual(fieldExtractor(issue, 'dodo-approval-approver'),
            ['kiwi@bird.test', 'mini-dino@bird.test']);
      });

      it('handles approval value columns', () => {
        assert.deepEqual(fieldExtractor(issue, 'goose-approval'), ['NotSet']);
        assert.deepEqual(fieldExtractor(issue, 'chicken-approval'),
            ['Approved']);
        assert.deepEqual(fieldExtractor(issue, 'dodo-approval'),
            ['NeedInfo']);
      });
    });

    describe('custom fields', () => {
      beforeEach(() => {
        const fieldDefs = [
          {fieldRef: {type: 'STR_TYPE', fieldName: 'aString'}},
          {fieldRef: {type: 'ENUM_TYPE', fieldName: 'ENUM'}},
          {fieldRef: {type: 'INT_TYPE', fieldName: 'Cow-Number'},
            bool_is_phase_field: true, is_multivalued: true},
        ];
        // As a label prefix, aString conflicts with the custom field named
        // "aString". In this case, Monorail gives precedence to the
        // custom field.
        const labelDefs = [
          {label: 'aString-ignore'},
          {label: 'aString-two'},
        ];
        fieldExtractor = projectV0.extractFieldValuesFromIssue({
          projectV0: {
            name: example.PROJECT_NAME,
            configs: {
              [example.PROJECT_NAME]: {
                projectName: 'chromium',
                fieldDefs,
                labelDefs,
              },
            },
          },
        });

        const fieldValues = [
          {fieldRef: {type: 'STR_TYPE', fieldName: 'aString'},
            value: 'test'},
          {fieldRef: {type: 'STR_TYPE', fieldName: 'aString'},
            value: 'test2'},
          {fieldRef: {type: 'ENUM_TYPE', fieldName: 'ENUM'},
            value: 'a-value'},
          {fieldRef: {type: 'INT_TYPE', fieldId: '6', fieldName: 'Cow-Number'},
            phaseRef: {phaseName: 'Cow-Phase'}, value: '55'},
          {fieldRef: {type: 'INT_TYPE', fieldId: '6', fieldName: 'Cow-Number'},
            phaseRef: {phaseName: 'Cow-Phase'}, value: '54'},
          {fieldRef: {type: 'INT_TYPE', fieldId: '6', fieldName: 'Cow-Number'},
            phaseRef: {phaseName: 'MilkCow-Phase'}, value: '56'},
        ];

        issue = {
          localId: 33,
          projectName: 'chromium',
          fieldValues,
        };
      });

      it('gets values for custom fields', () => {
        assert.deepEqual(fieldExtractor(issue, 'aString'), ['test', 'test2']);
        assert.deepEqual(fieldExtractor(issue, 'enum'), ['a-value']);
        assert.deepEqual(fieldExtractor(issue, 'cow-phase.cow-number'),
            ['55', '54']);
        assert.deepEqual(fieldExtractor(issue, 'milkcow-phase.cow-number'),
            ['56']);
      });

      it('custom fields get precedence over label fields', () => {
        issue.labelRefs = [{label: 'aString-ignore'}];
        assert.deepEqual(fieldExtractor(issue, 'aString'),
            ['test', 'test2']);
      });
    });

    describe('label prefix fields', () => {
      beforeEach(() => {
        issue = {
          localId: 33,
          projectName: 'chromium',
          labelRefs: [
            {label: 'test-label'},
            {label: 'test-label-2'},
            {label: 'ignore-me'},
            {label: 'Milestone-UI'},
            {label: 'Milestone-Goodies'},
          ],
        };

        fieldExtractor = projectV0.extractFieldValuesFromIssue({
          projectV0: {
            name: example.PROJECT_NAME,
            configs: {
              [example.PROJECT_NAME]: {
                projectName: 'chromium',
                labelDefs: [
                  {label: 'test-1'},
                  {label: 'test-2'},
                  {label: 'milestone-1'},
                  {label: 'milestone-2'},
                ],
              },
            },
          },
        });
      });

      it('gets values for label prefixes', () => {
        assert.deepEqual(fieldExtractor(issue, 'test'), ['label', 'label-2']);
        assert.deepEqual(fieldExtractor(issue, 'Milestone'), ['UI', 'Goodies']);
      });
    });
  });

  it('fieldDefsByApprovalName', () => {
    assert.deepEqual(projectV0.fieldDefsByApprovalName({projectV0: {}}),
        new Map());

    assert.deepEqual(projectV0.fieldDefsByApprovalName({projectV0: {
      name: example.PROJECT_NAME,
      configs: {[example.PROJECT_NAME]: {
        fieldDefs: [
          {fieldRef: {fieldName: 'test', type: fieldTypes.INT_TYPE}},
          {fieldRef: {fieldName: 'ignoreMe', type: fieldTypes.APPROVAL_TYPE}},
          {fieldRef: {fieldName: 'yay', approvalName: 'ThisIsAnApproval'}},
          {fieldRef: {fieldName: 'ImAField', approvalName: 'ThisIsAnApproval'}},
          {fieldRef: {fieldName: 'TalkToALawyer', approvalName: 'Legal'}},
        ],
      }},
    }}), new Map([
      ['ThisIsAnApproval', [
        {fieldRef: {fieldName: 'yay', approvalName: 'ThisIsAnApproval'}},
        {fieldRef: {fieldName: 'ImAField', approvalName: 'ThisIsAnApproval'}},
      ]],
      ['Legal', [
        {fieldRef: {fieldName: 'TalkToALawyer', approvalName: 'Legal'}},
      ]],
    ]));
  });
});

let dispatch;

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

    dispatch = sinon.stub();
  });

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

  it('select', () => {
    projectV0.select('project-name')(dispatch);
    const action = {type: projectV0.SELECT, projectName: 'project-name'};
    sinon.assert.calledWith(dispatch, action);
  });

  it('fetchCustomPermissions', async () => {
    const action = projectV0.fetchCustomPermissions('chromium');

    prpcClient.call.returns(Promise.resolve({permissions: ['google']}));

    await action(dispatch);

    sinon.assert.calledWith(dispatch,
        {type: projectV0.FETCH_CUSTOM_PERMISSIONS_START});

    sinon.assert.calledWith(
        prpcClient.call,
        'monorail.Projects',
        'GetCustomPermissions',
        {projectName: 'chromium'});

    sinon.assert.calledWith(dispatch, {
      type: projectV0.FETCH_CUSTOM_PERMISSIONS_SUCCESS,
      projectName: 'chromium',
      permissions: ['google'],
    });
  });

  it('fetchPresentationConfig', async () => {
    const action = projectV0.fetchPresentationConfig('chromium');

    prpcClient.call.returns(Promise.resolve({projectThumbnailUrl: 'test'}));

    await action(dispatch);

    sinon.assert.calledWith(dispatch,
        {type: projectV0.FETCH_PRESENTATION_CONFIG_START});

    sinon.assert.calledWith(
        prpcClient.call,
        'monorail.Projects',
        'GetPresentationConfig',
        {projectName: 'chromium'});

    sinon.assert.calledWith(dispatch, {
      type: projectV0.FETCH_PRESENTATION_CONFIG_SUCCESS,
      projectName: 'chromium',
      presentationConfig: {projectThumbnailUrl: 'test'},
    });
  });

  it('fetchVisibleMembers', async () => {
    const action = projectV0.fetchVisibleMembers('chromium');

    prpcClient.call.returns(Promise.resolve({userRefs: [{userId: '123'}]}));

    await action(dispatch);

    sinon.assert.calledWith(dispatch,
        {type: projectV0.FETCH_VISIBLE_MEMBERS_START});

    sinon.assert.calledWith(
        prpcClient.call,
        'monorail.Projects',
        'GetVisibleMembers',
        {projectName: 'chromium'});

    sinon.assert.calledWith(dispatch, {
      type: projectV0.FETCH_VISIBLE_MEMBERS_SUCCESS,
      projectName: 'chromium',
      visibleMembers: {userRefs: [{userId: '123'}]},
    });
  });
});

describe('helpers', () => {
  beforeEach(() => {
    sinon.stub(prpcClient, 'call');
  });

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

  describe('fetchFieldPerms', () => {
    it('fetch field permissions', async () => {
      const projectName = 'proj';
      const fieldDefs = [
        {
          fieldRef: {
            fieldName: 'testField',
            fieldId: 1,
            type: 'ENUM_TYPE',
          },
        },
      ];
      const response = {};
      prpcClient.call.returns(Promise.resolve(response));

      await store.dispatch(projectV0.fetchFieldPerms(projectName, fieldDefs));

      const args = {names: ['projects/proj/fieldDefs/1']};
      sinon.assert.calledWith(
          prpcClient.call, 'monorail.v3.Permissions',
          'BatchGetPermissionSets', args);
    });

    it('fetch with no fieldDefs', async () => {
      const config = {projectName: 'proj'};
      const response = {};
      prpcClient.call.returns(Promise.resolve(response));

      // fieldDefs will be undefined.
      await store.dispatch(projectV0.fetchFieldPerms(
          config.projectName, config.fieldDefs));

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