blob: b3ba637e1a12663dfcdab9783f3d6262c97beb82 [file] [log] [blame]
/**
* @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.
*/
import '../../../test/common-test-setup-karma.js';
import './gr-apply-fix-dialog.js';
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
const basicFixture = fixtureFromElement('gr-apply-fix-dialog');
suite('gr-apply-fix-dialog tests', () => {
let element;
const ROBOT_COMMENT_WITH_TWO_FIXES = {
robot_id: 'robot_1',
fix_suggestions: [{fix_id: 'fix_1'}, {fix_id: 'fix_2'}],
};
const ROBOT_COMMENT_WITH_ONE_FIX = {
robot_id: 'robot_1',
fix_suggestions: [{fix_id: 'fix_1'}],
};
setup(() => {
element = basicFixture.instantiate();
element.changeNum = '1';
element._patchNum = 2;
element.change = {
_number: '1',
project: 'project',
revisions: {
abcd: {_number: 1},
efgh: {_number: 2},
},
current_revision: 'efgh',
};
element.prefs = {
font_size: 12,
line_length: 100,
tab_size: 4,
};
});
suite('dialog open', () => {
setup(() => {
sinon.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'],
},
],
},
}));
sinon.stub(element.$.applyFixOverlay, 'open')
.returns(Promise.resolve());
});
test('dialog opens fetch and sets previews', done => {
element.open({detail: {patchNum: 2,
comment: ROBOT_COMMENT_WITH_TWO_FIXES}})
.then(() => {
assert.equal(element._currentFix.fix_id, 'fix_1');
assert.equal(element._currentPreviews.length, 2);
assert.equal(element._robotId, 'robot_1');
const button = element.shadowRoot.querySelector(
'#applyFixDialog').shadowRoot.querySelector('#confirm');
assert.isFalse(button.hasAttribute('disabled'));
assert.equal(button.getAttribute('title'), '');
done();
});
});
test('tooltip is hidden if apply fix is loading', done => {
element.open({detail: {patchNum: 2,
comment: ROBOT_COMMENT_WITH_TWO_FIXES}})
.then(() => {
element._isApplyFixLoading = true;
const button = element.shadowRoot.querySelector(
'#applyFixDialog').shadowRoot.querySelector('#confirm');
assert.isTrue(button.hasAttribute('disabled'));
assert.equal(button.getAttribute('title'), '');
done();
});
});
test('apply fix button is disabled on older patchset', done => {
element.change = {
_number: '1',
project: 'project',
revisions: {
abcd: {_number: 1},
efgh: {_number: 2},
},
current_revision: 'abcd',
};
element.open({detail: {patchNum: 2,
comment: ROBOT_COMMENT_WITH_ONE_FIX}})
.then(() => {
flush(() => {
const button = element.shadowRoot.querySelector(
'#applyFixDialog').shadowRoot.querySelector('#confirm');
assert.isTrue(button.hasAttribute('disabled'));
assert.equal(button.getAttribute('title'),
'Fix can only be applied to the latest patchset');
done();
});
});
});
});
test('next button state updated when suggestions changed', done => {
sinon.stub(element.$.restAPI, 'getRobotCommentFixPreview')
.returns(Promise.resolve({}));
sinon.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());
element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_ONE_FIX}})
.then(() => assert.isTrue(element.$.nextFix.disabled))
.then(() =>
element.open({detail: {patchNum: 2,
comment: ROBOT_COMMENT_WITH_TWO_FIXES}}))
.then(() => {
assert.isFalse(element.$.nextFix.disabled);
done();
});
});
test('preview endpoint throws error should reset dialog', done => {
sinon.stub(window, 'fetch').callsFake((url => {
if (url.endsWith('/preview')) {
return Promise.reject(new Error('backend error'));
}
return Promise.resolve({
ok: true,
text() { return Promise.resolve(''); },
status: 200,
});
}));
const errorStub = sinon.stub();
document.addEventListener('network-error', errorStub);
element.open({detail: {patchNum: 2,
comment: ROBOT_COMMENT_WITH_TWO_FIXES}});
flush(() => {
assert.isTrue(errorStub.called);
assert.deepEqual(element._currentFix, {});
done();
});
});
test('apply fix button should call apply ' +
'and navigate to change view', done => {
sinon.stub(element.$.restAPI, 'applyFixSuggestion')
.returns(Promise.resolve({ok: true}));
sinon.stub(GerritNav, 'navigateToChange');
element._currentFix = {fix_id: '123'};
element._handleApplyFix().then(() => {
assert.isTrue(element.$.restAPI.applyFixSuggestion
.calledWithExactly('1', 2, '123'));
assert.isTrue(GerritNav.navigateToChange.calledWithExactly({
_number: '1',
project: 'project',
revisions: {
abcd: {_number: 1},
efgh: {_number: 2},
},
current_revision: 'efgh',
}, 'edit', 2));
// reset gr-apply-fix-dialog and close
assert.deepEqual(element._currentFix, {});
assert.equal(element._currentPreviews.length, 0);
done();
});
});
test('should not navigate to change view if incorect reponse', done => {
sinon.stub(element.$.restAPI, 'applyFixSuggestion')
.returns(Promise.resolve({}));
sinon.stub(GerritNav, 'navigateToChange');
element._currentFix = {fix_id: '123'};
element._handleApplyFix().then(() => {
assert.isTrue(element.$.restAPI.applyFixSuggestion
.calledWithExactly('1', 2, '123'));
assert.isTrue(GerritNav.navigateToChange.notCalled);
assert.equal(element._isApplyFixLoading, false);
done();
});
});
test('select fix forward and back of multiple suggested fixes', done => {
sinon.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'],
},
],
},
}));
sinon.stub(element.$.applyFixOverlay, 'open').returns(Promise.resolve());
element.open({detail: {patchNum: 2, comment: ROBOT_COMMENT_WITH_TWO_FIXES}})
.then(() => {
element._onNextFixClick();
assert.equal(element._currentFix.fix_id, 'fix_2');
element._onPrevFixClick();
assert.equal(element._currentFix.fix_id, 'fix_1');
done();
});
});
test('server-error should throw for failed apply call', done => {
sinon.stub(window, 'fetch').callsFake((url => {
if (url.endsWith('/apply')) {
return Promise.reject(new Error('backend error'));
}
return Promise.resolve({
ok: true,
text() { return Promise.resolve(''); },
status: 200,
});
}));
const errorStub = sinon.stub();
document.addEventListener('network-error', errorStub);
sinon.stub(GerritNav, 'navigateToChange');
element._currentFix = {fix_id: '123'};
element._handleApplyFix();
flush(() => {
assert.isFalse(GerritNav.navigateToChange.called);
assert.isTrue(errorStub.called);
done();
});
});
});