]> source.dussan.org Git - sonarqube.git/blob
76fb05d7c184ee68f41c1f18c275c06d29a890c9
[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 { mount, shallow } from 'enzyme';
21 import { range } from 'lodash';
22 import * as React from 'react';
23 import { scrollHorizontally } from '../../../../helpers/scrolling';
24 import { mockIssue, mockSourceLine, mockSourceViewerFile } from '../../../../helpers/testMocks';
25 import SnippetViewer from '../SnippetViewer';
26
27 jest.mock('../../../../helpers/scrolling', () => ({
28   scrollHorizontally: jest.fn()
29 }));
30
31 beforeEach(() => {
32   jest.clearAllMocks();
33 });
34
35 it('should render correctly', () => {
36   const snippet = range(5, 8).map(line => mockSourceLine({ line }));
37   const wrapper = shallowRender({
38     snippet
39   });
40
41   expect(wrapper).toMatchSnapshot();
42 });
43
44 it('should render correctly with no SCM', () => {
45   const snippet = range(5, 8).map(line => mockSourceLine({ line }));
46   const wrapper = shallowRender({
47     displaySCM: false,
48     snippet
49   });
50
51   expect(wrapper).toMatchSnapshot();
52 });
53
54 it('should render additional child in line', () => {
55   const sourceline = mockSourceLine({ line: 42 });
56
57   const child = <div>child</div>;
58   const renderAdditionalChildInLine = jest.fn().mockReturnValue(child);
59   const wrapper = shallowRender({ renderAdditionalChildInLine, snippet: [sourceline] });
60
61   wrapper.instance().renderLine({
62     displayDuplications: false,
63     index: 1,
64     issuesForLine: [],
65     issueLocations: [],
66     line: sourceline,
67     snippet: [sourceline],
68     symbols: [],
69     verticalBuffer: 5
70   });
71
72   expect(renderAdditionalChildInLine).toBeCalledWith(sourceline);
73 });
74
75 it('should render correctly when at the top of the file', () => {
76   const snippet = range(1, 8).map(line => mockSourceLine({ line }));
77   const wrapper = shallowRender({
78     snippet
79   });
80
81   expect(wrapper).toMatchSnapshot();
82 });
83
84 it('should render correctly when at the bottom of the file', () => {
85   const component = mockSourceViewerFile({ measures: { lines: '14' } });
86   const snippet = range(10, 14).map(line => mockSourceLine({ line }));
87   const wrapper = shallowRender({
88     component,
89     snippet
90   });
91
92   expect(wrapper).toMatchSnapshot();
93 });
94
95 it('should correctly handle expansion', () => {
96   const snippet = range(5, 8).map(line => mockSourceLine({ line }));
97   const expandBlock = jest.fn(() => Promise.resolve());
98
99   const wrapper = shallowRender({
100     expandBlock,
101     index: 2,
102     snippet
103   });
104
105   wrapper
106     .find('.expand-block-above button')
107     .first()
108     .simulate('click');
109   expect(expandBlock).toHaveBeenCalledWith(2, 'up');
110
111   wrapper
112     .find('.expand-block-below button')
113     .first()
114     .simulate('click');
115   expect(expandBlock).toHaveBeenCalledWith(2, 'down');
116 });
117
118 it('should handle scrolling', () => {
119   const scroll = jest.fn();
120   const wrapper = mountRender({ scroll });
121
122   const element = {} as HTMLElement;
123
124   wrapper.instance().doScroll(element);
125
126   expect(scroll).toHaveBeenCalledWith(element);
127
128   expect(scrollHorizontally).toHaveBeenCalled();
129   expect((scrollHorizontally as jest.Mock).mock.calls[0][0]).toBe(element);
130 });
131
132 it('should handle scrolling to expanded row', () => {
133   const scroll = jest.fn();
134   const wrapper = mountRender({ scroll });
135
136   wrapper.instance().scrollToLastExpandedRow();
137
138   expect(scroll).toHaveBeenCalled();
139 });
140
141 function shallowRender(props: Partial<SnippetViewer['props']> = {}) {
142   return shallow<SnippetViewer>(
143     <SnippetViewer
144       component={mockSourceViewerFile()}
145       duplications={undefined}
146       duplicationsByLine={undefined}
147       expandBlock={jest.fn()}
148       handleCloseIssues={jest.fn()}
149       handleOpenIssues={jest.fn()}
150       handleSymbolClick={jest.fn()}
151       highlightedLocationMessage={{ index: 0, text: '' }}
152       highlightedSymbols={[]}
153       index={0}
154       issue={mockIssue()}
155       issuesByLine={{}}
156       lastSnippetOfLastGroup={false}
157       loadDuplications={jest.fn()}
158       locations={[]}
159       locationsByLine={{}}
160       onLocationSelect={jest.fn()}
161       openIssuesByLine={{}}
162       renderDuplicationPopup={jest.fn()}
163       scroll={jest.fn()}
164       snippet={[]}
165       {...props}
166     />
167   );
168 }
169
170 function mountRender(props: Partial<SnippetViewer['props']> = {}) {
171   return mount<SnippetViewer>(
172     <SnippetViewer
173       component={mockSourceViewerFile()}
174       duplications={undefined}
175       duplicationsByLine={undefined}
176       expandBlock={jest.fn()}
177       handleCloseIssues={jest.fn()}
178       handleOpenIssues={jest.fn()}
179       handleSymbolClick={jest.fn()}
180       highlightedLocationMessage={{ index: 0, text: '' }}
181       highlightedSymbols={[]}
182       index={0}
183       issue={mockIssue()}
184       issuesByLine={{}}
185       lastSnippetOfLastGroup={false}
186       loadDuplications={jest.fn()}
187       locations={[]}
188       locationsByLine={{}}
189       onLocationSelect={jest.fn()}
190       openIssuesByLine={{}}
191       renderDuplicationPopup={jest.fn()}
192       scroll={jest.fn()}
193       snippet={[mockSourceLine()]}
194       {...props}
195     />
196   );
197 }