<!DOCTYPE html>
<!--
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-download-dialog</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="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
<link rel="import" href="gr-download-dialog.html">

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

<test-fixture id="loggedIn">
  <template>
    <gr-download-dialog logged-in></gr-download-dialog>
  </template>
</test-fixture>

<script>
  function getChangeObject() {
    return {
      current_revision: '34685798fe548b6d17d1e8e5edc43a26d055cc72',
      revisions: {
        '34685798fe548b6d17d1e8e5edc43a26d055cc72': {
          _number: 1,
          fetch: {
            repo: {
              commands: {
                repo: 'repo download test-project 5/1'
              }
            },
            ssh: {
              commands: {
                'Checkout':
                  'git fetch ' +
                  'ssh://andybons@localhost:29418/test-project ' +
                  'refs/changes/05/5/1 && git checkout FETCH_HEAD',
                'Cherry Pick':
                  'git fetch ' +
                  'ssh://andybons@localhost:29418/test-project ' +
                  'refs/changes/05/5/1 && git cherry-pick FETCH_HEAD',
                'Format Patch':
                  'git fetch ' +
                  'ssh://andybons@localhost:29418/test-project ' +
                  'refs/changes/05/5/1 ' +
                  '&& git format-patch -1 --stdout FETCH_HEAD',
                'Pull':
                  'git pull ' +
                  'ssh://andybons@localhost:29418/test-project ' +
                  'refs/changes/05/5/1'
              }
            },
            http: {
              commands: {
                'Checkout':
                  'git fetch ' +
                  'http://andybons@localhost:8080/a/test-project ' +
                  'refs/changes/05/5/1 && git checkout FETCH_HEAD',
                'Cherry Pick':
                  'git fetch ' +
                  'http://andybons@localhost:8080/a/test-project ' +
                  'refs/changes/05/5/1 && git cherry-pick FETCH_HEAD',
                'Format Patch':
                  'git fetch ' +
                  'http://andybons@localhost:8080/a/test-project ' +
                  'refs/changes/05/5/1 && ' +
                  'git format-patch -1 --stdout FETCH_HEAD',
                'Pull':
                  'git pull ' +
                  'http://andybons@localhost:8080/a/test-project ' +
                  'refs/changes/05/5/1'
              }
            }
          }
        }
      }
    };
  }

  suite('gr-download-dialog tests', function() {
    var element;

    setup(function() {
      element = fixture('basic');
      element.change = getChangeObject();
      element.patchNum = 1;
      element.config = {
        schemes: {
          'anonymous http': {},
          http: {},
          repo: {},
          ssh: {},
        },
        archives: ['tgz', 'tar', 'tbz2', 'txz'],
      };
    });

    test('focuses on first download link', function() {
      var focusStub = sinon.stub(element.$.download, 'focus');
      element.focus();
      flushAsynchronousOperations();
      assert.isTrue(focusStub.called);
      focusStub.restore();
    });

    test('element visibility', function() {
      assert.isFalse(element.$$('ul').hasAttribute('hidden'));
      assert.isFalse(element.$$('main').hasAttribute('hidden'));
      assert.isFalse(element.$$('.archivesContainer').hasAttribute('hidden'));

      element.set('config.archives', []);
      assert.isTrue(element.$$('.archivesContainer').hasAttribute('hidden'));
    });

    test('computed fields', function() {
      assert.equal(element._computeArchiveDownloadLink(
          {_number: 123}, 2, 'tgz'),
          '/changes/123/revisions/2/archive?format=tgz');
    });

    test('close event', function(done) {
      element.addEventListener('close', function() {
        done();
      });
      MockInteractions.tap(element.$$('.closeButtonContainer gr-button'));
    });

    test('tab selection', function() {
      flushAsynchronousOperations();
      var el = element.$$('[data-scheme="http"]').parentElement;
      assert.isTrue(el.hasAttribute('selected'));
      ['repo', 'ssh'].forEach(function(scheme) {
        var el = element.$$('[data-scheme="' + scheme + '"]').parentElement;
        assert.isFalse(el.hasAttribute('selected'));
      });

      MockInteractions.tap(element.$$('[data-scheme="ssh"]'));
      el = element.$$('[data-scheme="ssh"]').parentElement;
      assert.isTrue(el.hasAttribute('selected'));
      ['http', 'repo'].forEach(function(scheme) {
        var el = element.$$('[data-scheme="' + scheme + '"]').parentElement;
        assert.isFalse(el.hasAttribute('selected'));
      });
    });
  });

  suite('gr-download-dialog tests', function() {
    var element;

    setup(function() {
      stub('gr-rest-api-interface', {
        getPreferences: function() {
          return Promise.resolve({download_scheme: 'repo'});
        },
      });

      element = fixture('loggedIn');
      element.change = getChangeObject();
      element.patchNum = 1;
      element.config = {
        schemes: {
          'anonymous http': {},
          http: {},
          repo: {},
          ssh: {},
        },
        archives: ['tgz', 'tar', 'tbz2', 'txz'],
      };
    });

    test('loads scheme from preferences', function(done) {
      element.$.restAPI.getPreferences.lastCall.returnValue.then(function() {
        assert.equal(element._selectedScheme, 'repo');
        done();
      });
    });

    test('saves scheme to preferences', function() {
      var savePrefsStub = sinon.stub(element.$.restAPI, 'savePreferences',
          function() { return Promise.resolve(); });

      Polymer.dom.flush();

      var firstSchemeButton = element.$$('li gr-button[data-scheme]');

      MockInteractions.tap(firstSchemeButton);

      assert.isTrue(savePrefsStub.called);
      assert.equal(savePrefsStub.lastCall.args[0].download_scheme,
          firstSchemeButton.getAttribute('data-scheme'));
    });
  });
</script>
