Skip to content

Commit 2fd727b

Browse files
authored
Merge pull request #2757 from y0urself/cpes-listpage
Refactor of CPEs Listpage
2 parents fb0bdf4 + 58e77b9 commit 2fd727b

File tree

3 files changed

+301
-115
lines changed

3 files changed

+301
-115
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
99
### Added
1010

1111
### Changed
12+
- Implement cpes listpage queries and mutations [#2757](https://github.com/greenbone/gsa/pull/2757)
1213
- Implement audit listpage queries and mutations [#2752](https://github.com/greenbone/gsa/pull/2752)
1314
- Implement cves listpage queries and mutations [#2742](https://github.com/greenbone/gsa/pull/2742)
1415
- Implement override mutations and refactor component to function [#2750](https://github.com/greenbone/gsa/pull/2750)

gsa/src/web/pages/cpes/__tests__/listpage.js

+87-68
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,36 @@ import CollectionCounts from 'gmp/collection/collectioncounts';
2222
import {setLocale} from 'gmp/locale/lang';
2323

2424
import Filter from 'gmp/models/filter';
25-
import CPE from 'gmp/models/cpe';
25+
import Cpe from 'gmp/models/cpe';
2626

2727
import {entitiesLoadingActions} from 'web/store/entities/cpes';
2828

29+
import {
30+
cpeEntity,
31+
createExportCpesByIdsQueryMock,
32+
createExportCpesByFilterQueryMock,
33+
createGetCpesQueryMock,
34+
} from 'web/graphql/__mocks__/cpes';
35+
2936
import {setTimezone, setUsername} from 'web/store/usersettings/actions';
3037
import {defaultFilterLoadingActions} from 'web/store/usersettings/defaultfilters/actions';
3138
import {loadingActions} from 'web/store/usersettings/defaults/actions';
3239

33-
import {rendererWith, fireEvent, screen, wait} from 'web/utils/testing';
40+
import {
41+
rendererWith,
42+
waitFor,
43+
fireEvent,
44+
screen,
45+
wait,
46+
} from 'web/utils/testing';
3447

3548
import CpesPage, {ToolBarIcons} from '../listpage';
3649

3750
setLocale('en');
3851

3952
window.URL.createObjectURL = jest.fn();
4053

41-
const cpe = CPE.fromElement({
42-
_id: 'cpe:/a:foo',
43-
name: 'foo',
44-
title: 'bar',
45-
creation_time: '2019-06-24T11:55:30Z',
46-
modification_time: '2019-06-24T10:12:27Z',
47-
update_time: '2019-06-24T10:12:27Z',
48-
cve_refs: '3',
49-
cves: {
50-
cve: [
51-
{entry: {cvss: {base_metrics: {score: 9.8}}, _id: 'CVE-2020-1234'}},
52-
{entry: {cvss: {base_metrics: {score: 7.8}}, _id: 'CVE-2020-5678'}},
53-
{entry: {cvss: {base_metrics: {score: 7.8}}, _id: 'CVE-2019-5678'}},
54-
],
55-
},
56-
score: 98,
57-
status: '',
58-
nvd_id: '',
59-
});
54+
const cpeObject = Cpe.fromObject(cpeEntity);
6055

6156
const reloadInterval = -1;
6257
const manualUrl = 'test/';
@@ -105,7 +100,7 @@ beforeEach(() => {
105100
);
106101

107102
getCpes = jest.fn().mockResolvedValue({
108-
data: [cpe],
103+
data: [cpeObject],
109104
meta: {
110105
filter: Filter.fromString(),
111106
counts: new CollectionCounts(),
@@ -135,17 +130,24 @@ describe('CpesPage tests', () => {
135130
user: {currentSettings, getSetting},
136131
};
137132

133+
const filterString = 'foo=bar rows=2';
134+
const defaultSettingfilter = Filter.fromString(filterString);
135+
const [mock, resultFunc] = createGetCpesQueryMock({
136+
filterString,
137+
first: 2,
138+
});
139+
138140
const {render, store} = rendererWith({
139141
gmp,
140142
capabilities: true,
141143
store: true,
142144
router: true,
145+
queryMocks: [mock],
143146
});
144147

145148
store.dispatch(setTimezone('CET'));
146149
store.dispatch(setUsername('admin'));
147150

148-
const defaultSettingfilter = Filter.fromString('foo=bar');
149151
store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
150152
store.dispatch(
151153
defaultFilterLoadingActions.success('cpe', defaultSettingfilter),
@@ -161,13 +163,17 @@ describe('CpesPage tests', () => {
161163
const filter = Filter.fromString('first=1 rows=10');
162164
const loadedFilter = Filter.fromString('first=1 rows=10');
163165
store.dispatch(
164-
entitiesLoadingActions.success([cpe], filter, loadedFilter, counts),
166+
entitiesLoadingActions.success([cpeObject], filter, loadedFilter, counts),
165167
);
166168

167169
const {baseElement} = render(<CpesPage />);
168170

169171
await wait();
170172

173+
expect(resultFunc).toHaveBeenCalled();
174+
175+
await waitFor(() => baseElement.querySelectorAll('table'));
176+
171177
const display = screen.getAllByTestId('grid-item');
172178
const inputs = baseElement.querySelectorAll('input');
173179
const selects = screen.getAllByTestId('select-selected-value');
@@ -209,28 +215,18 @@ describe('CpesPage tests', () => {
209215

210216
expect(row[1]).toHaveTextContent('foo');
211217
expect(row[1]).toHaveTextContent('bar');
212-
expect(row[1]).toHaveTextContent('Mon, Jun 24, 2019 12:12 PM CEST');
218+
expect(row[1]).toHaveTextContent('Tue, Sep 29, 2020 2:16 PM CEST');
213219
expect(row[1]).toHaveTextContent('3');
214220
expect(row[1]).toHaveTextContent('9.8 (High)');
215221
});
216222

217223
test('should allow to bulk action on page contents', async () => {
218-
const deleteByFilter = jest.fn().mockResolvedValue({
219-
foo: 'bar',
220-
});
221-
222-
const exportByFilter = jest.fn().mockResolvedValue({
223-
foo: 'bar',
224-
});
225-
226224
const gmp = {
227225
dashboard: {
228226
getSetting: getDashboardSetting,
229227
},
230228
cpes: {
231229
get: getCpes,
232-
deleteByFilter,
233-
exportByFilter,
234230
getActiveDaysAggregates: getAggregates,
235231
getCreatedAggregates: getAggregates,
236232
getSeverityAggregates: getAggregates,
@@ -242,18 +238,30 @@ describe('CpesPage tests', () => {
242238
settings: {manualUrl, reloadInterval},
243239
user: {renewSession, currentSettings, getSetting: getSetting},
244240
};
241+
const filterString = 'foo=bar rows=2';
242+
const defaultSettingfilter = Filter.fromString(filterString);
243+
244+
const [mock, resultFunc] = createGetCpesQueryMock({
245+
filterString,
246+
first: 2,
247+
});
248+
249+
const [
250+
exportByIdsMock,
251+
exportByIdsResult,
252+
] = createExportCpesByIdsQueryMock(['cpe:/a:foo']);
245253

246254
const {render, store} = rendererWith({
247255
gmp,
248256
capabilities: true,
249257
store: true,
250258
router: true,
259+
queryMocks: [mock, exportByIdsMock],
251260
});
252261

253262
store.dispatch(setTimezone('CET'));
254263
store.dispatch(setUsername('admin'));
255264

256-
const defaultSettingfilter = Filter.fromString('foo=bar');
257265
store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
258266
store.dispatch(
259267
defaultFilterLoadingActions.success('cpe', defaultSettingfilter),
@@ -269,13 +277,15 @@ describe('CpesPage tests', () => {
269277
const filter = Filter.fromString('first=1 rows=10');
270278
const loadedFilter = Filter.fromString('first=1 rows=10');
271279
store.dispatch(
272-
entitiesLoadingActions.success([cpe], filter, loadedFilter, counts),
280+
entitiesLoadingActions.success([cpeObject], filter, loadedFilter, counts),
273281
);
274282

275283
render(<CpesPage />);
276284

277285
await wait();
278286

287+
expect(resultFunc).toHaveBeenCalled();
288+
279289
// export page contents
280290
const exportIcon = screen.getAllByTitle('Export page contents');
281291

@@ -284,26 +294,16 @@ describe('CpesPage tests', () => {
284294

285295
await wait();
286296

287-
expect(exportByFilter).toHaveBeenCalled();
297+
expect(exportByIdsResult).toHaveBeenCalled();
288298
});
289299

290300
test('should allow to bulk action on selected cpes', async () => {
291-
const deleteByIds = jest.fn().mockResolvedValue({
292-
foo: 'bar',
293-
});
294-
295-
const exportByIds = jest.fn().mockResolvedValue({
296-
foo: 'bar',
297-
});
298-
299301
const gmp = {
300302
dashboard: {
301303
getSetting: getDashboardSetting,
302304
},
303305
cpes: {
304306
get: getCpes,
305-
delete: deleteByIds,
306-
export: exportByIds,
307307
getActiveDaysAggregates: getAggregates,
308308
getCreatedAggregates: getAggregates,
309309
getSeverityAggregates: getAggregates,
@@ -315,18 +315,30 @@ describe('CpesPage tests', () => {
315315
settings: {manualUrl, reloadInterval},
316316
user: {renewSession, currentSettings, getSetting},
317317
};
318+
const filterString = 'foo=bar rows=2';
319+
const defaultSettingfilter = Filter.fromString(filterString);
320+
321+
const [mock, resultFunc] = createGetCpesQueryMock({
322+
filterString,
323+
first: 2,
324+
});
325+
326+
const [
327+
exportByIdsMock,
328+
exportByIdsResult,
329+
] = createExportCpesByIdsQueryMock(['cpe:/a:foo']);
318330

319331
const {render, store} = rendererWith({
320332
gmp,
321333
capabilities: true,
322334
store: true,
323335
router: true,
336+
queryMocks: [mock, exportByIdsMock],
324337
});
325338

326339
store.dispatch(setTimezone('CET'));
327340
store.dispatch(setUsername('admin'));
328341

329-
const defaultSettingfilter = Filter.fromString('foo=bar');
330342
store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
331343
store.dispatch(
332344
defaultFilterLoadingActions.success('cpe', defaultSettingfilter),
@@ -342,13 +354,15 @@ describe('CpesPage tests', () => {
342354
const filter = Filter.fromString('first=1 rows=10');
343355
const loadedFilter = Filter.fromString('first=1 rows=10');
344356
store.dispatch(
345-
entitiesLoadingActions.success([cpe], filter, loadedFilter, counts),
357+
entitiesLoadingActions.success([cpeObject], filter, loadedFilter, counts),
346358
);
347359

348-
const {element} = render(<CpesPage />);
360+
const {baseElement} = render(<CpesPage />);
349361

350362
await wait();
351363

364+
expect(resultFunc).toHaveBeenCalled();
365+
352366
const selectFields = screen.getAllByTestId('select-open-button');
353367
fireEvent.click(selectFields[1]);
354368

@@ -358,7 +372,7 @@ describe('CpesPage tests', () => {
358372
const selected = screen.getAllByTestId('select-selected-value');
359373
expect(selected[1]).toHaveTextContent('Apply to selection');
360374

361-
const inputs = element.querySelectorAll('input');
375+
const inputs = baseElement.querySelectorAll('input');
362376

363377
// select a cpe
364378
fireEvent.click(inputs[1]);
@@ -372,26 +386,16 @@ describe('CpesPage tests', () => {
372386

373387
await wait();
374388

375-
expect(exportByIds).toHaveBeenCalled();
389+
expect(exportByIdsResult).toHaveBeenCalled();
376390
});
377391

378392
test('should allow to bulk action on filtered cpes', async () => {
379-
const deleteByFilter = jest.fn().mockResolvedValue({
380-
foo: 'bar',
381-
});
382-
383-
const exportByFilter = jest.fn().mockResolvedValue({
384-
foo: 'bar',
385-
});
386-
387393
const gmp = {
388394
dashboard: {
389395
getSetting: getDashboardSetting,
390396
},
391397
cpes: {
392398
get: getCpes,
393-
deleteByFilter,
394-
exportByFilter,
395399
getActiveDaysAggregates: getAggregates,
396400
getCreatedAggregates: getAggregates,
397401
getSeverityAggregates: getAggregates,
@@ -403,18 +407,32 @@ describe('CpesPage tests', () => {
403407
settings: {manualUrl, reloadInterval},
404408
user: {renewSession, currentSettings, getSetting: getSetting},
405409
};
410+
const filterString = 'foo=bar rows=2';
411+
const defaultSettingfilter = Filter.fromString(filterString);
412+
const filter = Filter.fromString('first=1 rows=10');
413+
const loadedFilter = Filter.fromString('first=1 rows=10');
414+
415+
const [mock, resultFunc] = createGetCpesQueryMock({
416+
filterString,
417+
first: 2,
418+
});
419+
420+
const [
421+
exportByFilterMock,
422+
exportByFilterResult,
423+
] = createExportCpesByFilterQueryMock('foo=bar rows=-1 first=1');
406424

407425
const {render, store} = rendererWith({
408426
gmp,
409427
capabilities: true,
410428
store: true,
411429
router: true,
430+
queryMocks: [mock, exportByFilterMock],
412431
});
413432

414433
store.dispatch(setTimezone('CET'));
415434
store.dispatch(setUsername('admin'));
416435

417-
const defaultSettingfilter = Filter.fromString('foo=bar');
418436
store.dispatch(loadingActions.success({rowsperpage: {value: '2'}}));
419437
store.dispatch(
420438
defaultFilterLoadingActions.success('cpe', defaultSettingfilter),
@@ -427,16 +445,17 @@ describe('CpesPage tests', () => {
427445
length: 1,
428446
rows: 10,
429447
});
430-
const filter = Filter.fromString('first=1 rows=10');
431-
const loadedFilter = Filter.fromString('first=1 rows=10');
448+
432449
store.dispatch(
433-
entitiesLoadingActions.success([cpe], filter, loadedFilter, counts),
450+
entitiesLoadingActions.success([cpeObject], filter, loadedFilter, counts),
434451
);
435452

436453
render(<CpesPage />);
437454

438455
await wait();
439456

457+
expect(resultFunc).toHaveBeenCalled();
458+
440459
const selectFields = screen.getAllByTestId('select-open-button');
441460
fireEvent.click(selectFields[1]);
442461

@@ -456,7 +475,7 @@ describe('CpesPage tests', () => {
456475

457476
await wait();
458477

459-
expect(exportByFilter).toHaveBeenCalled();
478+
expect(exportByFilterResult).toHaveBeenCalled();
460479
});
461480
});
462481

0 commit comments

Comments
 (0)