<!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-settings-view</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="../../../bower_components/iron-test-helpers/iron-test-helpers.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', function() {
    var element;
    var account;
    var password;
    var config;

    setup(function(done) {
      account = {username: 'user name'};
      config = {auth: {}};
      password = 'the password';

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

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

    test('generate password', function() {
      var button = element.$.generateButton;
      var nextPassword = 'the new password';
      var generateResolve;
      var generateStub = sinon.stub(element.$.restAPI,
          'generateAccountHttpPassword', function() {
            return new Promise(function(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(function() {
        assert.equal(element._generatedPassword, nextPassword);
      });
    });

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

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

</script>
