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