]> source.dussan.org Git - sonarqube.git/blob
bb74b018308f1f3d1e6d743365cd8da0d14fc4bf
[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 { changeEvent, createEvent } from '../../../../api/projectActivity';
23 import { mockComponent } from '../../../../helpers/mocks/component';
24 import {
25   mockAnalysisEvent,
26   mockLocation,
27   mockMetric,
28   mockRouter
29 } from '../../../../helpers/testMocks';
30 import { waitAndUpdate } from '../../../../helpers/testUtils';
31 import { ComponentQualifier } from '../../../../types/component';
32 import { MetricKey } from '../../../../types/metrics';
33 import { ProjectActivityAppContainer } from '../ProjectActivityAppContainer';
34
35 jest.mock('../../../../helpers/dates', () => ({
36   parseDate: jest.fn(date => `PARSED:${date}`)
37 }));
38
39 jest.mock('../../../../api/time-machine', () => {
40   const { mockPaging } = jest.requireActual('../../../../helpers/testMocks');
41   return {
42     getAllTimeMachineData: jest.fn().mockResolvedValue({
43       measures: [
44         {
45           metric: 'bugs',
46           history: [{ date: '2022-01-01', value: '10' }]
47         }
48       ],
49       paging: mockPaging({ total: 1 })
50     })
51   };
52 });
53
54 jest.mock('../../../../api/metrics', () => {
55   const { mockMetric } = jest.requireActual('../../../../helpers/testMocks');
56   return {
57     getAllMetrics: jest.fn().mockResolvedValue([mockMetric()])
58   };
59 });
60
61 jest.mock('../../../../api/projectActivity', () => {
62   const { mockAnalysis, mockPaging } = jest.requireActual('../../../../helpers/testMocks');
63   return {
64     ...jest.requireActual('../../../../api/projectActivity'),
65     createEvent: jest.fn(),
66     changeEvent: jest.fn(),
67     getProjectActivity: jest.fn().mockResolvedValue({
68       analyses: [mockAnalysis({ key: 'foo' })],
69       paging: mockPaging({ total: 1 })
70     })
71   };
72 });
73
74 it('should render correctly', () => {
75   expect(shallowRender()).toMatchSnapshot();
76 });
77
78 it('should filter metric correctly', () => {
79   const wrapper = shallowRender();
80   let metrics = wrapper
81     .instance()
82     .filterMetrics(mockComponent({ qualifier: ComponentQualifier.Project }), [
83       mockMetric({ key: MetricKey.bugs }),
84       mockMetric({ key: MetricKey.security_review_rating })
85     ]);
86   expect(metrics).toHaveLength(1);
87   metrics = wrapper
88     .instance()
89     .filterMetrics(mockComponent({ qualifier: ComponentQualifier.Portfolio }), [
90       mockMetric({ key: MetricKey.bugs }),
91       mockMetric({ key: MetricKey.security_hotspots_reviewed })
92     ]);
93   expect(metrics).toHaveLength(1);
94 });
95
96 it('should correctly create and update custom events', async () => {
97   const analysisKey = 'foo';
98   const name = 'bar';
99   const newName = 'baz';
100   const event = mockAnalysisEvent({ name });
101   (createEvent as jest.Mock).mockResolvedValueOnce({ analysis: analysisKey, ...event });
102   (changeEvent as jest.Mock).mockResolvedValueOnce({
103     analysis: analysisKey,
104     ...event,
105     name: newName
106   });
107
108   const wrapper = shallowRender();
109   await waitAndUpdate(wrapper);
110   const instance = wrapper.instance();
111
112   instance.addCustomEvent(analysisKey, name);
113   expect(createEvent).toHaveBeenCalledWith(analysisKey, name, undefined);
114   await waitAndUpdate(wrapper);
115   expect(wrapper.state().analyses[0].events[0]).toEqual(event);
116
117   instance.changeEvent(event.key, newName);
118   expect(changeEvent).toHaveBeenCalledWith(event.key, newName);
119   await waitAndUpdate(wrapper);
120   expect(wrapper.state().analyses[0].events[0]).toEqual({ ...event, name: newName });
121 });
122
123 function shallowRender(props: Partial<ProjectActivityAppContainer['props']> = {}) {
124   return shallow<ProjectActivityAppContainer>(
125     <ProjectActivityAppContainer
126       component={mockComponent({ breadcrumbs: [mockComponent()] })}
127       location={mockLocation()}
128       router={mockRouter()}
129       {...props}
130     />
131   );
132 }