
These tags are preserved by the Closure compiler and vulcanize in order to serve the license notices embedded in the outputs. In a standalone Gerrit server, these license are also covered in the LICENSES.txt served with the documentation. When serving PG assets from a CDN, it's less obvious what the corresponding LICENSES.txt file is, since the CDN is not directly linked to a running Gerrit server. Safer to embed the licenses in the assets themselves. Change-Id: Id1add1451fad1baa7916882a6bda02c326ccc988
328 lines
11 KiB
HTML
328 lines
11 KiB
HTML
<!--
|
|
@license
|
|
Copyright (C) 2016 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.
|
|
-->
|
|
<!-- Polymer included for the html import polyfill. -->
|
|
<script src="../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
|
|
<script src="../../bower_components/web-component-tester/browser.js"></script>
|
|
<link rel="import" href="../../test/common-test-setup.html"/>
|
|
<title>gr-patch-set-behavior</title>
|
|
|
|
<link rel="import" href="gr-patch-set-behavior.html">
|
|
|
|
<script>
|
|
suite('gr-patch-set-behavior tests', () => {
|
|
test('getRevisionByPatchNum', () => {
|
|
const get = Gerrit.PatchSetBehavior.getRevisionByPatchNum;
|
|
const revisions = [
|
|
{_number: 0},
|
|
{_number: 1},
|
|
{_number: 2},
|
|
];
|
|
assert.deepEqual(get(revisions, '1'), revisions[1]);
|
|
assert.deepEqual(get(revisions, 2), revisions[2]);
|
|
assert.equal(get(revisions, '3'), undefined);
|
|
});
|
|
|
|
test('fetchChangeUpdates on latest', done => {
|
|
const knownChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
},
|
|
status: 'NEW',
|
|
messages: [],
|
|
};
|
|
const mockRestApi = {
|
|
getChangeDetail() {
|
|
return Promise.resolve(knownChange);
|
|
},
|
|
};
|
|
Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
|
|
.then(result => {
|
|
assert.isTrue(result.isLatest);
|
|
assert.isNotOk(result.newStatus);
|
|
assert.isFalse(result.newMessages);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('fetchChangeUpdates not on latest', done => {
|
|
const knownChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
},
|
|
status: 'NEW',
|
|
messages: [],
|
|
};
|
|
const actualChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
sha3: {description: 'patch 3', _number: 3},
|
|
},
|
|
status: 'NEW',
|
|
messages: [],
|
|
};
|
|
const mockRestApi = {
|
|
getChangeDetail() {
|
|
return Promise.resolve(actualChange);
|
|
},
|
|
};
|
|
Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
|
|
.then(result => {
|
|
assert.isFalse(result.isLatest);
|
|
assert.isNotOk(result.newStatus);
|
|
assert.isFalse(result.newMessages);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('fetchChangeUpdates new status', done => {
|
|
const knownChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
},
|
|
status: 'NEW',
|
|
messages: [],
|
|
};
|
|
const actualChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
},
|
|
status: 'MERGED',
|
|
messages: [],
|
|
};
|
|
const mockRestApi = {
|
|
getChangeDetail() {
|
|
return Promise.resolve(actualChange);
|
|
},
|
|
};
|
|
Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
|
|
.then(result => {
|
|
assert.isTrue(result.isLatest);
|
|
assert.equal(result.newStatus, 'MERGED');
|
|
assert.isFalse(result.newMessages);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('fetchChangeUpdates new messages', done => {
|
|
const knownChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
},
|
|
status: 'NEW',
|
|
messages: [],
|
|
};
|
|
const actualChange = {
|
|
revisions: {
|
|
sha1: {description: 'patch 1', _number: 1},
|
|
sha2: {description: 'patch 2', _number: 2},
|
|
},
|
|
status: 'NEW',
|
|
messages: [{message: 'blah blah'}],
|
|
};
|
|
const mockRestApi = {
|
|
getChangeDetail() {
|
|
return Promise.resolve(actualChange);
|
|
},
|
|
};
|
|
Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
|
|
.then(result => {
|
|
assert.isTrue(result.isLatest);
|
|
assert.isNotOk(result.newStatus);
|
|
assert.isTrue(result.newMessages);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('_computeWipForPatchSets', () => {
|
|
// Compute patch sets for a given timeline on a change. The initial WIP
|
|
// property of the change can be true or false. The map of tags by
|
|
// revision is keyed by patch set number. Each value is a list of change
|
|
// message tags in the order that they occurred in the timeline. These
|
|
// indicate actions that modify the WIP property of the change and/or
|
|
// create new patch sets.
|
|
//
|
|
// Returns the actual results with an assertWip method that can be used
|
|
// to compare against an expected value for a particular patch set.
|
|
const compute = (initialWip, tagsByRevision) => {
|
|
const change = {
|
|
messages: [],
|
|
work_in_progress: initialWip,
|
|
};
|
|
const revs = Object.keys(tagsByRevision).sort((a, b) => {
|
|
return a - b;
|
|
});
|
|
for (const rev of revs) {
|
|
for (const tag of tagsByRevision[rev]) {
|
|
change.messages.push({
|
|
tag,
|
|
_revision_number: rev,
|
|
});
|
|
}
|
|
}
|
|
let patchNums = revs.map(rev => { return {num: rev}; });
|
|
patchNums = Gerrit.PatchSetBehavior._computeWipForPatchSets(
|
|
change, patchNums);
|
|
const actualWipsByRevision = {};
|
|
for (const patchNum of patchNums) {
|
|
actualWipsByRevision[patchNum.num] = patchNum.wip;
|
|
}
|
|
const verifier = {
|
|
assertWip(revision, expectedWip) {
|
|
const patchNum = patchNums.find(patchNum => {
|
|
return patchNum.num == revision;
|
|
});
|
|
if (!patchNum) {
|
|
assert.fail('revision ' + revision + ' not found');
|
|
}
|
|
assert.equal(patchNum.wip, expectedWip,
|
|
'wip state for ' + revision + ' is ' +
|
|
patchNum.wip + '; expected ' + expectedWip);
|
|
return verifier;
|
|
},
|
|
};
|
|
return verifier;
|
|
};
|
|
|
|
compute(false, {1: ['upload']}).assertWip(1, false);
|
|
compute(true, {1: ['upload']}).assertWip(1, true);
|
|
|
|
const setWip = 'autogenerated:gerrit:setWorkInProgress';
|
|
const uploadInWip = 'autogenerated:gerrit:newWipPatchSet';
|
|
const clearWip = 'autogenerated:gerrit:setReadyForReview';
|
|
|
|
compute(false, {
|
|
1: ['upload', setWip],
|
|
2: ['upload'],
|
|
3: ['upload', clearWip],
|
|
4: ['upload', setWip],
|
|
}).assertWip(1, false) // Change was created with PS1 ready for review
|
|
.assertWip(2, true) // PS2 was uploaded during WIP
|
|
.assertWip(3, false) // PS3 was marked ready for review after upload
|
|
.assertWip(4, false); // PS4 was uploaded ready for review
|
|
|
|
compute(false, {
|
|
1: [uploadInWip, null, 'addReviewer'],
|
|
2: ['upload'],
|
|
3: ['upload', clearWip, setWip],
|
|
4: ['upload'],
|
|
5: ['upload', clearWip],
|
|
6: [uploadInWip],
|
|
}).assertWip(1, true) // Change was created in WIP
|
|
.assertWip(2, true) // PS2 was uploaded during WIP
|
|
.assertWip(3, false) // PS3 was marked ready for review
|
|
.assertWip(4, true) // PS4 was uploaded during WIP
|
|
.assertWip(5, false) // PS5 was marked ready for review
|
|
.assertWip(6, true); // PS6 was uploaded with WIP option
|
|
});
|
|
|
|
test('patchNumEquals', () => {
|
|
const equals = Gerrit.PatchSetBehavior.patchNumEquals;
|
|
assert.isFalse(equals('edit', 'PARENT'));
|
|
assert.isFalse(equals('edit', NaN));
|
|
assert.isFalse(equals(1, '2'));
|
|
|
|
assert.isTrue(equals(1, '1'));
|
|
assert.isTrue(equals(1, 1));
|
|
assert.isTrue(equals('edit', 'edit'));
|
|
assert.isTrue(equals('PARENT', 'PARENT'));
|
|
});
|
|
|
|
test('isMergeParent', () => {
|
|
const isParent = Gerrit.PatchSetBehavior.isMergeParent;
|
|
assert.isFalse(isParent(1));
|
|
assert.isFalse(isParent(4321));
|
|
assert.isFalse(isParent('52'));
|
|
assert.isFalse(isParent('edit'));
|
|
assert.isFalse(isParent('PARENT'));
|
|
assert.isFalse(isParent(0));
|
|
|
|
assert.isTrue(isParent(-23));
|
|
assert.isTrue(isParent(-1));
|
|
assert.isTrue(isParent('-42'));
|
|
});
|
|
|
|
test('findEditParentRevision', () => {
|
|
const findParent = Gerrit.PatchSetBehavior.findEditParentRevision;
|
|
let revisions = [
|
|
{_number: 0},
|
|
{_number: 1},
|
|
{_number: 2},
|
|
];
|
|
assert.strictEqual(findParent(revisions), null);
|
|
|
|
revisions = [...revisions, {_number: 'edit', basePatchNum: 3}];
|
|
assert.strictEqual(findParent(revisions), null);
|
|
|
|
revisions = [...revisions, {_number: 3}];
|
|
assert.deepEqual(findParent(revisions), {_number: 3});
|
|
});
|
|
|
|
test('findEditParentPatchNum', () => {
|
|
const findNum = Gerrit.PatchSetBehavior.findEditParentPatchNum;
|
|
let revisions = [
|
|
{_number: 0},
|
|
{_number: 1},
|
|
{_number: 2},
|
|
];
|
|
assert.equal(findNum(revisions), -1);
|
|
|
|
revisions =
|
|
[...revisions, {_number: 'edit', basePatchNum: 3}, {_number: 3}];
|
|
assert.deepEqual(findNum(revisions), 3);
|
|
});
|
|
|
|
test('sortRevisions', () => {
|
|
const sort = Gerrit.PatchSetBehavior.sortRevisions;
|
|
const revisions = [
|
|
{_number: 0},
|
|
{_number: 2},
|
|
{_number: 1},
|
|
];
|
|
const sorted = [
|
|
{_number: 2},
|
|
{_number: 1},
|
|
{_number: 0},
|
|
];
|
|
|
|
assert.deepEqual(sort(revisions), sorted);
|
|
|
|
// Edit patchset should follow directly after its basePatchNum.
|
|
revisions.push({_number: 'edit', basePatchNum: 2});
|
|
sorted.unshift({_number: 'edit', basePatchNum: 2});
|
|
assert.deepEqual(sort(revisions), sorted);
|
|
|
|
revisions[0].basePatchNum = 0;
|
|
const edit = sorted.shift();
|
|
edit.basePatchNum = 0;
|
|
// Edit patchset should be at index 2.
|
|
sorted.splice(2, 0, edit);
|
|
assert.deepEqual(sort(revisions), sorted);
|
|
});
|
|
|
|
test('getParentIndex', () => {
|
|
assert.equal(Gerrit.PatchSetBehavior.getParentIndex('-13'), 13);
|
|
assert.equal(Gerrit.PatchSetBehavior.getParentIndex(-4), 4);
|
|
});
|
|
});
|
|
</script>
|