<!DOCTYPE html>
<!--
Copyright (C) 2015 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-change-metadata</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-change-metadata.html">

<test-fixture id="basic">
  <template>
    <gr-change-metadata></gr-change-metadata>
  </template>
</test-fixture>

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

    setup(function() {
      stub('gr-rest-api-interface', {
        getConfig: function() { return Promise.resolve({}); },
        getLoggedIn: function() { return Promise.resolve(false); },
      });

      element = fixture('basic');
    });

    test('computed fields', function() {
      assert.isFalse(element._computeHideStrategy({status: 'NEW'}));
      assert.isFalse(element._computeHideStrategy({status: 'DRAFT'}));
      assert.isTrue(element._computeHideStrategy({status: 'MERGED'}));
      assert.isTrue(element._computeHideStrategy({status: 'ABANDONED'}));
      assert.equal(element._computeStrategy({submit_type: 'CHERRY_PICK'}),
          'Cherry Pick');
    });

    test('show strategy for open change', function() {
      element.change = {status: 'NEW', submit_type: 'CHERRY_PICK', labels: {}};
      flushAsynchronousOperations();
      var strategy = element.$$('.strategy');
      assert.ok(strategy);
      assert.isFalse(strategy.hasAttribute('hidden'));
      assert.equal(strategy.children[1].innerHTML, 'Cherry Pick');
    });

    test('hide strategy for closed change', function() {
      element.change = {status: 'MERGED', labels: {}};
      flushAsynchronousOperations();
      assert.isTrue(element.$$('.strategy').hasAttribute('hidden'));
    });

    test('show CC section when NoteDb enabled', function() {
      function hasCc() {
        return element._showReviewersByState;
      }

      element.serverConfig = {};
      assert.isFalse(hasCc());

      element.serverConfig = {note_db_enabled: true};
      assert.isTrue(hasCc());
    });

    test('computes submit status', function() {
      var labels = {};
      assert.equal(element._computeSubmitStatus(labels), 'Ready to submit');
      labels = {test: {}};
      assert.equal(element._computeSubmitStatus(labels), 'Needs test label');
      labels.test.approved = true;
      assert.equal(element._computeSubmitStatus(labels), 'Ready to submit');
      labels.test.approved = false;
      labels.test.optional = true;
      assert.equal(element._computeSubmitStatus(labels), 'Ready to submit');
      labels.test.optional = false;
      labels.test2 = {};
      assert.equal(element._computeSubmitStatus(labels),
          'Needs test and test2 labels');
    });

    suite('remove reviewer votes', function() {
      var sandbox;

      setup(function() {
        sandbox = sinon.sandbox.create();
        sandbox.stub(element, '_computeValueTooltip').returns('');
        sandbox.stub(element, '_computeTopicReadOnly').returns(true);
        element.change = {
          change_id: 'the id',
          topic: 'the topic',
          status: 'NEW',
          submit_type: 'CHERRY_PICK',
          labels: {
            test: {
              all: [{_account_id: 1, name: 'bojack', value: 1}],
              default_value: 0,
              values: [],
            },
          },
          removable_reviewers: [],
        };
      });

      teardown(function() {
        sandbox.restore();
      });

      test('_computeCanDeleteVote hides delete button', function() {
        flushAsynchronousOperations();
        var button = element.$$('gr-account-chip').$$('gr-button');
        assert.isTrue(button.hasAttribute('hidden'));
        element.mutable = true;
        assert.isTrue(button.hasAttribute('hidden'));
      });

      test('_computeCanDeleteVote shows delete button', function() {
        element.change.removable_reviewers = [
          {
            _account_id: 1,
            name: 'bojack',
          }
        ];
        element.mutable = true;
        flushAsynchronousOperations();
        var button = element.$$('gr-account-chip').$$('gr-button');
        assert.isFalse(button.hasAttribute('hidden'));
      });

      test('deletes votes', function(done) {
        sandbox.stub(element.$.restAPI, 'deleteVote')
            .returns(Promise.resolve({'ok': true}));
        element.change.removable_reviewers = [
          {
            _account_id: 1,
            name: 'bojack',
          }
        ];
        element.mutable = true;
        flushAsynchronousOperations();
        var button = element.$$('gr-account-chip').$$('gr-button');
        MockInteractions.tap(button);
        flushAsynchronousOperations();
        var spliceStub = sinon.stub(element, 'splice',
            function(path, index, length) {
          assert.deepEqual(path, ['change.labels', 'test', 'all']);
          assert.equal(index, 0);
          assert.equal(length, 1);
          spliceStub.restore();
          done();
        });
      });

      test('changing topic calls setChangeTopic', function() {
        var topicStub = sandbox.stub(element.$.restAPI, 'setChangeTopic',
            function() {});
        element._handleTopicChanged({}, 'the new topic');
        assert.isTrue(topicStub.calledWith('the id', 'the new topic'));
      });
    });
  });
</script>
