<!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-app</title>

<script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../test/common-test-setup.html"/>

<script>
  const link = document.createElement('link');
  link.setAttribute('rel', 'import');
  link.setAttribute('href', 'gr-app.html');
  document.head.appendChild(link);
</script>

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

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

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

    setup(done => {
      sandbox = sinon.sandbox.create();
      stub('gr-reporting', {
        appStarted: sandbox.stub(),
      });
      stub('gr-account-dropdown', {
        _getTopContent: sinon.stub(),
      });
      stub('gr-router', {
        start: sandbox.stub(),
      });
      stub('gr-rest-api-interface', {
        getAccount() { return Promise.resolve({}); },
        getAccountCapabilities() { return Promise.resolve({}); },
        getConfig() {
          return Promise.resolve({
            plugin: {},
            auth: {
              auth_type: undefined,
            },
          });
        },
        getPreferences() { return Promise.resolve({my: []}); },
        getDiffPreferences() { return Promise.resolve({}); },
        getEditPreferences() { return Promise.resolve({}); },
        getVersion() { return Promise.resolve(42); },
        probePath() { return Promise.resolve(42); },
      });

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

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

    appElement = () => element.$['app-element'];

    test('reporting', () => {
      assert.isTrue(appElement().$.reporting.appStarted.calledOnce);
    });

    test('reporting called before router start', () => {
      const element = appElement();
      const appStartedStub = element.$.reporting.appStarted;
      const routerStartStub = element.$.router.start;
      sinon.assert.callOrder(appStartedStub, routerStartStub);
    });

    test('passes config to gr-plugin-host', () => {
      const config = appElement().$.restAPI.getConfig;
      return config.lastCall.returnValue.then(config => {
        assert.deepEqual(appElement().$.plugins.config, config);
      });
    });

    test('_paramsChanged sets search page', () => {
      appElement()._paramsChanged({base: {view: Gerrit.Nav.View.CHANGE}});
      assert.notOk(appElement()._lastSearchPage);
      appElement()._paramsChanged({base: {view: Gerrit.Nav.View.SEARCH}});
      assert.ok(appElement()._lastSearchPage);
    });
  });
</script>
