/**
 * @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.
 */

import '../../../test/common-test-setup-karma.js';
import './gr-avatar.js';
import {pluginLoader} from '../gr-js-api-interface/gr-plugin-loader.js';

const basicFixture = fixtureFromElement('gr-avatar');

suite('gr-avatar tests', () => {
  let element;

  setup(() => {
    element = basicFixture.instantiate();
  });

  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), '');
  });

  suite('config set', () => {
    setup(() => {
      stub('gr-avatar', {
        _getConfig: () => Promise.resolve({plugin: {has_avatars: true}}),
      });
      element = basicFixture.instantiate();
    });

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

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

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

      // Emulate plugins loaded.
      pluginLoader.loadPlugins([]);

      return 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;

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

      element = basicFixture.instantiate();
    });

    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;

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

      element = basicFixture.instantiate();
    });

    test('avatar hidden when account set', async () => {
      await flush();
      assert.isTrue(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'));
      });
    });
  });
});

