<!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-app</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="gr-app.html">

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

<test-fixture id="basic">
  <template>
    <gr-app id="app" canonical-path="/abc/def/ghi"></gr-app>
  </template>
</test-fixture>

<script>
  suite('gr-app tests', function() {
    var sandbox;
    var element;

    setup(function(done) {
      sandbox = sinon.sandbox.create();
      stub('gr-reporting', {
        appStarted: sandbox.stub(),
      });
      stub('gr-account-dropdown', {
        _getTopContent: sinon.stub(),
      });
      stub('gr-rest-api-interface', {
        getAccount: function() { return Promise.resolve({}); },
        getAccountCapabilities: function() { return Promise.resolve({}); },
        getConfig: function() {
          return Promise.resolve({
            gerrit: {web_uis: ['GWT', 'POLYGERRIT']},
            plugin: {js_resource_paths: []},
          });
        },
        getVersion: function() { return Promise.resolve(42); },
      });

      element = fixture('basic');
      flush(done);
    });

    teardown(function() {
      sandbox.restore();
    });

    test('reporting', function() {
      assert.isTrue(element.$.reporting.appStarted.calledOnce);
    });

    test('location change updates gwt footer', function(done) {
      element._path = '/test/path';
      flush(function() {
        var gwtLink = element.$$('#gwtLink');
        assert.equal(gwtLink.href,
            'http://' + location.host + '/?polygerrit=0#/test/path');
        done();
      });
    });

    test('_handleLocationChange handles hashes', function(done) {
      var curLocation = {
        pathname: '/c/1/1/testfile.txt',
        hash: '#2',
        host: location.host,
      };
      sandbox.stub(element, '_handleSearchPageChange');
      element._handleLocationChange({detail: curLocation});

      flush(function() {
        var gwtLink = element.$$('#gwtLink');
        assert.equal(gwtLink.href,
            'http://' + location.host + '/?polygerrit=0#/c/1/1/testfile.txt@2');
        done();
      });
    });

    test('passes config to gr-plugin-host', function(done) {
      element.$.restAPI.getConfig.lastCall.returnValue.then(function(config) {
        var pluginConfig = config.plugin;
        assert.deepEqual(element.$.plugins.config, pluginConfig);
        done();
      });
    });

    test('canonical-path', function() {
      assert.equal(Gerrit.CANONICAL_PATH, '/abc/def/ghi');
    });
  });
</script>
