]> source.dussan.org Git - sonarqube.git/blob
2c23e81c308d5ae2d0ecc1b284d08039cdddd0e3
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2022 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 import { shallow } from 'enzyme';
21 import React from 'react';
22 import { Button, EditButton } from '../../../../components/controls/buttons';
23 import Dropdown, { DropdownOverlay } from '../../../../components/controls/Dropdown';
24 import Toggler from '../../../../components/controls/Toggler';
25 import { mockIssueChangelog } from '../../../../helpers/mocks/issues';
26 import { mockHotspot, mockHotspotComment } from '../../../../helpers/mocks/security-hotspots';
27 import { mockUser } from '../../../../helpers/testMocks';
28 import HotspotCommentPopup from '../HotspotCommentPopup';
29 import HotspotReviewHistory, { HotspotReviewHistoryProps } from '../HotspotReviewHistory';
30
31 it('should render correctly', () => {
32   expect(shallowRender()).toMatchSnapshot('default');
33   expect(shallowRender({ showFullHistory: true })).toMatchSnapshot('show full list');
34   expect(
35     shallowRender({ showFullHistory: true })
36       .find(Toggler)
37       .props().overlay
38   ).toMatchSnapshot('edit comment overlay');
39   expect(
40     shallowRender({ showFullHistory: true })
41       .find(Dropdown)
42       .props().overlay
43   ).toMatchSnapshot('delete comment overlay');
44 });
45
46 it('should correctly handle comment updating', () => {
47   return new Promise<void>((resolve, reject) => {
48     const setEditedCommentKey = jest.fn();
49     jest.spyOn(React, 'useState').mockImplementationOnce(() => ['', setEditedCommentKey]);
50
51     const onEditComment = jest.fn();
52     const wrapper = shallowRender({ onEditComment, showFullHistory: true });
53
54     // Closing the Toggler sets the edited key back to an empty string.
55     wrapper
56       .find(Toggler)
57       .at(0)
58       .props()
59       .onRequestClose();
60     expect(setEditedCommentKey).toBeCalledWith('');
61
62     const editOnClick = wrapper
63       .find(EditButton)
64       .at(0)
65       .props().onClick;
66     if (!editOnClick) {
67       reject();
68       return;
69     }
70
71     // Clicking on the EditButton correctly flags the comment for editing.
72     editOnClick();
73     expect(setEditedCommentKey).toHaveBeenLastCalledWith('comment-1');
74
75     // Cancelling an edit sets the edited key back to an empty string
76     const dropdownOverlay = shallow(
77       wrapper
78         .find(Toggler)
79         .at(0)
80         .props().overlay as React.ReactElement<DropdownOverlay>
81     );
82     dropdownOverlay
83       .find(HotspotCommentPopup)
84       .props()
85       .onCancelEdit();
86     expect(setEditedCommentKey).toHaveBeenLastCalledWith('');
87
88     // Updating the comment sets the edited key back to an empty string, and calls the
89     // prop to update the comment value.
90     dropdownOverlay
91       .find(HotspotCommentPopup)
92       .props()
93       .onCommentEditSubmit('comment');
94     expect(onEditComment).toHaveBeenLastCalledWith('comment-1', 'comment');
95     expect(setEditedCommentKey).toHaveBeenLastCalledWith('');
96     expect(setEditedCommentKey).toHaveBeenCalledTimes(4);
97
98     resolve();
99   });
100 });
101
102 it('should correctly handle comment deleting', () => {
103   return new Promise<void>((resolve, reject) => {
104     const setEditedCommentKey = jest.fn();
105     jest.spyOn(React, 'useState').mockImplementationOnce(() => ['', setEditedCommentKey]);
106
107     const onDeleteComment = jest.fn();
108     const wrapper = shallowRender({ onDeleteComment, showFullHistory: true });
109
110     // Opening the deletion Dropdown sets the edited key back to an empty string.
111     const dropdownOnOpen = wrapper
112       .find(Dropdown)
113       .at(0)
114       .props().onOpen;
115     if (!dropdownOnOpen) {
116       reject();
117       return;
118     }
119     dropdownOnOpen();
120     expect(setEditedCommentKey).toHaveBeenLastCalledWith('');
121
122     // Confirming deletion calls the prop to delete the comment.
123     const dropdownOverlay = shallow(
124       wrapper
125         .find(Dropdown)
126         .at(0)
127         .props().overlay as React.ReactElement<HTMLDivElement>
128     );
129     const deleteButtonOnClick = dropdownOverlay.find(Button).props().onClick;
130     if (!deleteButtonOnClick) {
131       reject();
132       return;
133     }
134
135     deleteButtonOnClick();
136     expect(onDeleteComment).toBeCalledWith('comment-1');
137
138     resolve();
139   });
140 });
141
142 function shallowRender(props?: Partial<HotspotReviewHistoryProps>) {
143   return shallow(
144     <HotspotReviewHistory
145       hotspot={mockHotspot({
146         creationDate: '2018-09-01',
147         changelog: [
148           mockIssueChangelog(),
149           mockIssueChangelog({
150             creationDate: '2018-10-12'
151           })
152         ],
153         comment: [
154           mockHotspotComment({
155             key: 'comment-1',
156             updatable: true
157           }),
158           mockHotspotComment({ key: 'comment-2', user: mockUser({ name: undefined }) }),
159           mockHotspotComment({ key: 'comment-3', user: mockUser({ active: false }) }),
160           mockHotspotComment({ key: 'comment-4' }),
161           mockHotspotComment({ key: 'comment-5' })
162         ]
163       })}
164       onDeleteComment={jest.fn()}
165       onEditComment={jest.fn()}
166       onShowFullHistory={jest.fn()}
167       showFullHistory={false}
168       {...props}
169     />
170   );
171 }