Merge "Convert gr-message_test to typescript"

This commit is contained in:
Dhruv Srivastava
2021-03-11 16:10:04 +00:00
committed by Gerrit Code Review
4 changed files with 296 additions and 155 deletions

View File

@@ -69,7 +69,7 @@ export interface MessageAnchorTapDetail {
id: ChangeMessageId;
}
interface ChangeMessage extends ChangeMessageInfo {
export interface ChangeMessage extends ChangeMessageInfo {
// TODO(TS): maybe should be an enum instead
type: string;
expanded: boolean;

View File

@@ -16,97 +16,135 @@
*/
import '../../../test/common-test-setup-karma.js';
import './gr-message.js';
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
import {createChange, createRevisions} from '../../../test/test-data-generators.js';
import {stubRestApi} from '../../../test/test-utils.js';
import './gr-message';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {
createChange,
createChangeMessage,
createComment,
createRevisions,
} from '../../../test/test-data-generators';
import {
query,
queryAll,
queryAndAssert,
stubRestApi,
} from '../../../test/test-utils';
import {GrMessage} from './gr-message';
import {
AccountId,
BasePatchSetNum,
ChangeMessageId,
EmailAddress,
NumericChangeId,
PatchSetNum,
ReviewInputTag,
Timestamp,
UrlEncodedCommentId,
} from '../../../types/common.js';
import {tap} from '@polymer/iron-test-helpers/mock-interactions';
import {
ChangeMessageDeletedEventDetail,
ReplyEventDetail,
} from '../../../types/events.js';
import {GrButton} from '../../shared/gr-button/gr-button.js';
import {CommentSide} from '../../../constants/constants.js';
import {SinonStubbedMember} from 'sinon/pkg/sinon-esm';
const basicFixture = fixtureFromElement('gr-message');
suite('gr-message tests', () => {
let element;
let element: GrMessage;
suite('when admin and logged in', () => {
setup(done => {
stubRestApi('getPreferences').returns(Promise.resolve({}));
stubRestApi('getIsAdmin').returns(Promise.resolve(true));
stubRestApi('deleteChangeCommitMessage').returns(Promise.resolve({}));
element = basicFixture.instantiate();
flush(done);
});
test('reply event', done => {
element.message = {
id: '47c43261_55aa2c41',
...createChangeMessage(),
id: '47c43261_55aa2c41' as ChangeMessageId,
author: {
_account_id: 1115495,
_account_id: 1115495 as AccountId,
name: 'Andrew Bonventre',
email: 'andybons@chromium.org',
email: 'andybons@chromium.org' as EmailAddress,
},
date: '2016-01-12 20:24:49.448000000',
date: '2016-01-12 20:24:49.448000000' as Timestamp,
message: 'Uploaded patch set 1.',
_revision_number: 1,
_revision_number: 1 as PatchSetNum,
expanded: true,
};
element.addEventListener('reply', e => {
element.addEventListener('reply', (e: CustomEvent<ReplyEventDetail>) => {
assert.deepEqual(e.detail.message, element.message);
done();
});
flush();
assert.isFalse(
element.shadowRoot.querySelector('.replyActionContainer').hidden
queryAndAssert<HTMLElement>(element, '.replyActionContainer').hidden
);
MockInteractions.tap(element.shadowRoot.querySelector('.replyBtn'));
tap(queryAndAssert(element, '.replyBtn'));
});
test('can see delete button', () => {
element.message = {
id: '47c43261_55aa2c41',
...createChangeMessage(),
id: '47c43261_55aa2c41' as ChangeMessageId,
author: {
_account_id: 1115495,
_account_id: 1115495 as AccountId,
name: 'Andrew Bonventre',
email: 'andybons@chromium.org',
email: 'andybons@chromium.org' as EmailAddress,
},
date: '2016-01-12 20:24:49.448000000',
date: '2016-01-12 20:24:49.448000000' as Timestamp,
message: 'Uploaded patch set 1.',
_revision_number: 1,
_revision_number: 1 as PatchSetNum,
expanded: true,
};
flush();
assert.isFalse(element.shadowRoot.querySelector('.deleteBtn').hidden);
assert.isFalse(queryAndAssert<HTMLElement>(element, '.deleteBtn').hidden);
});
test('delete change message', done => {
element.changeNum = 314159;
element.changeNum = 314159 as NumericChangeId;
element.message = {
id: '47c43261_55aa2c41',
...createChangeMessage(),
id: '47c43261_55aa2c41' as ChangeMessageId,
author: {
_account_id: 1115495,
_account_id: 1115495 as AccountId,
name: 'Andrew Bonventre',
email: 'andybons@chromium.org',
email: 'andybons@chromium.org' as EmailAddress,
},
date: '2016-01-12 20:24:49.448000000',
date: '2016-01-12 20:24:49.448000000' as Timestamp,
message: 'Uploaded patch set 1.',
_revision_number: 1,
_revision_number: 1 as PatchSetNum,
expanded: true,
};
element.addEventListener('change-message-deleted', e => {
assert.deepEqual(e.detail.message, element.message);
assert.isFalse(element.shadowRoot.querySelector('.deleteBtn').disabled);
done();
});
element.addEventListener(
'change-message-deleted',
(e: CustomEvent<ChangeMessageDeletedEventDetail>) => {
assert.deepEqual(e.detail.message, element.message);
assert.isFalse(
(queryAndAssert(element, '.deleteBtn') as GrButton).disabled
);
done();
}
);
flush();
MockInteractions.tap(element.shadowRoot.querySelector('.deleteBtn'));
assert.isTrue(element.shadowRoot.querySelector('.deleteBtn').disabled);
tap(queryAndAssert(element, '.deleteBtn'));
assert.isTrue(
(queryAndAssert(element, '.deleteBtn') as GrButton).disabled
);
});
test('autogenerated prefix hiding', () => {
element.message = {
tag: 'autogenerated:gerrit:test',
updated: '2016-01-12 20:24:49.448000000',
...createChangeMessage(),
tag: 'autogenerated:gerrit:test' as ReviewInputTag,
expanded: false,
};
@@ -120,8 +158,8 @@ suite('gr-message tests', () => {
test('reviewer message treated as autogenerated', () => {
element.message = {
tag: 'autogenerated:gerrit:test',
updated: '2016-01-12 20:24:49.448000000',
...createChangeMessage(),
tag: 'autogenerated:gerrit:test' as ReviewInputTag,
reviewer: {},
expanded: false,
};
@@ -136,8 +174,8 @@ suite('gr-message tests', () => {
test('batch reviewer message treated as autogenerated', () => {
element.message = {
...createChangeMessage(),
type: 'REVIEWER_UPDATE',
updated: '2016-01-12 20:24:49.448000000',
reviewer: {},
expanded: false,
};
@@ -152,8 +190,8 @@ suite('gr-message tests', () => {
test('tag that is not autogenerated prefix does not hide', () => {
element.message = {
tag: 'something',
updated: '2016-01-12 20:24:49.448000000',
...createChangeMessage(),
tag: 'something' as ReviewInputTag,
expanded: false,
};
@@ -167,6 +205,7 @@ suite('gr-message tests', () => {
test('reply button hidden unless logged in', () => {
const message = {
...createChangeMessage(),
message: 'Uploaded patch set 1.',
expanded: false,
};
@@ -176,15 +215,16 @@ suite('gr-message tests', () => {
test('_computeShowOnBehalfOf', () => {
const message = {
...createChangeMessage(),
message: '...',
expanded: false,
};
assert.isNotOk(element._computeShowOnBehalfOf(message));
message.author = {_account_id: 1115495};
message.author = {_account_id: 1115495 as AccountId};
assert.isNotOk(element._computeShowOnBehalfOf(message));
message.real_author = {_account_id: 1115495};
message.real_author = {_account_id: 1115495 as AccountId};
assert.isNotOk(element._computeShowOnBehalfOf(message));
message.real_author._account_id = 123456;
message.real_author._account_id = 123456 as AccountId;
assert.isOk(element._computeShowOnBehalfOf(message));
message.updated_by = message.author;
delete message.author;
@@ -196,39 +236,37 @@ suite('gr-message tests', () => {
['Trybot-Ready', 'Tryjob-Request', 'Commit-Queue'].forEach(label => {
test(`${label} ignored for color voting`, () => {
element.message = {
...createChangeMessage(),
author: {},
expanded: false,
message: `Patch Set 1: ${label}+1`,
};
assert.isNotOk(
element.root.querySelector('.negativeVote'));
assert.isNotOk(
element.root.querySelector('.positiveVote'));
assert.isNotOk(query(element, '.negativeVote'));
assert.isNotOk(query(element, '.positiveVote'));
});
});
test('clicking on date link fires event', () => {
element.message = {
...createChangeMessage(),
type: 'REVIEWER_UPDATE',
updated: '2016-01-12 20:24:49.448000000',
reviewer: {},
id: '47c43261_55aa2c41',
id: '47c43261_55aa2c41' as ChangeMessageId,
expanded: false,
};
flush();
const stub = sinon.stub();
element.addEventListener('message-anchor-tap', stub);
const dateEl = element.shadowRoot
.querySelector('.date');
const dateEl = queryAndAssert(element, '.date');
assert.ok(dateEl);
MockInteractions.tap(dateEl);
tap(dateEl);
assert.isTrue(stub.called);
assert.deepEqual(stub.lastCall.args[0].detail, {id: element.message.id});
});
suite('uploaded patchset X message navigates to X - 1 vs X', () => {
let navStub;
let navStub: SinonStubbedMember<typeof GerritNav.navigateToChange>;
setup(() => {
element.change = {...createChange(), revisions: createRevisions(4)};
navStub = sinon.stub(GerritNav, 'navigateToChange');
@@ -236,56 +274,98 @@ suite('gr-message tests', () => {
test('Patchset 1 navigates to Base', () => {
element.message = {
...createChangeMessage(),
message: 'Uploaded patch set 1.',
};
element._handleViewPatchsetDiff(new MouseEvent('click'));
assert.isTrue(navStub.calledWithExactly(element.change, 1,
'PARENT'));
assert.isTrue(
navStub.calledWithExactly(
element.change!,
1 as PatchSetNum,
'PARENT' as BasePatchSetNum
)
);
});
test('Patchset X navigates to X vs X - 1', () => {
element.message = {
...createChangeMessage(),
message: 'Uploaded patch set 2.',
};
element._handleViewPatchsetDiff(new MouseEvent('click'));
assert.isTrue(navStub.calledWithExactly(element.change, 2, 1));
assert.isTrue(
navStub.calledWithExactly(
element.change!,
2 as PatchSetNum,
1 as BasePatchSetNum
)
);
element.message = {
...createChangeMessage(),
message: 'Uploaded patch set 200.',
};
element._handleViewPatchsetDiff(new MouseEvent('click'));
assert.isTrue(navStub.calledWithExactly(element.change, 200, 199));
assert.isTrue(
navStub.calledWithExactly(
element.change!,
200 as PatchSetNum,
199 as BasePatchSetNum
)
);
});
test('Commit message updated', () => {
element.message = {
...createChangeMessage(),
message: 'Commit message updated.',
};
element._handleViewPatchsetDiff(new MouseEvent('click'));
assert.isTrue(navStub.calledWithExactly(element.change, 4, 3));
assert.isTrue(
navStub.calledWithExactly(
element.change!,
4 as PatchSetNum,
3 as BasePatchSetNum
)
);
});
test('Merged patchset change message', () => {
element.message = {
...createChangeMessage(),
message: 'abcd↵3 is the latest approved patch-set.↵abc',
};
element._handleViewPatchsetDiff(new MouseEvent('click'));
assert.isTrue(navStub.calledWithExactly(element.change, 4, 3));
assert.isTrue(
navStub.calledWithExactly(
element.change!,
4 as PatchSetNum,
3 as BasePatchSetNum
)
);
});
});
suite('compute messages', () => {
test('empty', () => {
assert.equal(element._computeMessageContent(true, '', ''), '');
assert.equal(element._computeMessageContent(false, '', ''), '');
assert.equal(
element._computeMessageContent(true, '', '' as ReviewInputTag),
''
);
assert.equal(
element._computeMessageContent(false, '', '' as ReviewInputTag),
''
);
});
test('new patchset', () => {
const original = 'Uploaded patch set 1.';
const tag = 'autogenerated:gerrit:newPatchSet';
const tag = 'autogenerated:gerrit:newPatchSet' as ReviewInputTag;
let actual = element._computeMessageContent(true, original, tag);
assert.equal(actual, element._computeMessageContentCollapsed(
original, tag, []));
assert.equal(
actual,
element._computeMessageContentCollapsed(original, tag, [])
);
assert.equal(actual, original);
actual = element._computeMessageContent(false, original, tag);
assert.equal(actual, original);
@@ -293,12 +373,14 @@ suite('gr-message tests', () => {
test('new patchset rebased', () => {
const original = 'Patch Set 27: Patch Set 26 was rebased';
const tag = 'autogenerated:gerrit:newPatchSet';
const tag = 'autogenerated:gerrit:newPatchSet' as ReviewInputTag;
const expected = 'Patch Set 26 was rebased';
let actual = element._computeMessageContent(true, original, tag);
assert.equal(actual, expected);
assert.equal(actual, element._computeMessageContentCollapsed(
original, tag, []));
assert.equal(
actual,
element._computeMessageContentCollapsed(original, tag, [])
);
actual = element._computeMessageContent(false, original, tag);
assert.equal(actual, expected);
});
@@ -309,8 +391,10 @@ suite('gr-message tests', () => {
const expected = 'This change is ready for review.';
let actual = element._computeMessageContent(true, original, tag);
assert.equal(actual, expected);
assert.equal(actual, element._computeMessageContentCollapsed(
original, tag, []));
assert.equal(
actual,
element._computeMessageContentCollapsed(original, tag, [])
);
actual = element._computeMessageContent(false, original, tag);
assert.equal(actual, expected);
});
@@ -338,17 +422,18 @@ suite('gr-message tests', () => {
test('votes', () => {
element.message = {
...createChangeMessage(),
author: {},
expanded: false,
message: 'Patch Set 1: Verified+1 Code-Review-2 Trybot-Label3+1 Blub+1',
};
element.labelExtremes = {
'Verified': {max: 1, min: -1},
Verified: {max: 1, min: -1},
'Code-Review': {max: 2, min: -2},
'Trybot-Label3': {max: 3, min: 0},
};
flush();
const scoreChips = element.root.querySelectorAll('.score');
const scoreChips = queryAll(element, '.score');
assert.equal(scoreChips.length, 3);
assert.isTrue(scoreChips[0].classList.contains('positive'));
@@ -363,18 +448,20 @@ suite('gr-message tests', () => {
test('Uploaded patch set X', () => {
element.message = {
...createChangeMessage(),
author: {},
expanded: false,
message: 'Uploaded patch set 1:' +
'Verified+1 Code-Review-2 Trybot-Label3+1 Blub+1',
message:
'Uploaded patch set 1:' +
'Verified+1 Code-Review-2 Trybot-Label3+1 Blub+1',
};
element.labelExtremes = {
'Verified': {max: 1, min: -1},
Verified: {max: 1, min: -1},
'Code-Review': {max: 2, min: -2},
'Trybot-Label3': {max: 3, min: 0},
};
flush();
const scoreChips = element.root.querySelectorAll('.score');
const scoreChips = queryAll(element, '.score');
assert.equal(scoreChips.length, 3);
assert.isTrue(scoreChips[0].classList.contains('positive'));
@@ -389,17 +476,18 @@ suite('gr-message tests', () => {
test('removed votes', () => {
element.message = {
...createChangeMessage(),
author: {},
expanded: false,
message: 'Patch Set 1: Verified+1 -Code-Review -Commit-Queue',
};
element.labelExtremes = {
'Verified': {max: 1, min: -1},
Verified: {max: 1, min: -1},
'Code-Review': {max: 2, min: -2},
'Commit-Queue': {max: 3, min: 0},
};
flush();
const scoreChips = element.root.querySelectorAll('.score');
const scoreChips = queryAll(element, '.score');
assert.equal(scoreChips.length, 3);
assert.isTrue(scoreChips[1].classList.contains('removed'));
@@ -408,12 +496,13 @@ suite('gr-message tests', () => {
test('false negative vote', () => {
element.message = {
...createChangeMessage(),
author: {},
expanded: false,
message: 'Patch Set 1: Cherry Picked from branch stable-2.14.',
};
element.labelExtremes = {};
const scoreChips = element.root.querySelectorAll('.score');
const scoreChips = element.root!.querySelectorAll('.score');
assert.equal(scoreChips.length, 0);
});
});
@@ -421,92 +510,109 @@ suite('gr-message tests', () => {
suite('when not logged in', () => {
setup(done => {
stubRestApi('getLoggedIn').returns(Promise.resolve(false));
stubRestApi('getPreferences').returns(Promise.resolve({}));
stubRestApi('getIsAdmin').returns(Promise.resolve(false));
stubRestApi('deleteChangeCommitMessage').returns(Promise.resolve({}));
element = basicFixture.instantiate();
flush(done);
});
test('reply and delete button should be hidden', () => {
element.message = {
id: '47c43261_55aa2c41',
...createChangeMessage(),
id: '47c43261_55aa2c41' as ChangeMessageId,
author: {
_account_id: 1115495,
_account_id: 1115495 as AccountId,
name: 'Andrew Bonventre',
email: 'andybons@chromium.org',
email: 'andybons@chromium.org' as EmailAddress,
},
date: '2016-01-12 20:24:49.448000000',
date: '2016-01-12 20:24:49.448000000' as Timestamp,
message: 'Uploaded patch set 1.',
_revision_number: 1,
_revision_number: 1 as PatchSetNum,
expanded: true,
};
flush();
assert.isTrue(
element.shadowRoot.querySelector('.replyActionContainer').hidden
);
assert.isTrue(
element.shadowRoot.querySelector('.deleteBtn').hidden
queryAndAssert<HTMLElement>(element, '.replyActionContainer').hidden
);
assert.isTrue(queryAndAssert<HTMLElement>(element, '.deleteBtn').hidden);
});
});
suite('patchset comment summary', () => {
setup(() => {
element = basicFixture.instantiate();
element.message = {id: '6a07f64a82f96e7337ca5f7f84cfc73abf8ac2a3'};
element.message = {
...createChangeMessage(),
id: '6a07f64a82f96e7337ca5f7f84cfc73abf8ac2a3' as ChangeMessageId,
};
});
test('single patchset comment posted', () => {
const threads = [{
comments: [{
change_message_id: '6a07f64a82f96e7337ca5f7f84cfc73abf8ac2a3',
patch_set: 1,
id: 'e365b138_bed65caa',
updated: '2020-05-15 13:35:56.000000000',
message: 'testing the load',
unresolved: false,
const threads = [
{
comments: [
{
...createComment(),
change_message_id: '6a07f64a82f96e7337ca5f7f84cfc73abf8ac2a3' as ChangeMessageId,
patch_set: 1 as PatchSetNum,
id: 'e365b138_bed65caa' as UrlEncodedCommentId,
updated: '2020-05-15 13:35:56.000000000' as Timestamp,
message: 'testing the load',
unresolved: false,
path: '/PATCHSET_LEVEL',
collapsed: false,
},
],
patchNum: 1 as PatchSetNum,
path: '/PATCHSET_LEVEL',
collapsed: false,
}],
patchNum: 1,
path: '/PATCHSET_LEVEL',
rootId: 'e365b138_bed65caa',
}];
assert.equal(element._computeMessageContentCollapsed(
'', undefined, threads), 'testing the load');
rootId: 'e365b138_bed65caa' as UrlEncodedCommentId,
commentSide: CommentSide.REVISION,
},
];
assert.equal(
element._computeMessageContentCollapsed('', undefined, threads),
'testing the load'
);
assert.equal(element._computeMessageContent(false, '', undefined), '');
});
test('single patchset comment with reply', () => {
const threads = [{
comments: [{
patch_set: 1,
id: 'e365b138_bed65caa',
updated: '2020-05-15 13:35:56.000000000',
message: 'testing the load',
unresolved: false,
const threads = [
{
comments: [
{
...createComment(),
patch_set: 1 as PatchSetNum,
id: 'e365b138_bed65caa' as UrlEncodedCommentId,
updated: '2020-05-15 13:35:56.000000000' as Timestamp,
message: 'testing the load',
unresolved: false,
path: '/PATCHSET_LEVEL',
collapsed: false,
},
{
change_message_id: '6a07f64a82f96e7337ca5f7f84cfc73abf8ac2a3',
patch_set: 1 as PatchSetNum,
id: 'd6efcc85_4cbbb6f4' as UrlEncodedCommentId,
in_reply_to: 'e365b138_bed65caa' as UrlEncodedCommentId,
updated: '2020-05-15 16:55:28.000000000' as Timestamp,
message: 'n',
unresolved: false,
path: '/PATCHSET_LEVEL',
__draft: true,
collapsed: true,
},
],
patchNum: 1 as PatchSetNum,
path: '/PATCHSET_LEVEL',
collapsed: false,
}, {
change_message_id: '6a07f64a82f96e7337ca5f7f84cfc73abf8ac2a3',
patch_set: 1,
id: 'd6efcc85_4cbbb6f4',
in_reply_to: 'e365b138_bed65caa',
updated: '2020-05-15 16:55:28.000000000',
message: 'n',
unresolved: false,
path: '/PATCHSET_LEVEL',
__draft: true,
collapsed: true,
}],
patchNum: 1,
path: '/PATCHSET_LEVEL',
rootId: 'e365b138_bed65caa',
}];
assert.equal(element._computeMessageContentCollapsed(
'', undefined, threads), 'n');
rootId: 'e365b138_bed65caa' as UrlEncodedCommentId,
commentSide: CommentSide.REVISION,
},
];
assert.equal(
element._computeMessageContentCollapsed('', undefined, threads),
'n'
);
assert.equal(element._computeMessageContent(false, '', undefined), '');
});
});
@@ -514,59 +620,57 @@ suite('gr-message tests', () => {
suite('when logged in but not admin', () => {
setup(async () => {
stubRestApi('getIsAdmin').returns(Promise.resolve(false));
stubRestApi('deleteChangeCommitMessage').returns(Promise.resolve({}));
element = basicFixture.instantiate();
await flush();
});
test('can see reply but not delete button', () => {
element.message = {
id: '47c43261_55aa2c41',
...createChangeMessage(),
id: '47c43261_55aa2c41' as ChangeMessageId,
author: {
_account_id: 1115495,
_account_id: 1115495 as AccountId,
name: 'Andrew Bonventre',
email: 'andybons@chromium.org',
email: 'andybons@chromium.org' as EmailAddress,
},
date: '2016-01-12 20:24:49.448000000',
date: '2016-01-12 20:24:49.448000000' as Timestamp,
message: 'Uploaded patch set 1.',
_revision_number: 1,
_revision_number: 1 as PatchSetNum,
expanded: true,
};
flush();
assert.isFalse(
element.shadowRoot.querySelector('.replyActionContainer').hidden
);
assert.isTrue(
element.shadowRoot.querySelector('.deleteBtn').hidden
queryAndAssert<HTMLElement>(element, '.replyActionContainer').hidden
);
assert.isTrue(queryAndAssert<HTMLElement>(element, '.deleteBtn').hidden);
});
test('reply button shown when message is updated', () => {
element.message = undefined;
flush();
let replyEl = element.shadowRoot.querySelector('.replyActionContainer');
let replyEl = query(element, '.replyActionContainer');
// We don't even expect the button to show up in the DOM when the message
// is undefined.
assert.isNotOk(replyEl);
element.message = {
id: '47c43261_55aa2c41',
...createChangeMessage(),
id: '47c43261_55aa2c41' as ChangeMessageId,
author: {
_account_id: 1115495,
_account_id: 1115495 as AccountId,
name: 'Andrew Bonventre',
email: 'andybons@chromium.org',
email: 'andybons@chromium.org' as EmailAddress,
},
date: '2016-01-12 20:24:49.448000000',
date: '2016-01-12 20:24:49.448000000' as Timestamp,
message: 'not empty',
_revision_number: 1,
_revision_number: 1 as PatchSetNum,
expanded: true,
};
flush();
replyEl = element.shadowRoot.querySelector('.replyActionContainer');
replyEl = queryAndAssert(element, '.replyActionContainer');
assert.isOk(replyEl);
assert.isFalse(replyEl.hidden);
assert.isFalse((replyEl as HTMLElement).hidden);
});
});
});

View File

@@ -92,6 +92,7 @@ import {UIComment, UIDraft, createCommentThreads} from '../utils/comment-util';
import {GerritView} from '../services/router/router-model';
import {ChangeComments} from '../elements/diff/gr-comment-api/gr-comment-api';
import {EditRevisionInfo, ParsedChangeInfo} from '../types/types';
import {ChangeMessage} from '../elements/change/gr-message/gr-message';
export function dateToTimestamp(date: Date): Timestamp {
const nanosecondSuffix = '.000000000';
@@ -231,7 +232,7 @@ export function createEditRevision(): EditRevisionInfo {
};
}
export function createChangeMessage(id = 'cm_id_1'): ChangeMessageInfo {
export function createChangeMessageInfo(id = 'cm_id_1'): ChangeMessageInfo {
return {
id: id as ChangeMessageId,
date: dateToTimestamp(TEST_CHANGE_CREATED),
@@ -239,6 +240,15 @@ export function createChangeMessage(id = 'cm_id_1'): ChangeMessageInfo {
};
}
export function createChangeMessage(id = 'cm_id_1'): ChangeMessage {
return {
...createChangeMessageInfo(id),
type: '',
expanded: false,
commentThreads: [],
};
}
export function createRevisions(
count: number
): {[revisionId: string]: RevisionInfo} {
@@ -270,7 +280,7 @@ export function createChangeMessages(count: number): ChangeMessageInfo[] {
const messageDate = TEST_CHANGE_CREATED;
for (let i = 0; i < count; i++) {
messages.push({
...createChangeMessage((i + messageIdStart).toString(16)),
...createChangeMessageInfo((i + messageIdStart).toString(16)),
date: dateToTimestamp(messageDate),
});
messageDate.setDate(messageDate.getDate() + 1);

View File

@@ -20,6 +20,7 @@ import {UIComment} from '../utils/comment-util';
import {FetchRequest} from './types';
import {MovedLinkClickedEventDetail} from '../api/diff';
import {Category, RunStatus} from '../api/checks';
import {ChangeMessage} from '../elements/change/gr-message/gr-message';
export interface TitleChangeEventDetail {
title: string;
@@ -33,6 +34,32 @@ declare global {
}
}
export interface ChangeMessageDeletedEventDetail {
message: ChangeMessage;
}
export type ChangeMessageDeletedEvent = CustomEvent<
ChangeMessageDeletedEventDetail
>;
declare global {
interface HTMLElementEventMap {
'change-message-deleted': ChangeMessageDeletedEvent;
}
}
export interface ReplyEventDetail {
message: ChangeMessage;
}
export type ReplyEvent = CustomEvent<ReplyEventDetail>;
declare global {
interface HTMLElementEventMap {
reply: ReplyEvent;
}
}
export interface PageErrorEventDetail {
response: Response;
}