<!DOCTYPE html>
<!--
@license
Copyright (C) 2017 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-it_test</title>
<script src="/test/common-test-setup.js"></script>
<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"/>
<link rel="import" href="gr-app.html">

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

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

<script>
  suite('gr-app custom light theme 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-rest-api-interface', {
        getAccount() { return Promise.resolve(null); },
        getAccountCapabilities() { return Promise.resolve({}); },
        getConfig() {
          return Promise.resolve({
            plugin: {
              js_resource_paths: [],
              html_resource_paths: [
                new URL('test/plugin.html', window.location.href).toString(),
              ],
            },
          });
        },
        getVersion() { return Promise.resolve(42); },
        getLoggedIn() { return Promise.resolve(false); },
      });

      window.localStorage.removeItem('dark-theme');

      element = fixture('element');

      const importSpy = sandbox.spy(
          element.$['app-element'].$.externalStyleForAll,
          '_import');
      const importForThemeSpy = sandbox.spy(
          element.$['app-element'].$.externalStyleForTheme,
          '_import');
      Gerrit.awaitPluginsLoaded().then(() => {
        Promise.all(importSpy.returnValues.concat(importForThemeSpy.returnValues))
            .then(() => {
              flush(done);
            });
      });
    });

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

    test('applies the right theme', () => {
      assert.equal(
          util.getComputedStyleValue('--primary-text-color', element),
          '#F00BAA');
      assert.equal(
          util.getComputedStyleValue('--header-background-color', element),
          '#F01BAA');
      assert.equal(
          util.getComputedStyleValue('--footer-background-color', element),
          '#F02BAA');
    });
  });
</script>
