<!DOCTYPE html>
<!--
@license
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-main-header</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-main-header></gr-main-header>
  </template>
</test-fixture>

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

  setup(() => {
    sandbox = sinon.sandbox.create();
    stub('gr-rest-api-interface', {
      getConfig() { return Promise.resolve({}); },
      probePath(path) { return Promise.resolve(false); },
    });
    stub('gr-main-header', {
      _loadAccount() {},
    });
    element = fixture('basic');
  });

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

  test('link visibility', () => {
    element.loading = true;
    assert.equal(getComputedStyle(element.shadowRoot
        .querySelector('.accountContainer')).display,
    'none');
    element.loading = false;
    element.loggedIn = false;
    assert.notEqual(getComputedStyle(element.shadowRoot
        .querySelector('.accountContainer')).display,
    'none');
    assert.notEqual(getComputedStyle(element.shadowRoot
        .querySelector('.loginButton')).display,
    'none');
    assert.notEqual(getComputedStyle(element.shadowRoot
        .querySelector('.registerButton')).display,
    'none');
    assert.equal(getComputedStyle(element.shadowRoot
        .querySelector('gr-account-dropdown')).display,
    'none');
    assert.equal(getComputedStyle(element.shadowRoot
        .querySelector('.settingsButton')).display,
    'none');
    element.loggedIn = true;
    assert.equal(getComputedStyle(element.shadowRoot
        .querySelector('.loginButton')).display,
    'none');
    assert.equal(getComputedStyle(element.shadowRoot
        .querySelector('.registerButton')).display,
    'none');
    assert.notEqual(getComputedStyle(element.shadowRoot
        .querySelector('gr-account-dropdown'))
        .display,
    'none');
    assert.notEqual(getComputedStyle(element.shadowRoot
        .querySelector('.settingsButton')).display,
    'none');
  });

  test('fix my menu item', () => {
    assert.deepEqual([
      {url: 'https://awesometown.com/#hashyhash'},
      {url: 'url', target: '_blank'},
    ].map(element._fixCustomMenuItem), [
      {url: 'https://awesometown.com/#hashyhash'},
      {url: 'url'},
    ]);
  });

  test('user links', () => {
    const defaultLinks = [{
      title: 'Faves',
      links: [{
        name: 'Pinterest',
        url: 'https://pinterest.com',
      }],
    }];
    const userLinks = [{
      name: 'Facebook',
      url: 'https://facebook.com',
    }];
    const adminLinks = [{
      name: 'Repos',
      url: '/repos',
    }];

    // When no admin links are passed, it should use the default.
    assert.deepEqual(element._computeLinks(
        defaultLinks,
        /* userLinks= */[],
        adminLinks,
        /* topMenus= */[],
        /* docBaseUrl= */ ''
    ),
    defaultLinks.concat({
      title: 'Browse',
      links: adminLinks,
    }));
    assert.deepEqual(element._computeLinks(
        defaultLinks,
        userLinks,
        adminLinks,
        /* topMenus= */[],
        /* docBaseUrl= */ ''
    ),
    defaultLinks.concat([
      {
        title: 'Your',
        links: userLinks,
      },
      {
        title: 'Browse',
        links: adminLinks,
      }])
    );
  });

  test('documentation links', () => {
    const docLinks = [
      {
        name: 'Table of Contents',
        url: '/index.html',
      },
    ];

    assert.deepEqual(element._getDocLinks(null, docLinks), []);
    assert.deepEqual(element._getDocLinks('', docLinks), []);
    assert.deepEqual(element._getDocLinks('base', null), []);
    assert.deepEqual(element._getDocLinks('base', []), []);

    assert.deepEqual(element._getDocLinks('base', docLinks), [{
      name: 'Table of Contents',
      target: '_blank',
      url: 'base/index.html',
    }]);

    assert.deepEqual(element._getDocLinks('base/', docLinks), [{
      name: 'Table of Contents',
      target: '_blank',
      url: 'base/index.html',
    }]);
  });

  test('top menus', () => {
    const adminLinks = [{
      name: 'Repos',
      url: '/repos',
    }];
    const topMenus = [{
      name: 'Plugins',
      items: [{
        name: 'Manage',
        target: '_blank',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }],
    }];
    assert.deepEqual(element._computeLinks(
        /* defaultLinks= */ [],
        /* userLinks= */ [],
        adminLinks,
        topMenus,
        /* baseDocUrl= */ ''
    ), [{
      title: 'Browse',
      links: adminLinks,
    },
    {
      title: 'Plugins',
      links: [{
        name: 'Manage',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }],
    }]);
  });

  test('ignore top project menus', () => {
    const adminLinks = [{
      name: 'Repos',
      url: '/repos',
    }];
    const topMenus = [{
      name: 'Projects',
      items: [{
        name: 'Project Settings',
        target: '_blank',
        url: '/plugins/myplugin/${projectName}',
      }, {
        name: 'Project List',
        target: '_blank',
        url: '/plugins/myplugin/index.html',
      }],
    }];
    assert.deepEqual(element._computeLinks(
        /* defaultLinks= */ [],
        /* userLinks= */ [],
        adminLinks,
        topMenus,
        /* baseDocUrl= */ ''
    ), [{
      title: 'Browse',
      links: adminLinks,
    },
    {
      title: 'Projects',
      links: [{
        name: 'Project List',
        url: '/plugins/myplugin/index.html',
      }],
    }]);
  });

  test('merge top menus', () => {
    const adminLinks = [{
      name: 'Repos',
      url: '/repos',
    }];
    const topMenus = [{
      name: 'Plugins',
      items: [{
        name: 'Manage',
        target: '_blank',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }],
    }, {
      name: 'Plugins',
      items: [{
        name: 'Create',
        target: '_blank',
        url: 'https://gerrit/plugins/plugin-manager/static/create.html',
      }],
    }];
    assert.deepEqual(element._computeLinks(
        /* defaultLinks= */ [],
        /* userLinks= */ [],
        adminLinks,
        topMenus,
        /* baseDocUrl= */ ''
    ), [{
      title: 'Browse',
      links: adminLinks,
    }, {
      title: 'Plugins',
      links: [{
        name: 'Manage',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }, {
        name: 'Create',
        url: 'https://gerrit/plugins/plugin-manager/static/create.html',
      }],
    }]);
  });

  test('merge top menus in default links', () => {
    const defaultLinks = [{
      title: 'Faves',
      links: [{
        name: 'Pinterest',
        url: 'https://pinterest.com',
      }],
    }];
    const topMenus = [{
      name: 'Faves',
      items: [{
        name: 'Manage',
        target: '_blank',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }],
    }];
    assert.deepEqual(element._computeLinks(
        defaultLinks,
        /* userLinks= */ [],
        /* adminLinks= */ [],
        topMenus,
        /* baseDocUrl= */ ''
    ), [{
      title: 'Faves',
      links: defaultLinks[0].links.concat([{
        name: 'Manage',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }]),
    }, {
      title: 'Browse',
      links: [],
    }]);
  });

  test('merge top menus in user links', () => {
    const userLinks = [{
      name: 'Facebook',
      url: 'https://facebook.com',
    }];
    const topMenus = [{
      name: 'Your',
      items: [{
        name: 'Manage',
        target: '_blank',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }],
    }];
    assert.deepEqual(element._computeLinks(
        /* defaultLinks= */ [],
        userLinks,
        /* adminLinks= */ [],
        topMenus,
        /* baseDocUrl= */ ''
    ), [{
      title: 'Your',
      links: userLinks.concat([{
        name: 'Manage',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }]),
    }, {
      title: 'Browse',
      links: [],
    }]);
  });

  test('merge top menus in admin links', () => {
    const adminLinks = [{
      name: 'Repos',
      url: '/repos',
    }];
    const topMenus = [{
      name: 'Browse',
      items: [{
        name: 'Manage',
        target: '_blank',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }],
    }];
    assert.deepEqual(element._computeLinks(
        /* defaultLinks= */ [],
        /* userLinks= */ [],
        adminLinks,
        topMenus,
        /* baseDocUrl= */ ''
    ), [{
      title: 'Browse',
      links: adminLinks.concat([{
        name: 'Manage',
        url: 'https://gerrit/plugins/plugin-manager/static/index.html',
      }]),
    }]);
  });

  test('register URL', () => {
    const config = {
      auth: {
        auth_type: 'LDAP',
        register_url: 'https//gerrit.example.com/register',
      },
    };
    element._retrieveRegisterURL(config);
    assert.equal(element._registerURL, config.auth.register_url);
    assert.equal(element._registerText, 'Sign up');

    config.auth.register_text = 'Create account';
    element._retrieveRegisterURL(config);
    assert.equal(element._registerURL, config.auth.register_url);
    assert.equal(element._registerText, config.auth.register_text);
  });

  test('register URL ignored for wrong auth type', () => {
    const config = {
      auth: {
        auth_type: 'OPENID',
        register_url: 'https//gerrit.example.com/register',
      },
    };
    element._retrieveRegisterURL(config);
    assert.equal(element._registerURL, null);
    assert.equal(element._registerText, 'Sign up');
  });
});
</script>
