<!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-commit-info</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="../../core/gr-router/gr-router.html">
<link rel="import" href="gr-commit-info.html">

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

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

<script>
  suite('gr-commit-info tests', () => {
    let element;
    let sandbox;

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

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

    test('weblinks use Gerrit.Nav interface', () => {
      const weblinksStub = sandbox.stub(Gerrit.Nav, '_generateWeblinks')
          .returns([{name: 'stubb', url: '#s'}]);
      element.change = {};
      element.commitInfo = {};
      element.serverConfig = {};
      assert.isTrue(weblinksStub.called);
    });

    test('no web link when unavailable', () => {
      element.commitInfo = {};
      element.serverConfig = {};
      element.change = {labels: [], project: ''};

      assert.isNotOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));
    });

    test('use web link when available', () => {
      const router = document.createElement('gr-router');
      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
          router._generateWeblinks.bind(router));

      element.change = {labels: [], project: ''};
      element.commitInfo =
          {commit: 'commitsha', web_links: [{name: 'gitweb', url: 'link-url'}]};
      element.serverConfig = {};

      assert.isOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));
      assert.equal(element._computeWebLink(element.change, element.commitInfo,
          element.serverConfig), 'link-url');
    });

    test('does not relativize web links that begin with scheme', () => {
      const router = document.createElement('gr-router');
      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
          router._generateWeblinks.bind(router));

      element.change = {labels: [], project: ''};
      element.commitInfo = {
        commit: 'commitsha',
        web_links: [{name: 'gitweb', url: 'https://link-url'}],
      };
      element.serverConfig = {};

      assert.isOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));
      assert.equal(element._computeWebLink(element.change, element.commitInfo,
          element.serverConfig), 'https://link-url');
    });

    test('use gitweb when available', () => {
      const router = document.createElement('gr-router');
      element.serverConfig = {gitweb: {
        url: 'url-base/',
        type: {revision: 'xx ${project} xx ${commit} xx'},
      }};
      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
          router._generateWeblinks.bind(router));

      element.commitInfo = {commit: 'commit-sha'};
      element.change = {
        project: 'project-name',
        labels: [],
        current_revision: element.commitInfo.commit,
      };

      assert.isOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));

      assert.equal(element._computeWebLink(element.change, element.commitInfo,
          element.serverConfig), 'url-base/xx project-name xx commit-sha xx');
    });

    test('prefer gitweb when both are available', () => {
      const router = document.createElement('gr-router');
      element.serverConfig = {gitweb: {
        url: 'url-base/',
        type: {revision: 'xx ${project} xx ${commit} xx'},
      }};
      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
          router._generateWeblinks.bind(router));

      element.commitInfo = {
        commit: 'commit-sha',
        web_links: [{url: 'link-url'}],
      };
      element.change = {
        project: 'project-name',
        labels: [],
        current_revision: element.commitInfo.commit,
      };

      assert.isOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));

      const link = element._computeWebLink(element.change, element.commitInfo,
          element.serverConfig);

      assert.equal(link, 'url-base/xx project-name xx commit-sha xx');
      assert.notEqual(link, '../../link-url');
    });

    test('ignore web links that are neither gitweb nor gitiles', () => {
      const router = document.createElement('gr-router');
      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
          router._generateWeblinks.bind(router));

      element.change = {project: 'project-name'};
      element.commitInfo = {
        commit: 'commit-sha',
        web_links: [
          {
            name: 'ignore',
            url: 'ignore',
          },
          {
            name: 'gitiles',
            url: 'https://link-url',
          },
        ],
      };

      assert.isOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));
      assert.equal(element._computeWebLink(element.change, element.commitInfo,
          element.serverConfig), 'https://link-url');

      // Remove gitiles link.
      element.commitInfo.web_links.splice(1, 1);
      assert.isNotOk(element._computeShowWebLink(element.change,
          element.commitInfo, element.serverConfig));
      assert.isNotOk(element._computeWebLink(element.change, element.commitInfo,
          element.serverConfig));
    });
  });
</script>
