blob: 3c8f26ddb45be510782419fb36e0074b017664b6 [file] [log] [blame]
/**
* @license
* Copyright (C) 2020 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';
import {
isUnresolved,
getPatchRangeForCommentUrl,
createCommentThreads,
sortComments,
} from './comment-util';
import {createComment, createCommentThread} from '../test/test-data-generators';
import {CommentSide, Side} from '../constants/constants';
import {
BasePatchSetNum,
ParentPatchSetNum,
PatchSetNum,
RevisionPatchSetNum,
Timestamp,
UrlEncodedCommentId,
} from '../types/common';
suite('comment-util', () => {
test('isUnresolved', () => {
const thread = createCommentThread([createComment()]);
assert.isFalse(isUnresolved(undefined));
assert.isFalse(isUnresolved(thread));
assert.isTrue(
isUnresolved({
...thread,
comments: [{...createComment(), unresolved: true}],
})
);
assert.isFalse(
isUnresolved({
...thread,
comments: [{...createComment(), unresolved: false}],
})
);
assert.isTrue(
isUnresolved({
...thread,
comments: [
{...createComment(), unresolved: false},
{...createComment(), unresolved: true},
],
})
);
assert.isFalse(
isUnresolved({
...thread,
comments: [
{...createComment(), unresolved: true},
{...createComment(), unresolved: false},
],
})
);
});
test('getPatchRangeForCommentUrl', () => {
test('comment created with side=PARENT does not navigate to latest ps', () => {
const comment = {
...createComment(),
id: 'c4' as UrlEncodedCommentId,
line: 10,
patch_set: 4 as PatchSetNum,
side: CommentSide.PARENT,
path: '/COMMIT_MSG',
};
assert.deepEqual(
getPatchRangeForCommentUrl(comment, 11 as RevisionPatchSetNum),
{
basePatchNum: ParentPatchSetNum,
patchNum: 4 as PatchSetNum,
}
);
});
});
test('comments sorting', () => {
const comments = [
{
id: 'new_draft' as UrlEncodedCommentId,
message: 'i do not like either of you',
diffSide: Side.LEFT,
__draft: true,
updated: '2015-12-20 15:01:20.396000000' as Timestamp,
},
{
id: 'sallys_confession' as UrlEncodedCommentId,
message: 'i like you, jack',
updated: '2015-12-23 15:00:20.396000000' as Timestamp,
line: 1,
diffSide: Side.LEFT,
},
{
id: 'jacks_reply' as UrlEncodedCommentId,
message: 'i like you, too',
updated: '2015-12-24 15:01:20.396000000' as Timestamp,
diffSide: Side.LEFT,
line: 1,
in_reply_to: 'sallys_confession',
},
];
const sortedComments = sortComments(comments);
assert.equal(sortedComments[0], comments[1]);
assert.equal(sortedComments[1], comments[2]);
assert.equal(sortedComments[2], comments[0]);
});
suite('createCommentThreads', () => {
test('creates threads from individual comments', () => {
const comments = [
{
id: 'sallys_confession' as UrlEncodedCommentId,
message: 'i like you, jack',
updated: '2015-12-23 15:00:20.396000000' as Timestamp,
line: 1,
patch_set: 1 as PatchSetNum,
path: 'some/path',
},
{
id: 'jacks_reply' as UrlEncodedCommentId,
message: 'i like you, too',
updated: '2015-12-24 15:01:20.396000000' as Timestamp,
line: 1,
in_reply_to: 'sallys_confession' as UrlEncodedCommentId,
patch_set: 1 as PatchSetNum,
path: 'some/path',
},
{
id: 'new_draft' as UrlEncodedCommentId,
message: 'i do not like either of you' as UrlEncodedCommentId,
__draft: true,
updated: '2015-12-20 15:01:20.396000000' as Timestamp,
patch_set: 1 as PatchSetNum,
path: 'some/path',
},
];
const actualThreads = createCommentThreads(comments, {
basePatchNum: 1 as BasePatchSetNum,
patchNum: 4 as RevisionPatchSetNum,
});
assert.equal(actualThreads.length, 2);
assert.equal(actualThreads[0].diffSide, Side.LEFT);
assert.equal(actualThreads[0].comments.length, 2);
assert.deepEqual(actualThreads[0].comments[0], comments[0]);
assert.deepEqual(actualThreads[0].comments[1], comments[1]);
assert.equal(actualThreads[0].patchNum, 1 as PatchSetNum);
assert.equal(actualThreads[0].line, 1);
assert.equal(actualThreads[1].diffSide, Side.LEFT);
assert.equal(actualThreads[1].comments.length, 1);
assert.deepEqual(actualThreads[1].comments[0], comments[2]);
assert.equal(actualThreads[1].patchNum, 1 as PatchSetNum);
assert.equal(actualThreads[1].line, 'FILE');
});
test('derives patchNum and range', () => {
const comments = [
{
id: 'betsys_confession' as UrlEncodedCommentId,
message: 'i like you, jack',
updated: '2015-12-24 15:00:10.396000000' as Timestamp,
range: {
start_line: 1,
start_character: 1,
end_line: 1,
end_character: 2,
},
patch_set: 5 as PatchSetNum,
path: '/p',
line: 1,
},
];
const expectedThreads = [
{
diffSide: Side.LEFT,
commentSide: CommentSide.REVISION,
path: '/p',
rootId: 'betsys_confession' as UrlEncodedCommentId,
mergeParentNum: undefined,
comments: [
{
id: 'betsys_confession' as UrlEncodedCommentId,
path: '/p',
message: 'i like you, jack',
updated: '2015-12-24 15:00:10.396000000' as Timestamp,
range: {
start_line: 1,
start_character: 1,
end_line: 1,
end_character: 2,
},
patch_set: 5 as PatchSetNum,
line: 1,
},
],
patchNum: 5 as PatchSetNum,
range: {
start_line: 1,
start_character: 1,
end_line: 1,
end_character: 2,
},
line: 1,
},
];
assert.deepEqual(
createCommentThreads(comments, {
basePatchNum: 5 as BasePatchSetNum,
patchNum: 10 as RevisionPatchSetNum,
}),
expectedThreads
);
});
test('does not thread unrelated comments at same location', () => {
const comments = [
{
id: 'sallys_confession' as UrlEncodedCommentId,
message: 'i like you, jack',
updated: '2015-12-23 15:00:20.396000000' as Timestamp,
diffSide: Side.LEFT,
path: '/p',
},
{
id: 'jacks_reply' as UrlEncodedCommentId,
message: 'i like you, too',
updated: '2015-12-24 15:01:20.396000000' as Timestamp,
diffSide: Side.LEFT,
path: '/p',
},
];
assert.equal(createCommentThreads(comments).length, 2);
});
});
});