Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions src/web/components/dialog/__tests__/SaveDialog.test.tsx
Original file line number Diff line number Diff line change
@@ -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';

Check warning on line 11 in src/web/components/dialog/__tests__/SaveDialog.test.tsx

View workflow job for this annotation

GitHub Actions / Linting (20)

`web/components/form/Checkbox` import should occur before import of `web/components/form/NumberField`

Check warning on line 11 in src/web/components/dialog/__tests__/SaveDialog.test.tsx

View workflow job for this annotation

GitHub Actions / Linting (22)

`web/components/form/Checkbox` import should occur before import of `web/components/form/NumberField`
import {useState} from 'react';

Check warning on line 12 in src/web/components/dialog/__tests__/SaveDialog.test.tsx

View workflow job for this annotation

GitHub Actions / Linting (20)

`react` import should occur before import of `@gsa/testing`

Check warning on line 12 in src/web/components/dialog/__tests__/SaveDialog.test.tsx

View workflow job for this annotation

GitHub Actions / Linting (22)

`react` import should occur before import of `@gsa/testing`

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<boolean>(false);
const handleIsEnabledChange = (value: boolean) => {
setIsEnabled(value);
};
return (
<SaveDialog<{foo?: string; isEnabled: boolean}, {bar: number}>
defaultValues={{bar: 42}}
title="Some Dialog"
values={{foo, isEnabled}}
onClose={onClose}
onSave={onSave}
>
{({values, onValueChange}) => (
<>
<TextField name="foo" value={values.foo} onChange={onFooChange} />
<NumberField name="bar" value={values.bar} onChange={onValueChange} />
<Checkbox<boolean>
checked={values.isEnabled}
name="isEnabled"
onChange={handleIsEnabledChange}
/>
</>
)}
</SaveDialog>
);
};

describe('SaveDialog component tests', () => {
test('should render a SaveDialog', () => {
const handleClose = testing.fn();
const handleSave = testing.fn();
render(<TestDialog onClose={handleClose} onSave={handleSave} />);

const dialog = screen.getDialog();
expect(dialog).toBeInTheDocument();
});

test('should call onClose when dialog is closed', () => {
const handleClose = testing.fn();
const handleSave = testing.fn();
render(<TestDialog onClose={handleClose} onSave={handleSave} />);

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(<TestDialog onClose={handleClose} onSave={handleSave} />);

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(
<TestDialog
foo="something"
onClose={handleClose}
onFooChange={handleFooChange}
onSave={handleSave}
/>,
);

const saveButton = screen.getDialogSaveButton();
fireEvent.click(saveButton);

expect(handleSave).toHaveBeenCalledWith({

Check failure on line 97 in src/web/components/dialog/__tests__/SaveDialog.test.tsx

View workflow job for this annotation

GitHub Actions / Run tests (22)

src/web/components/dialog/__tests__/SaveDialog.test.tsx > SaveDialog component tests > should update value in TextField

AssertionError: expected "spy" to be called with arguments: [ { foo: 'something', bar: 42 } ] Received: 1st spy call: [ { "bar": 42, "foo": "something", + "isEnabled": false, }, ] Number of calls: 1 ❯ src/web/components/dialog/__tests__/SaveDialog.test.tsx:97:24

Check failure on line 97 in src/web/components/dialog/__tests__/SaveDialog.test.tsx

View workflow job for this annotation

GitHub Actions / Run tests (20)

src/web/components/dialog/__tests__/SaveDialog.test.tsx > SaveDialog component tests > should update value in TextField

AssertionError: expected "spy" to be called with arguments: [ { foo: 'something', bar: 42 } ] Received: 1st spy call: [ { "bar": 42, "foo": "something", + "isEnabled": false, }, ] Number of calls: 1 ❯ src/web/components/dialog/__tests__/SaveDialog.test.tsx:97:24
foo: 'something',
bar: 42,
});

const textField = screen.getByName('foo');
changeInputValue(textField, 'test value');
expect(handleFooChange).toHaveBeenCalledWith('test value', 'foo');

handleSave.mockClear();

rerender(
<TestDialog
foo="test value"
onClose={handleClose}
onFooChange={handleFooChange}
onSave={handleSave}
/>,
);

fireEvent.click(saveButton);

expect(handleSave).toHaveBeenCalledWith({
foo: 'test value',
bar: 42,
});
});
});
Loading