<!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-settings-view</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"/>
<link rel="import" href="gr-http-password.html">

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

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

<script>
  suite('gr-http-password tests', () => {
    let element;
    let account;
    let config;

    setup(done => {
      account = {username: 'user name'};
      config = {auth: {}};

      stub('gr-rest-api-interface', {
        getAccount() { return Promise.resolve(account); },
        getConfig() { return Promise.resolve(config); },
      });

      element = fixture('basic');
      element.loadData().then(() => { flush(done); });
    });

    test('generate password', () => {
      const button = element.$.generateButton;
      const nextPassword = 'the new password';
      let generateResolve;
      const generateStub = sinon.stub(element.$.restAPI,
          'generateAccountHttpPassword', () => new Promise(resolve => {
            generateResolve = resolve;
          }));

      assert.isNotOk(element._generatedPassword);

      MockInteractions.tap(button);

      assert.isTrue(generateStub.called);
      assert.equal(element._generatedPassword, 'Generating...');

      generateResolve(nextPassword);

      generateStub.lastCall.returnValue.then(() => {
        assert.equal(element._generatedPassword, nextPassword);
      });
    });

    test('without http_password_url', () => {
      assert.isNull(element._passwordUrl);
    });

    test('with http_password_url', done => {
      config.auth.http_password_url = 'http://example.com/';
      element.loadData().then(() => {
        assert.isNotNull(element._passwordUrl);
        assert.equal(element._passwordUrl, config.auth.http_password_url);
        done();
      });
    });
  });

</script>
