<!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>
<script src="../../../scripts/util.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},
        ],
      }));
    });

    test('renders image diffs', function(done) {
      var mockDiff = {
        meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
        meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 560},
        intraline_status: 'OK',
        change_type: 'MODIFIED',
        diff_header: [
          'diff --git a/carrot.jpg b/carrot.jpg',
          'index 2adc47d..f9c2f2c 100644',
          '--- a/carrot.jpg',
          '+++ b/carrot.jpg',
          'Binary files differ',
        ],
        content: [{skip: 66}],
        binary: true,
      };
      var mockFile1 = {
        body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAEwsAAA' +
            'AAAAAAAAAAAAAA/w==',
        type: 'image/bmp',
      };
      var mockFile2 = {
        body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAEwsAAA' +
            'AAAAAAAAAA/////w==',
        type: 'image/bmp'
      };
      var mockCommit = {
        commit: '9a1a1d10baece5efbba10bc4ccf808a67a50ac0a',
        parents: [{
          commit: '7338aa9adfe57909f1fdaf88975cdea467d3382f',
          subject: 'Added a carrot',
        }],
        author: {
          name: 'Wyatt Allen',
          email: 'wyatta@google.com',
          date: '2016-05-23 21:44:51.000000000',
          tz: -420,
        },
        committer: {
          name: 'Wyatt Allen',
          email: 'wyatta@google.com',
          date: '2016-05-25 00:25:41.000000000',
          tz: -420,
        },
        subject: 'Updated the carrot',
        message: 'Updated the carrot\n\nChange-Id: Iabcd123\n',
      };
      var mockComments = {baseComments: [], comments: []};

      var stubs = [];
      stubs.push(sinon.stub(element, '_getDiff',
          function() { return Promise.resolve(mockDiff); }));
      stubs.push(sinon.stub(element.$.restAPI, 'getCommitInfo',
          function() { return Promise.resolve(mockCommit); }));
      stubs.push(sinon.stub(element.$.restAPI,
          'getCommitFileContents',
          function() { return Promise.resolve(mockFile1); }));
      stubs.push(sinon.stub(element.$.restAPI,
          'getChangeFileContents',
          function() { return Promise.resolve(mockFile2); }));
      stubs.push(sinon.stub(element.$.restAPI, '_getDiffComments',
          function() { return Promise.resolve(mockComments); }));
      stubs.push(sinon.stub(element.$.restAPI, 'getDiffDrafts',
          function() { return Promise.resolve(mockComments); }));

      element.patchRange = {basePatchNum: 'PARENT', patchNum: 1};

      var rendered = function() {
        // Recognizes that it should be an image diff.
        assert.isTrue(element.isImageDiff);
        assert.instanceOf(element._getDiffBuilder(element._diff,
            element._comments, element.prefs), GrDiffBuilderImage);

        // The left image rendered with the parent commit's version of the file.
        var leftInmage = element.$.diffTable.querySelector('td.left img');
        assert.isOk(leftInmage);
        assert.equal(leftInmage.getAttribute('src'),
            'data:image/bmp;base64, ' + mockFile1.body);

        // The right image rendered with this change's revision of the image.
        var rightInmage = element.$.diffTable.querySelector('td.right img');
        assert.isOk(rightInmage);
        assert.equal(rightInmage.getAttribute('src'),
            'data:image/bmp;base64, ' + mockFile2.body);

        // Cleanup.
        element.removeEventListener('render', rendered);
        stubs.forEach(function(stub) { stub.restore(); });

        done();
      };

      element.addEventListener('render', rendered);

      element.$.restAPI.getDiffPreferences().then(function(prefs) {
        element.prefs = prefs;
        element.reload();
      });
    });
  });
</script>
