blob: 92553a0d366816e1cf0cb26fc0637885a97fdfab [file] [log] [blame]
<!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-patch-range-select</title>
<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<script src="../../../bower_components/page/page.js"></script>
<link rel="import" href="gr-patch-range-select.html">
<script>void(0);</script>
<test-fixture id="basic">
<template>
<gr-patch-range-select auto></gr-patch-range-select>
</template>
</test-fixture>
<script>
suite('gr-patch-range-select tests', () => {
let element;
let sandbox;
setup(() => {
element = fixture('basic');
sandbox = sinon.sandbox.create();
});
teardown(() => sandbox.restore());
test('enabled/disabled options', () => {
const patchRange = {
basePatchNum: 'PARENT',
patchNum: '3',
};
const sortedRevisions = [
{_number: 1},
{_number: 2},
{_number: element.EDIT_NAME, basePatchNum: 2},
{_number: 3},
];
for (const patchNum of ['1', '2', '3']) {
assert.isFalse(element._computeRightDisabled(patchNum,
patchRange.basePatchNum, sortedRevisions));
}
for (const patchNum of ['PARENT', '1', '2']) {
assert.isFalse(element._computeLeftDisabled(patchNum,
patchRange.patchNum, sortedRevisions));
}
assert.isTrue(element._computeLeftDisabled('3', patchRange.patchNum));
patchRange.basePatchNum = element.EDIT_NAME;
assert.isTrue(element._computeLeftDisabled('3', patchRange.patchNum,
sortedRevisions));
assert.isTrue(element._computeRightDisabled('1', patchRange.basePatchNum,
sortedRevisions));
assert.isTrue(element._computeRightDisabled('2', patchRange.basePatchNum,
sortedRevisions));
assert.isFalse(element._computeRightDisabled('3', patchRange.basePatchNum,
sortedRevisions));
assert.isTrue(element._computeRightDisabled(element.EDIT_NAME,
patchRange.basePatchNum, sortedRevisions));
});
test('_updateSelected called with subproperty changes', () => {
sandbox.stub(element, '_updateSelected');
element.patchRange = {patchNum: 1, basePatchNum: 'PARENT'};
assert.equal(element._updateSelected.callCount, 1);
element.set('patchRange.patchNum', 2);
assert.equal(element._updateSelected.callCount, 2);
element.set('patchRange.basePatchNum', 1);
assert.equal(element._updateSelected.callCount, 3);
});
test('_computeLeftDisabled called when patchNum updates', () => {
element.revisions = [
{commit: {}},
{commit: {}},
{commit: {}},
{commit: {}},
];
element.availablePatches = [
{num: 1},
{num: 2},
{num: 3},
{num: 'edit'},
];
element.patchRange = {patchNum: 2, basePatchNum: 'PARENT'};
flushAsynchronousOperations();
// Should be recomputed for each available patch
sandbox.stub(element, '_computeLeftDisabled');
element.set('patchRange.patchNum', '1');
assert.equal(element._computeLeftDisabled.callCount, 4);
});
test('_computeRightDisabled called when basePatchNum updates', () => {
element.revisions = [
{commit: {}},
{commit: {}},
{commit: {}},
{commit: {}},
];
element.availablePatches = [
{num: 1},
{num: 2},
{num: 3},
{num: 'edit'},
];
element.patchRange = {patchNum: 2, basePatchNum: 'PARENT'};
flushAsynchronousOperations();
// Should be recomputed for each available patch
sandbox.stub(element, '_computeRightDisabled');
element.set('patchRange.basePatchNum', '1');
assert.equal(element._computeRightDisabled.callCount, 4);
});
test('changes in patch range fire event', done => {
sandbox.stub(element, '_computeLeftDisabled').returns(false);
sandbox.stub(element, '_computeRightDisabled').returns(false);
const patchRangeChangedStub = sandbox.stub();
element.addEventListener('patch-range-change', patchRangeChangedStub);
const leftSelectEl = element.$.leftPatchSelect;
const rightSelectEl = element.$.rightPatchSelect;
const blurSpy = sandbox.spy(leftSelectEl, 'blur');
element.changeNum = '42';
element.path = 'path/to/file.txt';
element.availablePatches =
[{num: '1'}, {num: '2'}, {num: '3'}, {num: 'edit'}];
element.patchRange = {
basePatchNum: 'PARENT',
patchNum: '3',
};
flushAsynchronousOperations();
let numEvents = 0;
leftSelectEl.addEventListener('change', e => {
numEvents++;
if (numEvents === 1) {
assert.deepEqual(patchRangeChangedStub.lastCall.args[0].detail,
{rightPatch: '3', leftPatch: 'PARENT'});
leftSelectEl.nativeSelect.value = 'edit';
element.fire('change', {}, {node: leftSelectEl});
assert(blurSpy.called, 'Dropdown should be blurred after selection');
} else if (numEvents === 2) {
assert.deepEqual(patchRangeChangedStub.lastCall.args[0].detail,
{rightPatch: '3', leftPatch: 'edit'});
rightSelectEl.nativeSelect.value = '1';
element.fire('change', {}, {node: rightSelectEl});
}
});
rightSelectEl.addEventListener('change', e => {
assert.deepEqual(patchRangeChangedStub.lastCall.args[0].detail,
{rightPatch: '1', leftPatch: 'edit'});
done();
});
leftSelectEl.nativeSelect.value = 'PARENT';
rightSelectEl.nativeSelect.value = '3';
element.fire('change', {}, {node: leftSelectEl});
});
test('diff against dropdown', done => {
element.revisions = [
{commit: {}},
{commit: {}},
{commit: {}},
{commit: {}},
];
element.availablePatches = [
{num: 1},
{num: 2},
{num: 3},
{num: 'edit'},
];
element.patchRange = {
basePatchNum: 'PARENT',
patchNum: '3',
};
const patchRangeChangedStub = sandbox.stub();
element.addEventListener('patch-range-change', patchRangeChangedStub);
flush(() => {
const selectEl = element.$.leftPatchSelect;
assert.equal(selectEl.nativeSelect.value, 'PARENT');
assert.isTrue(element.$$('#leftPatchSelect option[value="3"]')
.hasAttribute('disabled'));
selectEl.addEventListener('change', () => {
assert.equal(selectEl.nativeSelect.value, 'edit');
assert.deepEqual(patchRangeChangedStub.lastCall.args[0].detail,
{leftPatch: 'edit', rightPatch: '3'});
done();
});
selectEl.nativeSelect.value = 'edit';
element.fire('change', {}, {node: selectEl.nativeSelect});
});
});
test('filesWeblinks', () => {
element.filesWeblinks = {
meta_a: [
{
name: 'foo',
url: 'f.oo',
},
],
meta_b: [
{
name: 'bar',
url: 'ba.r',
},
],
};
flushAsynchronousOperations();
const domApi = Polymer.dom(element.root);
assert.equal(
domApi.querySelector('a[href="f.oo"]').textContent, 'foo');
assert.equal(
domApi.querySelector('a[href="ba.r"]').textContent, 'bar');
});
test('_computePatchSetCommentsString', () => {
// Test string with unresolved comments.
comments = {
foo: [{
id: '27dcee4d_f7b77cfa',
message: 'test',
patch_set: 1,
unresolved: true,
}],
bar: [{
id: '27dcee4d_f7b77cfa',
message: 'test',
patch_set: 1,
},
{
id: '27dcee4d_f7b77cfa',
message: 'test',
patch_set: 1,
}],
abc: [],
};
assert.equal(element._computePatchSetCommentsString(comments, 1),
'(3 comments, 1 unresolved)');
// Test string with no unresolved comments.
delete comments['foo'];
assert.equal(element._computePatchSetCommentsString(comments, 1),
'(2 comments)');
// Test string with no comments.
delete comments['bar'];
assert.equal(element._computePatchSetCommentsString(comments, 1), '');
});
});
</script>