<!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('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>
