From 060c8929d0d89cd32b35f68830305953feccc212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Ricks?= Date: Tue, 17 Jun 2025 09:11:27 +0200 Subject: [PATCH] test: Add test for the SaveDialog component --- .../dialog/__tests__/SaveDialog.test.tsx | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/web/components/dialog/__tests__/SaveDialog.test.tsx diff --git a/src/web/components/dialog/__tests__/SaveDialog.test.tsx b/src/web/components/dialog/__tests__/SaveDialog.test.tsx new file mode 100644 index 0000000000..889e07bac4 --- /dev/null +++ b/src/web/components/dialog/__tests__/SaveDialog.test.tsx @@ -0,0 +1,124 @@ +/* SPDX-FileCopyrightText: 2025 Greenbone AG + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import {describe, test, expect, testing} from '@gsa/testing'; +import {changeInputValue, fireEvent, render, screen} from 'web/testing'; +import SaveDialog from 'web/components/dialog/SaveDialog'; +import NumberField from 'web/components/form/NumberField'; +import TextField from 'web/components/form/TextField'; +import Checkbox from 'web/components/form/Checkbox'; +import {useState} from 'react'; + +interface TestDialogProps { + onClose: () => void; + onSave: (values: {foo?: string; bar: number}) => void; + foo?: string; + onFooChange?: (value: string, name?: string) => void; +} + +const TestDialog = ({onClose, onSave, foo, onFooChange}: TestDialogProps) => { + const [isEnabled, setIsEnabled] = useState(false); + const handleIsEnabledChange = (value: boolean) => { + setIsEnabled(value); + }; + return ( + + defaultValues={{bar: 42}} + title="Some Dialog" + values={{foo, isEnabled}} + onClose={onClose} + onSave={onSave} + > + {({values, onValueChange}) => ( + <> + + + + checked={values.isEnabled} + name="isEnabled" + onChange={handleIsEnabledChange} + /> + + )} + + ); +}; + +describe('SaveDialog component tests', () => { + test('should render a SaveDialog', () => { + const handleClose = testing.fn(); + const handleSave = testing.fn(); + render(); + + const dialog = screen.getDialog(); + expect(dialog).toBeInTheDocument(); + }); + + test('should call onClose when dialog is closed', () => { + const handleClose = testing.fn(); + const handleSave = testing.fn(); + render(); + + const button = screen.getDialogCloseButton(); + fireEvent.click(button); + + expect(handleClose).toHaveBeenCalled(); + }); + + test('should call onSave when save button is clicked', () => { + const handleClose = testing.fn(); + const handleSave = testing.fn(); + render(); + + const saveButton = screen.getDialogSaveButton(); + fireEvent.click(saveButton); + + expect(handleSave).toHaveBeenCalled(); + }); + + test('should update value in TextField', () => { + const handleClose = testing.fn(); + const handleSave = testing.fn(); + const handleFooChange = testing.fn(); + const {rerender} = render( + , + ); + + const saveButton = screen.getDialogSaveButton(); + fireEvent.click(saveButton); + + expect(handleSave).toHaveBeenCalledWith({ + foo: 'something', + bar: 42, + }); + + const textField = screen.getByName('foo'); + changeInputValue(textField, 'test value'); + expect(handleFooChange).toHaveBeenCalledWith('test value', 'foo'); + + handleSave.mockClear(); + + rerender( + , + ); + + fireEvent.click(saveButton); + + expect(handleSave).toHaveBeenCalledWith({ + foo: 'test value', + bar: 42, + }); + }); +});