<!DOCTYPE html>
<!--
Copyright (C) 2016 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.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-account-label</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<script src="../../../scripts/util.js"></script>

<link rel="import" href="gr-account-label.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <gr-account-label></gr-account-label>
  </template>
</test-fixture>

<script>
  suite('gr-account-label tests', () => {
    let element;

    setup(() => {
      stub('gr-rest-api-interface', {
        getConfig() { return Promise.resolve({}); },
        getLoggedIn() { return Promise.resolve(false); },
      });
      element = fixture('basic');
    });

    test('null guard', () => {
      assert.doesNotThrow(() => {
        element.account = null;
      });
    });

    test('missing email', () => {
      assert.equal('', element._computeEmailStr({name: 'foo'}));
    });

    test('computed fields', () => {
      assert.equal(element._computeAccountTitle(
          {
            name: 'Andrew Bonventre',
            email: 'andybons+gerrit@gmail.com',
          }),
          'Andrew Bonventre <andybons+gerrit@gmail.com>');

      assert.equal(element._computeAccountTitle(
          {name: 'Andrew Bonventre'}),
          'Andrew Bonventre');

      assert.equal(element._computeShowEmail(true,
          {
            name: 'Andrew Bonventre',
            email: 'andybons+gerrit@gmail.com',
          }), true);

      assert.equal(element._computeShowEmail(true,
          {name: 'Andrew Bonventre'}), false);

      assert.equal(element._computeShowEmail(false,
          {name: 'Andrew Bonventre'}), false);

      assert.equal(element._computeShowEmail(
          true, undefined), false);

      assert.equal(element._computeShowEmail(
          false, undefined), false);

      assert.equal(
          element._computeEmailStr({name: 'test', email: 'test'}), '(test)');
      assert.equal(element._computeEmailStr({email: 'test'}, ''), 'test');
    });
  });
</script>
