blob: 25e3e51ed0c65b1b95dc323caf70f8f18f22ea2b [file] [log] [blame]
paladox88aca972022-03-09 21:51:23 +00001/**
2 * @license
Ben Rohlfs94fcbbc2022-05-27 10:45:03 +02003 * Copyright 2020 Google LLC
4 * SPDX-License-Identifier: Apache-2.0
paladox88aca972022-03-09 21:51:23 +00005 */
Frank Bordenbe9451a2022-09-12 15:44:29 +02006import '../../../test/common-test-setup';
paladox88aca972022-03-09 21:51:23 +00007import './gr-reply-dialog';
8import {
9 queryAndAssert,
paladox88aca972022-03-09 21:51:23 +000010 stubRestApi,
Frank Borden7b24f732022-09-12 14:29:32 +020011 waitEventLoop,
paladox88aca972022-03-09 21:51:23 +000012} from '../../../test/test-utils';
Chris Poucet2f6c0172022-10-25 07:00:53 +020013
paladox88aca972022-03-09 21:51:23 +000014import {GrReplyDialog} from './gr-reply-dialog';
Frank Bordene1ba8212022-08-29 15:20:01 +020015import {fixture, html, assert} from '@open-wc/testing';
paladox88aca972022-03-09 21:51:23 +000016import {
17 AccountId,
18 NumericChangeId,
19 PatchSetNum,
20 Timestamp,
21} from '../../../types/common';
paladox88aca972022-03-09 21:51:23 +000022import {createChange} from '../../../test/test-data-generators';
Frank Borden5ebe7bb2022-08-29 17:09:35 +020023import {GrButton} from '../../shared/gr-button/gr-button';
Chris Poucete3d66862022-10-26 11:19:50 +020024import {testResolver} from '../../../test/common-test-setup';
25import {pluginLoaderToken} from '../../shared/gr-js-api-interface/gr-plugin-loader';
paladox88aca972022-03-09 21:51:23 +000026
paladox88aca972022-03-09 21:51:23 +000027suite('gr-reply-dialog-it tests', () => {
28 let element: GrReplyDialog;
29 let changeNum: NumericChangeId;
30 let patchNum: PatchSetNum;
31
32 const setupElement = (element: GrReplyDialog) => {
33 element.change = {
34 ...createChange(),
35 _number: changeNum,
36 labels: {
37 Verified: {
38 values: {
39 '-1': 'Fails',
40 ' 0': 'No score',
41 '+1': 'Verified',
42 },
43 default_value: 0,
44 },
45 'Code-Review': {
46 values: {
47 '-2': 'This shall not be submitted',
48 '-1': 'I would prefer this is not submitted as is',
49 ' 0': 'No score',
50 '+1': 'Looks good to me, but someone else must approve',
51 '+2': 'Looks good to me, approved',
52 },
53 all: [{_account_id: 42 as AccountId, value: 0}],
54 default_value: 0,
55 },
56 },
57 };
58 element.patchNum = patchNum;
59 element.permittedLabels = {
60 'Code-Review': ['-1', ' 0', '+1'],
61 Verified: ['-1', ' 0', '+1'],
62 };
63 };
64
65 setup(async () => {
66 changeNum = 42 as NumericChangeId;
67 patchNum = 1 as PatchSetNum;
68
69 stubRestApi('getAccount').returns(
70 Promise.resolve({
71 _account_id: 42 as AccountId,
72 registered_on: '' as Timestamp,
73 })
74 );
75
76 element = await fixture<GrReplyDialog>(html`
77 <gr-reply-dialog></gr-reply-dialog>
78 `);
79 setupElement(element);
Dhruv80dd5ee2022-04-06 13:34:02 +020080
81 await element.updateComplete;
paladox88aca972022-03-09 21:51:23 +000082 });
83
Frank Borden7b24f732022-09-12 14:29:32 +020084 test('submit blocked when invalid email is supplied to ccs', async () => {
paladox88aca972022-03-09 21:51:23 +000085 const sendStub = sinon.stub(element, 'send').returns(Promise.resolve());
86
Dhruv80dd5ee2022-04-06 13:34:02 +020087 element.ccsList!.entry!.setText('test');
Frank Borden5ebe7bb2022-08-29 17:09:35 +020088 queryAndAssert<GrButton>(element, 'gr-button.send').click();
Dhruv80dd5ee2022-04-06 13:34:02 +020089 assert.isFalse(element.ccsList!.submitEntryText());
paladox88aca972022-03-09 21:51:23 +000090 assert.isFalse(sendStub.called);
Frank Borden7b24f732022-09-12 14:29:32 +020091 await waitEventLoop();
paladox88aca972022-03-09 21:51:23 +000092
Dhruv80dd5ee2022-04-06 13:34:02 +020093 element.ccsList!.entry!.setText('test@test.test');
Frank Borden5ebe7bb2022-08-29 17:09:35 +020094 queryAndAssert<GrButton>(element, 'gr-button.send').click();
paladox88aca972022-03-09 21:51:23 +000095 assert.isTrue(sendStub.called);
96 });
97
98 test('lgtm plugin', async () => {
paladox88aca972022-03-09 21:51:23 +000099 window.Gerrit.install(
100 plugin => {
101 const replyApi = plugin.changeReply();
102 replyApi.addReplyTextChangedCallback(text => {
103 const label = 'Code-Review';
104 const labelValue = replyApi.getLabelValue(label);
105 if (labelValue && labelValue === ' 0' && text.indexOf('LGTM') === 0) {
106 replyApi.setLabelValue(label, '+1');
107 }
108 });
109 },
110 undefined,
111 'http://test.com/plugins/lgtm.js'
112 );
Frank Bordendedd6712022-08-22 10:56:11 +0200113 element = await fixture(html`<gr-reply-dialog></gr-reply-dialog>`);
paladox88aca972022-03-09 21:51:23 +0000114 setupElement(element);
Chris Poucete3d66862022-10-26 11:19:50 +0200115 const pluginLoader = testResolver(pluginLoaderToken);
Chris Poucet2f6c0172022-10-25 07:00:53 +0200116 pluginLoader.loadPlugins([]);
117 await pluginLoader.awaitPluginsLoaded();
Frank Borden7b24f732022-09-12 14:29:32 +0200118 await waitEventLoop();
Frank Borden7b24f732022-09-12 14:29:32 +0200119 await waitEventLoop();
paladox88aca972022-03-09 21:51:23 +0000120 const labelScoreRows = queryAndAssert(
121 element.getLabelScores(),
122 'gr-label-score-row[name="Code-Review"]'
123 );
124 const selectedBtn = queryAndAssert(
125 labelScoreRows,
126 'gr-button[data-value="+1"]'
127 );
128 assert.isOk(selectedBtn);
129 });
130});