// Copyright 2019 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 {UserInputError} from 'shared/errors.js';
import * as exampleUsers from 'shared/test/constants-users.js';
import {displayNameToUserRef, userIdOrDisplayNameToUserRef,
  userNameToId, userV3ToRef, labelStringToRef,
  labelRefToString, labelRefsToStrings, labelRefsToOneWordLabels,
  isOneWordLabel, _makeRestrictionLabel, restrictionLabelsForPermissions,
  fieldDefToName, statusRefToString, statusRefsToStrings,
  componentStringToRef, componentRefToString, componentRefsToStrings,
  issueStringToRef, issueStringToBlockingRef, issueRefToString,
  issueRefToUrl, fieldNameToLabelPrefix, labelNameToLabelPrefixes,
  labelNameToLabelValue, commentListToDescriptionList, valueToFieldValue,
  issueToIssueRef, issueNameToRef, issueNameToRefString, issueToName,
} from './convertersV0.js';

describe('displayNameToUserRef', () => {
  it('converts displayName', () => {
    assert.deepEqual(
        displayNameToUserRef('foo@bar.com'),
        {displayName: 'foo@bar.com'});
  });

  it('throws on invalid email', () => {
    assert.throws(() => displayNameToUserRef('foo'), UserInputError);
  });
});

describe('userIdOrDisplayNameToUserRef', () => {
  it('converts userId', () => {
    assert.throws(() => displayNameToUserRef('foo'));
    assert.deepEqual(
        userIdOrDisplayNameToUserRef('12345678'),
        {userId: 12345678});
  });

  it('converts displayName', () => {
    assert.deepEqual(
        userIdOrDisplayNameToUserRef('foo@bar.com'),
        {displayName: 'foo@bar.com'});
  });

  it('throws if not an email or numeric id', () => {
    assert.throws(() => userIdOrDisplayNameToUserRef('foo'), UserInputError);
  });
});

it('userNameToId', () => {
  assert.deepEqual(userNameToId(exampleUsers.NAME), exampleUsers.ID);
});

it('userV3ToRef', () => {
  assert.deepEqual(userV3ToRef(exampleUsers.USER), exampleUsers.USER_REF);
});

describe('labelStringToRef', () => {
  it('converts label', () => {
    assert.deepEqual(labelStringToRef('foo'), {label: 'foo'});
  });
});

describe('labelRefToString', () => {
  it('converts labelRef', () => {
    assert.deepEqual(labelRefToString({label: 'foo'}), 'foo');
  });
});

describe('labelRefsToStrings', () => {
  it('converts labelRefs', () => {
    assert.deepEqual(labelRefsToStrings([{label: 'foo'}, {label: 'test'}]),
        ['foo', 'test']);
  });
});

describe('labelRefsToOneWordLabels', () => {
  it('empty', () => {
    assert.deepEqual(labelRefsToOneWordLabels(), []);
    assert.deepEqual(labelRefsToOneWordLabels([]), []);
  });

  it('filters multi-word labels', () => {
    assert.deepEqual(labelRefsToOneWordLabels([
      {label: 'hello'},
      {label: 'filter-me'},
      {label: 'hello-world'},
      {label: 'world'},
      {label: 'this-label-has-so-many-words'},
    ]), [
      {label: 'hello'},
      {label: 'world'},
    ]);
  });
});

describe('isOneWordLabel', () => {
  it('true only for one word labels', () => {
    assert.isTrue(isOneWordLabel('test'));
    assert.isTrue(isOneWordLabel('LABEL'));
    assert.isTrue(isOneWordLabel('Security'));

    assert.isFalse(isOneWordLabel('Restrict-View-EditIssue'));
    assert.isFalse(isOneWordLabel('Type-Feature'));
  });
});

describe('_makeRestrictionLabel', () => {
  it('creates label', () => {
    assert.deepEqual(_makeRestrictionLabel('View', 'Google'), {
      label: `Restrict-View-Google`,
      docstring: `Permission Google needed to use View`,
    });
  });

  it('capitalizes permission name', () => {
    assert.deepEqual(_makeRestrictionLabel('EditIssue', 'security'), {
      label: `Restrict-EditIssue-Security`,
      docstring: `Permission Security needed to use EditIssue`,
    });
  });
});

