<!DOCTYPE html>
<!--
@license
Copyright (C) 2017 The Android Open Source Settings

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-settings-api</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="../../../test/common-test-setup.html"/>
<link rel="import" href="../gr-endpoint-decorator/gr-endpoint-decorator.html">
<link rel="import" href="gr-settings-api.html">

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

<test-fixture id="basic">
  <template>
    <gr-endpoint-decorator name="settings-menu-item">
    </gr-endpoint-decorator>
    <gr-endpoint-decorator name="settings-screen">
    </gr-endpoint-decorator>
  </template>
</test-fixture>

<script>
  suite('gr-settings-api tests', () => {
    let sandbox;
    let settingsApi;

    setup(() => {
      sandbox = sinon.sandbox.create();
      let plugin;
      Gerrit.install(p => { plugin = p; }, '0.1',
          'http://test.com/plugins/testplugin/static/test.js');
      sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
      settingsApi = plugin.settings();
    });

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

    test('exists', () => {
      assert.isOk(settingsApi);
    });

    test('works', done => {
      settingsApi
          .title('foo')
          .token('bar')
          .module('some-settings-screen')
          .build();
      const element = fixture('basic');
      flush(() => {
        const [menuItemEl, itemEl] = element;
        const menuItem = menuItemEl.$$('gr-settings-menu-item');
        assert.isOk(menuItem);
        assert.equal(menuItem.title, 'foo');
        assert.equal(menuItem.href, '#x/testplugin/bar');
        const item = itemEl.$$('gr-settings-item');
        assert.isOk(item);
        assert.equal(item.title, 'foo');
        assert.equal(item.anchor, 'x/testplugin/bar');
        done();
      });
    });
  });
</script>
