From c7396325f7027a407a623d5a2514db7adee941b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Wed, 12 Mar 2025 14:12:49 +0100 Subject: [PATCH 1/5] test: Add a data-testid to the new port range icon Allow for easier testing. --- src/web/pages/portlists/Dialog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/pages/portlists/Dialog.jsx b/src/web/pages/portlists/Dialog.jsx index 10ea640630..471dbdfd4b 100644 --- a/src/web/pages/portlists/Dialog.jsx +++ b/src/web/pages/portlists/Dialog.jsx @@ -18,7 +18,6 @@ import useTranslation from 'web/hooks/useTranslation'; import PortRangesTable from 'web/pages/portlists/portrangestable'; import PropTypes from 'web/utils/PropTypes'; - const FROM_FILE = YES_VALUE; const NOT_FROM_FILE = NO_VALUE; @@ -44,6 +43,7 @@ const PortListsDialog = ({ const newRangeIcon = (
Date: Wed, 12 Mar 2025 14:14:39 +0100 Subject: [PATCH 2/5] Fix: Don't crash port list pages on user interaction Bind handleInteraction function for port range component to allow access to this. --- src/web/pages/portlists/Component.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/web/pages/portlists/Component.jsx b/src/web/pages/portlists/Component.jsx index 89a0e0e641..9163c818a4 100644 --- a/src/web/pages/portlists/Component.jsx +++ b/src/web/pages/portlists/Component.jsx @@ -42,6 +42,7 @@ class PortListComponent extends React.Component { this.handleSavePortRange = this.handleSavePortRange.bind(this); this.handleTmpAddPortRange = this.handleTmpAddPortRange.bind(this); this.handleTmpDeletePortRange = this.handleTmpDeletePortRange.bind(this); + this.handleInteraction = this.handleInteraction.bind(this); } openPortListDialog(entity) { From 138d4792d91ed40d2229855f67fc9fb3f2e9d88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Wed, 12 Mar 2025 14:16:30 +0100 Subject: [PATCH 3/5] fix: Don't silently discard port list save errors Forward port list save errors to the onSaveError handler. --- src/web/pages/portlists/Component.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/web/pages/portlists/Component.jsx b/src/web/pages/portlists/Component.jsx index 9163c818a4..eb36965c3e 100644 --- a/src/web/pages/portlists/Component.jsx +++ b/src/web/pages/portlists/Component.jsx @@ -182,7 +182,8 @@ class PortListComponent extends React.Component { ]; return Promise.all(promises) .then(() => save(data)) - .then(() => this.closePortListDialog()); + .then(() => this.closePortListDialog()) + .catch(error => this.props.onSaveError(error)); } handleTmpAddPortRange(values) { From b7a66d19bb43fe54c62580878524a81fca58d1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Wed, 12 Mar 2025 14:17:29 +0100 Subject: [PATCH 4/5] test: Add tests for the port list component Ensure the port list component works as expected. --- .../portlists/__tests__/Component.test.jsx | 560 ++++++++++++++++++ 1 file changed, 560 insertions(+) create mode 100644 src/web/pages/portlists/__tests__/Component.test.jsx diff --git a/src/web/pages/portlists/__tests__/Component.test.jsx b/src/web/pages/portlists/__tests__/Component.test.jsx new file mode 100644 index 0000000000..15fc3631f6 --- /dev/null +++ b/src/web/pages/portlists/__tests__/Component.test.jsx @@ -0,0 +1,560 @@ +/* SPDX-FileCopyrightText: 2025 Greenbone AG + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import {describe, test, expect, testing} from '@gsa/testing'; +import PortList from 'gmp/models/portlist'; +import Button from 'web/components/form/Button'; +import { + changeInputValue, + getDialogCloseButton, + getDialogSaveButton, + queryDialogs, +} from 'web/components/testing'; +import {currentSettingsDefaultResponse} from 'web/pages/__mocks__/CurrentSettings'; +import PortListComponent from 'web/pages/portlists/Component'; +import { + rendererWith, + wait, + screen, + fireEvent, + getByName, +} from 'web/utils/Testing'; + +const getPortListResponse = { + data: PortList.fromElement({id: '123', name: 'foo'}), +}; +const currentSettings = testing + .fn() + .mockResolvedValue(currentSettingsDefaultResponse); +const getPortList = testing.fn().mockResolvedValue(getPortListResponse); + +describe('Port List Component tests', () => { + test('should render without crashing', () => { + const gmp = { + portlist: { + get: getPortList, + }, + user: {currentSettings}, + }; + const onInteraction = testing.fn(); + const {render} = rendererWith({gmp}); + const {element} = render( + + {() => null} + , + ); + expect(element).toBeInTheDocument(); + }); + + test('should open and close PortListDialog', () => { + const gmp = { + portlist: { + get: getPortList, + }, + user: {currentSettings}, + }; + const onInteraction = testing.fn(); + const {render} = rendererWith({gmp}); + render( + + {({create}) =>