describe('restrictionLabelsForPermissions', () => {
  it('creates labels for permissions and actions', () => {
    assert.deepEqual(restrictionLabelsForPermissions(['google', 'security'],
        ['View', 'EditIssue'], []), [
      {
        label: 'Restrict-View-Google',
        docstring: 'Permission Google needed to use View',
      }, {
        label: 'Restrict-View-Security',
        docstring: 'Permission Security needed to use View',
      }, {
        label: 'Restrict-EditIssue-Google',
        docstring: 'Permission Google needed to use EditIssue',
      }, {
        label: 'Restrict-EditIssue-Security',
        docstring: 'Permission Security needed to use EditIssue',
      },
    ]);
  });

  it('appends default labels when specified', () => {
    assert.deepEqual(restrictionLabelsForPermissions(['Google'], ['View'], [
      {label: 'Restrict-Hello-World', docstring: 'description of label'},
    ]), [
      {
        label: 'Restrict-View-Google',
        docstring: 'Permission Google needed to use View',
      },
      {label: 'Restrict-Hello-World', docstring: 'description of label'},
    ]);
  });
});

describe('fieldNameToLabelPrefix', () => {
  it('converts fieldName', () => {
    assert.deepEqual(fieldNameToLabelPrefix('test'), 'test-');
    assert.deepEqual(fieldNameToLabelPrefix('test-hello'), 'test-hello-');
    assert.deepEqual(fieldNameToLabelPrefix('WHATEVER'), 'whatever-');
  });
});

describe('labelNameToLabelPrefixes', () => {
  it('converts labelName', () => {
    assert.deepEqual(labelNameToLabelPrefixes('test'), []);
    assert.deepEqual(labelNameToLabelPrefixes('test-hello'), ['test']);
    assert.deepEqual(labelNameToLabelPrefixes('WHATEVER-this-label-is'),
        ['WHATEVER', 'WHATEVER-this', 'WHATEVER-this-label']);
  });
});

describe('labelNameToLabelValue', () => {
  it('returns null when no matching value found in label', () => {
    assert.isNull(labelNameToLabelValue('test-hello', ''));
    assert.isNull(labelNameToLabelValue('', 'test'));
    assert.isNull(labelNameToLabelValue('test-hello', 'hello'));
    assert.isNull(labelNameToLabelValue('test-hello', 'tes'));
    assert.isNull(labelNameToLabelValue('test', 'test'));
  });

  it('converts labelName', () => {
    assert.deepEqual(labelNameToLabelValue('test-hello', 'test'), 'hello');
    assert.deepEqual(labelNameToLabelValue('WHATEVER-this-label-is',
        'WHATEVER'), 'this-label-is');
    assert.deepEqual(labelNameToLabelValue('WHATEVER-this-label-is',
        'WHATEVER-this'), 'label-is');
    assert.deepEqual(labelNameToLabelValue('WHATEVER-this-label-is',
        'WHATEVER-this-label'), 'is');
  });

  it('fieldName is case insenstitive', () => {
    assert.deepEqual(labelNameToLabelValue('test-hello', 'TEST'), 'hello');
    assert.deepEqual(labelNameToLabelValue('test-hello', 'tEsT'), 'hello');
    assert.deepEqual(labelNameToLabelValue('TEST-hello', 'test'), 'hello');
  });
});

describe('fieldDefToName', () => {
  it('converts fieldDef', () => {
    const fieldDef = {fieldRef: {fieldId: '1'}};
    const actual = fieldDefToName('project-name', fieldDef);
    assert.equal(actual, 'projects/project-name/fieldDefs/1');
  });
});

describe('statusRefToString', () => {
  it('converts statusRef', () => {
    assert.deepEqual(statusRefToString({status: 'foo'}), 'foo');
  });
});

describe('statusRefsToStrings', () => {
  it('converts statusRefs', () => {
    assert.deepEqual(statusRefsToStrings(
        [{status: 'hello'}, {status: 'world'}]), ['hello', 'world']);
  });
});

describe('componentStringToRef', () => {
  it('converts component', () => {
    assert.deepEqual(componentStringToRef('foo'), {path: 'foo'});
  });
});

describe('componentRefToString', () => {
  it('converts componentRef', () => {
    assert.deepEqual(componentRefToString({path: 'Hello>World'}),
        'Hello>World');
  });
});

describe('componentRefsToStrings', () => {
  it('converts componentRefs', () => {
    assert.deepEqual(componentRefsToStrings(
        [{path: 'Hello>World'}, {path: 'Test'}]), ['Hello>World', 'Test']);
  });
});

describe('issueStringToRef', () => {
  it('converts issue default project', () => {
    assert.deepEqual(
        issueStringToRef('1234', 'proj'),
        {projectName: 'proj', localId: 1234});
  });

  it('converts issue with project', () => {
    assert.deepEqual(
        issueStringToRef('foo:1234', 'proj'),
        {projectName: 'foo', localId: 1234});
  });

  it('converts external issue references', () => {
    assert.deepEqual(
        issueStringToRef('b/123456', 'proj'),
        {extIdentifier: 'b/123456'});
  });

  it('throws on invalid input', () => {
    assert.throws(() => issueStringToRef('foo', 'proj'));
  });
});

