<!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>

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

<script type="module">
import '../../../test/common-test-setup.js';
import './gr-avatar.js';
import {pluginLoader} from '../gr-js-api-interface/gr-plugin-loader.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.
    pluginLoader.loadPlugins([]);

    Promise.all([
      element.$.restAPI.getConfig(),
      pluginLoader.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.
      pluginLoader.loadPlugins([]);

      return Promise.all([
        element.$.restAPI.getConfig(),
        pluginLoader.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.
        pluginLoader.loadPlugins([]);

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