]> source.dussan.org Git - sonarqube.git/blob
bc2e28020796c45cc7706d79a8ce1d51eafe0e42
[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 * as React from 'react';
22 import { getDuplications } from '../../../../api/components';
23 import { getIssueFlowSnippets } from '../../../../api/issues';
24 import {
25   mockFlowLocation,
26   mockIssue,
27   mockSnippetsByComponent,
28   mockSourceLine,
29   mockSourceViewerFile
30 } from '../../../../helpers/testMocks';
31 import { waitAndUpdate } from '../../../../helpers/testUtils';
32 import CrossComponentSourceViewerWrapper from '../CrossComponentSourceViewerWrapper';
33
34 jest.mock('../../../../api/issues', () => {
35   const { mockSnippetsByComponent } = jest.requireActual('../../../../helpers/testMocks');
36   return {
37     getIssueFlowSnippets: jest.fn().mockResolvedValue({ 'main.js': mockSnippetsByComponent() })
38   };
39 });
40
41 jest.mock('../../../../api/components', () => ({
42   getDuplications: jest.fn().mockResolvedValue({}),
43   getComponentForSourceViewer: jest.fn().mockResolvedValue({})
44 }));
45
46 beforeEach(() => {
47   jest.clearAllMocks();
48 });
49
50 it('should render correctly', async () => {
51   let wrapper = shallowRender();
52   expect(wrapper).toMatchSnapshot();
53
54   await waitAndUpdate(wrapper);
55   expect(wrapper).toMatchSnapshot();
56
57   wrapper = shallowRender({ issue: mockIssue(true, { component: 'test.js', key: 'unknown' }) });
58   await waitAndUpdate(wrapper);
59
60   expect(wrapper).toMatchSnapshot('no component found');
61 });
62
63 it('Should fetch data', async () => {
64   const wrapper = shallowRender();
65   wrapper.instance().fetchIssueFlowSnippets();
66   await waitAndUpdate(wrapper);
67   expect(getIssueFlowSnippets).toHaveBeenCalledWith('1');
68   expect(wrapper.state('components')).toEqual(
69     expect.objectContaining({ 'main.js': mockSnippetsByComponent() })
70   );
71
72   (getIssueFlowSnippets as jest.Mock).mockClear();
73   wrapper.setProps({ issue: mockIssue(true, { key: 'foo' }) });
74   expect(getIssueFlowSnippets).toBeCalledWith('foo');
75 });
76
77 it('Should handle no access rights', async () => {
78   (getIssueFlowSnippets as jest.Mock).mockRejectedValueOnce({ status: 403 });
79
80   const wrapper = shallowRender();
81   await waitAndUpdate(wrapper);
82
83   expect(wrapper.state().notAccessible).toBe(true);
84   expect(wrapper).toMatchSnapshot();
85 });
86
87 it('should handle issue popup', () => {
88   const wrapper = shallowRender();
89   // open
90   wrapper.instance().handleIssuePopupToggle('1', 'popup1');
91   expect(wrapper.state('issuePopup')).toEqual({ issue: '1', name: 'popup1' });
92
93   // close
94   wrapper.instance().handleIssuePopupToggle('1', 'popup1');
95   expect(wrapper.state('issuePopup')).toBeUndefined();
96 });
97
98 it('should handle duplication popup', async () => {
99   const files = { b: { key: 'b', name: 'B.tsx', project: 'foo', projectName: 'Foo' } };
100   const duplications = [{ blocks: [{ _ref: '1', from: 1, size: 2 }] }];
101   (getDuplications as jest.Mock).mockResolvedValueOnce({ duplications, files });
102
103   const wrapper = shallowRender();
104   await waitAndUpdate(wrapper);
105
106   wrapper.find('ComponentSourceSnippetGroupViewer').prop<Function>('loadDuplications')(
107     'foo',
108     mockSourceLine()
109   );
110
111   await waitAndUpdate(wrapper);
112   expect(getDuplications).toHaveBeenCalledWith({ key: 'foo' });
113   expect(wrapper.state('duplicatedFiles')).toEqual(files);
114   expect(wrapper.state('duplications')).toEqual(duplications);
115   expect(wrapper.state('duplicationsByLine')).toEqual({ '1': [0], '2': [0] });
116
117   expect(
118     wrapper.find('ComponentSourceSnippetGroupViewer').prop<Function>('renderDuplicationPopup')(
119       mockSourceViewerFile(),
120       0,
121       16
122     )
123   ).toMatchSnapshot();
124 });
125
126 function shallowRender(props: Partial<CrossComponentSourceViewerWrapper['props']> = {}) {
127   return shallow<CrossComponentSourceViewerWrapper>(
128     <CrossComponentSourceViewerWrapper
129       branchLike={undefined}
130       highlightedLocationMessage={undefined}
131       issue={mockIssue(true, { key: '1' })}
132       issues={[]}
133       locations={[mockFlowLocation()]}
134       onIssueChange={jest.fn()}
135       onLoaded={jest.fn()}
136       onLocationSelect={jest.fn()}
137       scroll={jest.fn()}
138       selectedFlowIndex={0}
139       {...props}
140     />
141   );
142 }