describe('issueStringToBlockingRef', () => {
  it('converts issue default project', () => {
    assert.deepEqual(
        issueStringToBlockingRef({projectName: 'proj', localId: 1}, '1234'),
        {projectName: 'proj', localId: 1234});
  });

  it('converts issue with project', () => {
    assert.deepEqual(
        issueStringToBlockingRef({projectName: 'proj', localId: 1}, 'foo:1234'),
        {projectName: 'foo', localId: 1234});
  });

  it('throws on invalid input', () => {
    assert.throws(() => issueStringToBlockingRef(
        {projectName: 'proj', localId: 1}, 'foo'));
  });

  it('throws when blocking an issue on itself', () => {
    assert.throws(() => issueStringToBlockingRef(
        {projectName: 'proj', localId: 123}, 'proj:123'));
    assert.throws(() => issueStringToBlockingRef(
        {projectName: 'proj', localId: 123}, '123'));
  });
});

describe('issueRefToString', () => {
  it('no ref', () => {
    assert.equal(issueRefToString(), '');
  });

  it('ref with no project name', () => {
    assert.equal(
        'other:1234',
        issueRefToString({projectName: 'other', localId: 1234}),
    );
  });

  it('ref with different project name', () => {
    assert.equal(
        'other:1234',
        issueRefToString({projectName: 'other', localId: 1234}, 'proj'),
    );
  });

  it('ref with same project name', () => {
    assert.equal(
        '1234',
        issueRefToString({projectName: 'proj', localId: 1234}, 'proj'),
    );
  });

  it('external ref', () => {
    assert.equal(
        'b/123456',
        issueRefToString({extIdentifier: 'b/123456'}, 'proj'),
    );
  });
});

describe('issueToIssueRef', () => {
  it('creates ref', () => {
    const issue = {'localId': 1, 'projectName': 'proj', 'starCount': 1};
    const expectedRef = {'localId': 1,
      'projectName': 'proj'};
    assert.deepEqual(issueToIssueRef(issue), expectedRef);
  });
});

describe('issueRefToUrl', () => {
  it('no ref', () => {
    assert.equal(issueRefToUrl(), '');
  });

  it('issue ref', () => {
    assert.equal(issueRefToUrl({
      projectName: 'test',
      localId: 11,
    }), '/p/test/issues/detail?id=11');
  });

  it('issue ref with params', () => {
    assert.equal(issueRefToUrl({
      projectName: 'test',
      localId: 11,
    }, {
      q: 'owner:me',
      id: 44,
    }), '/p/test/issues/detail?id=11&q=owner%3Ame');
  });

  it('federated issue ref', () => {
    assert.equal(issueRefToUrl({
      extIdentifier: 'b/5678',
    }), 'https://issuetracker.google.com/issues/5678');
  });

  it('does not mutate input queryParams', () => {
    const queryParams = {q: 'owner:me', id: 44};
    const EXPECTED = JSON.stringify(queryParams);
    const ref = {projectName: 'test', localId: 11};
    issueRefToUrl(ref, queryParams);
    assert.equal(EXPECTED, JSON.stringify(queryParams));
  });
});

it('issueNameToRef', () => {
  const actual = issueNameToRef('projects/project-name/issues/2');
  assert.deepEqual(actual, {projectName: 'project-name', localId: 2});
});

it('issueNameToRefString', () => {
  const actual = issueNameToRefString('projects/project-name/issues/2');
  assert.equal(actual, 'project-name:2');
});

it('issueToName', () => {
  const actual = issueToName({projectName: 'project-name', localId: 2});
  assert.equal(actual, 'projects/project-name/issues/2');
});

describe('commentListToDescriptionList', () => {
  it('empty list', () => {
    assert.deepEqual(commentListToDescriptionList(), []);
    assert.deepEqual(commentListToDescriptionList([]), []);
  });

  it('first comment is description', () => {
    assert.deepEqual(commentListToDescriptionList([
      {content: 'test'},
      {content: 'hello'},
      {content: 'world'},
    ]), [{content: 'test'}]);
  });

  it('some descriptions', () => {
    assert.deepEqual(commentListToDescriptionList([
      {content: 'test'},
      {content: 'hello', descriptionNum: 1},
      {content: 'world'},
      {content: 'this'},
      {content: 'is a'},
      {content: 'description', descriptionNum: 2},
    ]), [
      {content: 'test'},
      {content: 'hello', descriptionNum: 1},
      {content: 'description', descriptionNum: 2},
    ]);
  });
});

describe('valueToFieldValue', () => {
  it('converts field ref and value', () => {
    assert.deepEqual(valueToFieldValue(
        {fieldName: 'name', fieldId: 'id'},
        'value',
    ), {
      fieldRef: {fieldName: 'name', fieldId: 'id'},
      value: 'value',
    });
  });
});
