<!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-email-editor</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-email-editor.html">

<test-fixture id="basic">
  <template>
    <gr-email-editor></gr-email-editor>
  </template>
</test-fixture>

<script>
  suite('gr-email-editor tests', function() {
    var element;

    setup(function(done) {
      var emails = [
        {email: 'email@one.com'},
        {email: 'email@two.com', preferred: true},
        {email: 'email@three.com'},
      ];

      stub('gr-rest-api-interface', {
        getAccountEmails: function() { return Promise.resolve(emails); },
      });

      element = fixture('basic');

      element.loadData().then(done);
    });

    test('renders', function() {
      var rows = element.$$('table').querySelectorAll('tbody tr');

      assert.equal(rows.length, 3);

      assert.isFalse(rows[0].querySelector('input[type=radio]').checked);
      assert.isNotOk(rows[0].querySelector('gr-button').disabled);

      assert.isTrue(rows[1].querySelector('input[type=radio]').checked);
      assert.isOk(rows[1].querySelector('gr-button').disabled);

      assert.isFalse(rows[2].querySelector('input[type=radio]').checked);
      assert.isNotOk(rows[2].querySelector('gr-button').disabled);

      assert.isFalse(element.hasUnsavedChanges);
    });

    test('edit preferred', function() {
      var preferredChangedSpy = sinon.spy(element, '_handlePreferredChange');
      var radios = element.$$('table').querySelectorAll('input[type=radio]');

      assert.isFalse(element.hasUnsavedChanges);
      assert.isNotOk(element._newPreferred);
      assert.equal(element._emailsToRemove.length, 0);
      assert.equal(element._emails.length, 3);
      assert.isNotOk(radios[0].checked);
      assert.isOk(radios[1].checked);
      assert.isFalse(preferredChangedSpy.called);

      radios[0].click();

      assert.isTrue(element.hasUnsavedChanges);
      assert.isOk(element._newPreferred);
      assert.equal(element._emailsToRemove.length, 0);
      assert.equal(element._emails.length, 3);
      assert.isOk(radios[0].checked);
      assert.isNotOk(radios[1].checked);
      assert.isTrue(preferredChangedSpy.called);
    });

    test('delete email', function() {
      var buttons = element.$$('table').querySelectorAll('gr-button');

      assert.isFalse(element.hasUnsavedChanges);
      assert.isNotOk(element._newPreferred);
      assert.equal(element._emailsToRemove.length, 0);
      assert.equal(element._emails.length, 3);

      buttons[2].click();

      assert.isTrue(element.hasUnsavedChanges);
      assert.isNotOk(element._newPreferred);
      assert.equal(element._emailsToRemove.length, 1);
      assert.equal(element._emails.length, 2);

      assert.equal(element._emailsToRemove[0].email, 'email@three.com');
    });

    test('save changes', function(done) {
      var deleteEmailStub = sinon.stub(element.$.restAPI, 'deleteAccountEmail');
      var setPreferredStub = sinon.stub(element.$.restAPI,
          'setPreferredAccountEmail');
      var rows = element.$$('table').querySelectorAll('tbody tr');

      assert.isFalse(element.hasUnsavedChanges);
      assert.isNotOk(element._newPreferred);
      assert.equal(element._emailsToRemove.length, 0);
      assert.equal(element._emails.length, 3);

      // Delete the first email and set the last as preferred.
      rows[0].querySelector('gr-button').click();
      rows[2].querySelector('input[type=radio]').click();

      assert.isTrue(element.hasUnsavedChanges);
      assert.equal(element._newPreferred, 'email@three.com');
      assert.equal(element._emailsToRemove.length, 1);
      assert.equal(element._emailsToRemove[0].email, 'email@one.com');
      assert.equal(element._emails.length, 2);

      // Save the changes.
      element.save().then(function() {
        assert.equal(deleteEmailStub.callCount, 1);
        assert.equal(deleteEmailStub.getCall(0).args[0], 'email@one.com');

        assert.isTrue(setPreferredStub.called);
        assert.equal(setPreferredStub.getCall(0).args[0], 'email@three.com');

        done();
      });
    });
  });
</script>
