<!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="../../../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"/>
<link rel="import" href="gr-main-header.html">

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

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

<script>
  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('fix my menu item', () => {
      assert.deepEqual([
        {url: 'https://awesometown.com/#hashyhash'},
        {url: 'url', target: '_blank'},
      ].map(element._fixMyMenuItem), [
        {url: 'https://awesometown.com/#hashyhash', external: true},
        {url: 'url', external: true},
      ]);
    });

    test('filter unsupported urls', () => {
      assert.deepEqual([
        {url: '/c/331788/'},
        {url: '/groups/self'},
        {url: 'https://awesometown.com/#hashyhash'},
      ].filter(element._isSupportedLink), [
        {url: '/c/331788/'},
        {url: 'https://awesometown.com/#hashyhash'},
      ]);
    });


    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, [], adminLinks),
          defaultLinks.concat({
            title: 'Browse',
            links: adminLinks,
          }));
      assert.deepEqual(
          element._computeLinks(defaultLinks, userLinks, adminLinks),
          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',
      }]);
    });
  });
</script>
