/**
 * @license
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import '../test/common-test-setup-karma.js';
import {getDisplayName, getUserName, getGroupDisplayName, getAccountDisplayName, _testOnly_accountEmail} from './display-name-util.js';

suite('display-name-utils tests', () => {
  // eslint-disable-next-line no-unused-vars
  const config = {
    user: {
      anonymous_coward_name: 'Anonymous Coward',
    },
  };

  test('getDisplayName name only', () => {
    const account = {
      name: 'test-name',
    };
    assert.equal(getDisplayName(config, account),
        'test-name');
  });

  test('getDisplayName prefer displayName', () => {
    const account = {
      name: 'test-name',
      display_name: 'better-name',
    };
    assert.equal(getDisplayName(config, account),
        'better-name');
  });

  test('getDisplayName prefer username default', () => {
    const account = {
      name: 'test-name',
      username: 'user-name',
    };
    const config = {
      accounts: {
        default_display_name: 'USERNAME',
      },
    };
    assert.equal(getDisplayName(config, account),
        'user-name');
  });

  test('getDisplayName prefer first name default', () => {
    const account = {
      name: 'firstname lastname',
    };
    const config = {
      accounts: {
        default_display_name: 'FIRST_NAME',
      },
    };
    assert.equal(getDisplayName(config, account),
        'firstname');
  });

  test('getDisplayName ignore leading whitespace for first name', () => {
    const account = {
      name: '   firstname lastname',
    };
    const config = {
      accounts: {
        default_display_name: 'FIRST_NAME',
      },
    };
    assert.equal(getDisplayName(config, account),
        'firstname');
  });

  test('getDisplayName full name default', () => {
    const account = {
      name: 'firstname lastname',
    };
    const config = {
      accounts: {
        default_display_name: 'FULL_NAME',
      },
    };
    assert.equal(getDisplayName(config, account),
        'firstname lastname');
  });

  test('getDisplayName name only', () => {
    const account = {
      name: 'test-name',
    };
    assert.deepEqual(getUserName(config, account),
        'test-name');
  });

  test('getUserName username only', () => {
    const account = {
      username: 'test-user',
    };
    assert.deepEqual(getUserName(config, account),
        'test-user');
  });

  test('getUserName email only', () => {
    const account = {
      email: 'test-user@test-url.com',
    };
    assert.deepEqual(getUserName(config, account),
        'test-user@test-url.com');
  });

  test('getUserName returns not Anonymous Coward as the anon name', () => {
    assert.deepEqual(getUserName(config, null),
        'Anonymous');
  });

  test('getUserName for the config returning the anon name', () => {
    const config = {
      user: {
        anonymous_coward_name: 'Test Anon',
      },
    };
    assert.deepEqual(getUserName(config, null),
        'Test Anon');
  });

  test('getAccountDisplayName - account with name only', () => {
    assert.equal(
        getAccountDisplayName(config,
            {name: 'Some user name'}),
        'Some user name');
  });

  test('getAccountDisplayName - account with email only', () => {
    assert.equal(
        getAccountDisplayName(config,
            {email: 'my@example.com'}),
        'my@example.com <my@example.com>');
  });

  test('getAccountDisplayName - account with name and status', () => {
    assert.equal(
        getAccountDisplayName(config, {
          name: 'Some name',
          status: 'OOO',
        }),
        'Some name (OOO)');
  });

  test('getAccountDisplayName - account with name and email', () => {
    assert.equal(
        getAccountDisplayName(config, {
          name: 'Some name',
          email: 'my@example.com',
        }),
        'Some name <my@example.com>');
  });

  test('getAccountDisplayName - account with name, email and status', () => {
    assert.equal(
        getAccountDisplayName(config, {
          name: 'Some name',
          email: 'my@example.com',
          status: 'OOO',
        }),
        'Some name <my@example.com> (OOO)');
  });

  test('getGroupDisplayName', () => {
    assert.equal(
        getGroupDisplayName({name: 'Some user name'}),
        'Some user name (group)');
  });

  test('_accountEmail', () => {
    assert.equal(
        _testOnly_accountEmail('email@gerritreview.com'),
        '<email@gerritreview.com>');
    assert.equal(_testOnly_accountEmail(undefined), '');
  });
});

