<!DOCTYPE html>
<!--
@license
Copyright (C) 2015 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-avatar</title>

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>
<script type="module" src="../../../test/test-pre-setup.js"></script>
<script type="module" src="../../../test/common-test-setup.js"></script>
<script type="module" src="./gr-avatar.js"></script>

<script type="module">
import '../../../test/test-pre-setup.js';
import '../../../test/common-test-setup.js';
import './gr-avatar.js';
void(0);
</script>

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

<script type="module">
import '../../../test/test-pre-setup.js';
import '../../../test/common-test-setup.js';
import './gr-avatar.js';
suite('gr-avatar tests', () => {
  let element;
  let sandbox;

  setup(() => {
    sandbox = sinon.sandbox.create();
    element = fixture('basic');
  });

  teardown(() => {
    sandbox.restore();
  });

  test('methods', () => {
    assert.equal(
        element._buildAvatarURL({
          _account_id: 123,
        }),
        '/accounts/123/avatar?s=16');
    assert.equal(
        element._buildAvatarURL({
          email: 'test@example.com',
        }),
        '/accounts/test%40example.com/avatar?s=16');
    assert.equal(
        element._buildAvatarURL({
          name: 'John Doe',
        }),
        '/accounts/John%20Doe/avatar?s=16');
    assert.equal(
        element._buildAvatarURL({
          username: 'John_Doe',
        }),
        '/accounts/John_Doe/avatar?s=16');
    assert.equal(
        element._buildAvatarURL({
          _account_id: 123,
          avatars: [
            {
              url: 'https://cdn.example.com/s12-p/photo.jpg',
              height: 12,
            },
            {
              url: 'https://cdn.example.com/s16-p/photo.jpg',
              height: 16,
            },
            {
              url: 'https://cdn.example.com/s100-p/photo.jpg',
              height: 100,
            },
          ],
        }),
        'https://cdn.example.com/s16-p/photo.jpg');
    assert.equal(
        element._buildAvatarURL({
          _account_id: 123,
          avatars: [
            {
              url: 'https://cdn.example.com/s95-p/photo.jpg',
              height: 95,
            },
          ],
        }),
        '/accounts/123/avatar?s=16');
    assert.equal(element._buildAvatarURL(undefined), '');
  });

  test('dom for existing account', () => {
    assert.isFalse(element.hasAttribute('hidden'));

    sandbox.stub(
        element,
        '_getConfig',
        () => Promise.resolve({plugin: {has_avatars: true}}));

    element.imageSize = 64;
    element.account = {
      _account_id: 123,
    };

    assert.strictEqual(element.style.backgroundImage, '');

    // Emulate plugins loaded.
    Gerrit._loadPlugins([]);

    Promise.all([
      element.$.restAPI.getConfig(),
      Gerrit.awaitPluginsLoaded(),
    ]).then(() => {
      assert.isFalse(element.hasAttribute('hidden'));

      assert.isTrue(
          element.style.backgroundImage.includes('/accounts/123/avatar?s=64'));
    });
  });

  suite('plugin has avatars', () => {
    let element;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();

      stub('gr-avatar', {
        _getConfig: () => Promise.resolve({plugin: {has_avatars: true}}),
      });

      element = fixture('basic');
    });

    teardown(() => {
      sandbox.restore();
    });

    test('dom for non available account', () => {
      assert.isFalse(element.hasAttribute('hidden'));

      // Emulate plugins loaded.
      Gerrit._loadPlugins([]);

      return Promise.all([
        element.$.restAPI.getConfig(),
        Gerrit.awaitPluginsLoaded(),
      ]).then(() => {
        assert.isTrue(element.hasAttribute('hidden'));

        assert.strictEqual(element.style.backgroundImage, '');
      });
    });
  });

  suite('config not set', () => {
    let element;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();

      stub('gr-avatar', {
        _getConfig: () => Promise.resolve({}),
      });

      element = fixture('basic');
    });

    teardown(() => {
      sandbox.restore();
    });

    test('avatar hidden when account set', () => {
      flush(() => {
        assert.isFalse(element.hasAttribute('hidden'));

        element.imageSize = 64;
        element.account = {
          _account_id: 123,
        };
        // Emulate plugins loaded.
        Gerrit._loadPlugins([]);

        return Promise.all([
          element.$.restAPI.getConfig(),
          Gerrit.awaitPluginsLoaded(),
        ]).then(() => {
          assert.isTrue(element.hasAttribute('hidden'));
        });
      });
    });
  });
});
</script>
