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

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

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

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

    test('get drafts logged out', function(done) {
      element.patchRange = {basePatchNum: 0, patchNum: 0};

      var getDraftsStub = sinon.stub(element.$.restAPI, 'getDiffDrafts');
      var loggedInStub = sinon.stub(element, '_getLoggedIn',
          function() { return Promise.resolve(false); });
      element._getDiffDrafts().then(function(result) {
        assert.deepEqual(result, {baseComments: [], comments: []});
        sinon.assert.notCalled(getDraftsStub);
        loggedInStub.restore();
        getDraftsStub.restore();
        done();
      });
    });

    test('get drafts logged in', function(done) {
      element.patchRange = {basePatchNum: 0, patchNum: 0};
      var draftsResponse = {
        baseComments: [{id: 'foo'}],
        comments: [{id: 'bar'}],
      };
      var getDraftsStub = sinon.stub(element.$.restAPI, 'getDiffDrafts',
          function() { return Promise.resolve(draftsResponse); });
      var loggedInStub = sinon.stub(element, '_getLoggedIn',
          function() { return Promise.resolve(true); });
      element._getDiffDrafts().then(function(result) {
        assert.deepEqual(result, draftsResponse);
        loggedInStub.restore();
        getDraftsStub.restore();
        done();
      });
    });

    test('get comments and drafts', function(done) {
      var loggedInStub = sinon.stub(element, '_getLoggedIn',
          function() { return Promise.resolve(true); });
      var comments = {
        baseComments: [
          {id: 'bc1'},
          {id: 'bc2'},
        ],
        comments: [
          {id: 'c1'},
          {id: 'c2'},
        ],
      };
      var diffCommentsStub = sinon.stub(element, '_getDiffComments',
          function() { return Promise.resolve(comments); });

      var drafts = {
        baseComments: [
          {id: 'bd1'},
          {id: 'bd2'},
        ],
        comments: [
          {id: 'd1'},
          {id: 'd2'},
        ],
      };
      var diffDraftsStub = sinon.stub(element, '_getDiffDrafts',
          function() { return Promise.resolve(drafts); });

      element.changeNum = '42';
      element.patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 3,
      };
      element.path = '/path/to/foo';
      element.projectConfig = {foo: 'bar'};

      element._getDiffCommentsAndDrafts().then(function(result) {
        assert.deepEqual(result, {
          meta: {
            changeNum: '42',
            patchRange: {
              basePatchNum: 'PARENT',
              patchNum: 3,
            },
            path: '/path/to/foo',
            projectConfig: {foo: 'bar'},
          },
          left: [
            {id: 'bc1'},
            {id: 'bc2'},
            {id: 'bd1', __draft: true},
            {id: 'bd2', __draft: true},
          ],
          right: [
            {id: 'c1'},
            {id: 'c2'},
            {id: 'd1', __draft: true},
            {id: 'd2', __draft: true},
          ],
        });

        diffCommentsStub.restore();
        diffDraftsStub.restore();
        loggedInStub.restore();
        done();
      });
    });

    test('remove comment', function() {
      element._comments = {
        meta: {
          changeNum: '42',
          patchRange: {
            basePatchNum: 'PARENT',
            patchNum: 3,
          },
          path: '/path/to/foo',
          projectConfig: {foo: 'bar'},
        },
        left: [
          {id: 'bc1'},
          {id: 'bc2'},
          {id: 'bd1', __draft: true},
          {id: 'bd2', __draft: true},
        ],
        right: [
          {id: 'c1'},
          {id: 'c2'},
          {id: 'd1', __draft: true},
          {id: 'd2', __draft: true},
        ],
      };

      element._removeComment({});
      // Using JSON.stringify because Safari 9.1 (11601.5.17.1) doesn’t seem to
      // believe that one object deepEquals another even when they do :-/.
      assert.equal(JSON.stringify(element._comments), JSON.stringify({
        meta: {
          changeNum: '42',
          patchRange: {
            basePatchNum: 'PARENT',
            patchNum: 3,
          },
          path: '/path/to/foo',
          projectConfig: {foo: 'bar'},
        },
        left: [
          {id: 'bc1'},
          {id: 'bc2'},
          {id: 'bd1', __draft: true},
          {id: 'bd2', __draft: true},
        ],
        right: [
          {id: 'c1'},
          {id: 'c2'},
          {id: 'd1', __draft: true},
          {id: 'd2', __draft: true},
        ],
      }));

      element._removeComment({id: 'bc2'});
      assert.equal(JSON.stringify(element._comments), JSON.stringify({
        meta: {
          changeNum: '42',
          patchRange: {
            basePatchNum: 'PARENT',
            patchNum: 3,
          },
          path: '/path/to/foo',
          projectConfig: {foo: 'bar'},
        },
        left: [
          {id: 'bc1'},
          {id: 'bd1', __draft: true},
          {id: 'bd2', __draft: true},
        ],
        right: [
          {id: 'c1'},
          {id: 'c2'},
          {id: 'd1', __draft: true},
          {id: 'd2', __draft: true},
        ],
      }));

      element._removeComment({id: 'd2'});
      assert.deepEqual(JSON.stringify(element._comments), JSON.stringify({
        meta: {
          changeNum: '42',
          patchRange: {
            basePatchNum: 'PARENT',
            patchNum: 3,
          },
          path: '/path/to/foo',
          projectConfig: {foo: 'bar'},
        },
        left: [
          {id: 'bc1'},
          {id: 'bd1', __draft: true},
          {id: 'bd2', __draft: true},
        ],
        right: [
          {id: 'c1'},
          {id: 'c2'},
          {id: 'd1', __draft: true},
        ],
      }));
    });
  });
</script>
