<!DOCTYPE html>
<!--
@license
Copyright (C) 2019 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-apply-fix-dialog</title>
<script src='/test/common-test-setup.js'></script>
<script src='/bower_components/webcomponentsjs/custom-elements-es5-adapter.js'></script>

<script src='/bower_components/webcomponentsjs/webcomponents-lite.js'></script>
<script src='/bower_components/web-component-tester/browser.js'></script>
<link rel='import' href='../../../test/common-test-setup.html' />

<link rel='import' href='./gr-apply-fix-dialog.html'>

<script>void (0);</script>

<test-fixture id='basic'>
  <template>
    <gr-apply-fix-dialog></gr-apply-fix-dialog>
  </template>
</test-fixture>

<script>
  suite('gr-apply-fix-dialog tests', async () => {
    await readyToTest();
    let element;
    let sandbox;
    const ROBOT_COMMENT = {
      robot_id: 'robot_1',
      fix_suggestions: [{fix_id: 'fix_1'}, {fix_id: 'fix_2'}],
    };

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
      element.changeNum = '1';
      element._patchNum = 2;
      element.change = {
        _number: '1',
        project: 'project',
      };
      element.prefs = {
        font_size: 12,
        line_length: 100,
        tab_size: 4,
      };
    });

    teardown(() => {
      sandbox.restore();
    });

    test('dialog opens fetch and sets previews', done => {
      sandbox.stub(element.$.restAPI, 'getRobotCommentFixPreview')
          .returns(Promise.resolve({
            f1: {
              meta_a: {},
              meta_b: {},
              content: [
                {
                  ab: ['loqlwkqll'],
                },
                {
                  b: ['qwqqsqw'],
                },
                {
                  ab: ['qwqqsqw', 'qweqeqweqeq', 'qweqweq'],
                },
              ],
            },
            f2: {
              meta_a: {},
              meta_b: {},
              content: [
                {
                  ab: ['eqweqweqwex'],
                },
                {
                  b: ['zassdasd'],
                },
                {
                  ab: ['zassdasd', 'dasdasda', 'asdasdad'],
                },
              ],
            },
          }));
      sandbox.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());

      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT}})
          .then(() => {
            assert.equal(element._currentFix.fix_id, 'fix_1');
            assert.equal(element._currentPreviews.length, 2);
            assert.equal(element._robotId, 'robot_1');
            done();
          });
    });

    test('preview endpoint throws error should reset dialog', done => {
      element.addEventListener('show-error', () => {
        assert.deepEqual(element._currentFix, {});
        assert.equal(element._currentPreviews.length, 0);
        done();
      });
      sandbox.stub(element.$.restAPI, 'getRobotCommentFixPreview',
          () => Promise.reject(new Error('backend error')));

      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT}});
    });

    test('apply fix button should call apply' +
    'and navigate to change view', done => {
      sandbox.stub(element.$.restAPI, 'applyFixSuggestion')
          .returns(Promise.resolve());
      sandbox.stub(Gerrit.Nav, 'navigateToChange');
      element._currentFix = {fix_id: '123'};

      element._handleApplyFix().then(() => {
        assert.isTrue(element.$.restAPI.applyFixSuggestion
            .calledWithExactly('1', 2, '123'));
        assert.isTrue(Gerrit.Nav.navigateToChange.calledWithExactly({
          _number: '1',
          project: 'project',
        }, 'edit', 2));

        // reset gr-apply-fix-dialog and close
        assert.deepEqual(element._currentFix, {});
        assert.equal(element._currentPreviews.length, 0);
        done();
      });
    });

    test('select fix forward and back of multiple suggested fixes', done => {
      sandbox.stub(element.$.restAPI, 'getRobotCommentFixPreview')
          .returns(Promise.resolve({
            f1: {
              meta_a: {},
              meta_b: {},
              content: [
                {
                  ab: ['loqlwkqll'],
                },
                {
                  b: ['qwqqsqw'],
                },
                {
                  ab: ['qwqqsqw', 'qweqeqweqeq', 'qweqweq'],
                },
              ],
            },
            f2: {
              meta_a: {},
              meta_b: {},
              content: [
                {
                  ab: ['eqweqweqwex'],
                },
                {
                  b: ['zassdasd'],
                },
                {
                  ab: ['zassdasd', 'dasdasda', 'asdasdad'],
                },
              ],
            },
          }));
      sandbox.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());

      element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT}})
          .then(() => {
            element._onNextFixClick();
            assert.equal(element._currentFix.fix_id, 'fix_2');
            element._onPrevFixClick();
            assert.equal(element._currentFix.fix_id, 'fix_1');
            done();
          });
    });
  });
</script>
