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