<!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.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">

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

<script>
  suite('gr-http-password tests (already has password)', function() {
    var element;
    var account;
    var password;

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

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

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

    test('loads data', function() {
      assert.equal(element._username, 'user name');
      assert.equal(element._password, 'the password');
      assert.isFalse(element._passwordVisible);
      assert.isTrue(element._hasPassword);
    });

    test('view password', function() {
      var button = element.$$('.value gr-button');
      assert.isFalse(element._passwordVisible);
      MockInteractions.tap(button);
      assert.isTrue(element._passwordVisible);
    });

    test('generate password', function() {
      var button = element.$.generateButton;
      var nextPassword = 'the new password';
      var generateStub = sinon.stub(element.$.restAPI,
          'generateAccountHttpPassword', function() {
            return Promise.resolve(nextPassword);
          });

      assert.isTrue(element._hasPassword);
      assert.isFalse(element._passwordVisible);
      assert.equal(element._password, 'the password');

      MockInteractions.tap(button);

      assert.isTrue(generateStub.called);
      generateStub.lastCall.returnValue.then(function() {
        assert.isTrue(element._passwordVisible);
        assert.isTrue(element._hasPassword);
        assert.equal(element._password, 'the new password');
      });
    });

    test('clear password', function() {
      var button = element.$.clearButton;
      var clearStub = sinon.stub(element.$.restAPI, 'deleteAccountHttpPassword',
          function() { return Promise.resolve(); });

      assert.isTrue(element._hasPassword);
      assert.equal(element._password, 'the password');

      MockInteractions.tap(button);

      assert.isTrue(clearStub.called);
      clearStub.lastCall.returnValue.then(function() {
        assert.isFalse(element._hasPassword);
        assert.equal(element._password, '');
      });
    });
  });

  suite('gr-http-password tests (has no password)', function() {
    var element;
    var account;

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

      stub('gr-rest-api-interface', {
        getAccount: function() { return Promise.resolve(account); },
        getAccountHttpPassword: function(errFn) {
          errFn({status: 404});
          return Promise.resolve('');
        },
      });

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

    test('loads data', function() {
      assert.equal(element._username, 'user name');
      assert.isNotOk(element._password);
      assert.isFalse(element._passwordVisible);
      assert.isFalse(element._hasPassword);
    });

    test('generate password', function() {
      var button = element.$.generateButton;
      var nextPassword = 'the new password';
      var generateStub = sinon.stub(element.$.restAPI,
          'generateAccountHttpPassword', function() {
            return Promise.resolve(nextPassword);
          });

      assert.isFalse(element._hasPassword);
      assert.isFalse(element._passwordVisible);
      assert.isNotOk(element._password);

      MockInteractions.tap(button);

      assert.isTrue(generateStub.called);
      generateStub.lastCall.returnValue.then(function() {
        assert.isTrue(element._passwordVisible);
        assert.isOk(element._hasPassword);
        assert.equal(element._password, 'the new password');
      });
    });
  });
</script>
