import { Editor, ValueNode } from '@sagold/react-json-editor';
import { DateWidget } from './DateWidget';
import userEvent from '@testing-library/user-event';
import { widgets } from '../../index';
import { screen } from '@testing-library/dom';
import { render } from '@testing-library/react';
import { MantineProvider } from '@mantine/core';
describe('DateWidget', () => {
let editor: Editor;
beforeEach(
() =>
(editor = new Editor({
widgets,
schema: {
type: 'string',
format: 'date-time'
}
}))
);
it('should show correctly formatted date ', () => {
const testDate = '2026-02-22T15:00:00.000Z';
editor.setData(testDate);
render(
);
const $button = screen.getByRole('button');
expect($button).toHaveClass('mantine-Input-input');
// Calculate offset for the specific test date to handle DST correctly
const localTimeOffset = new Date(testDate).getTimezoneOffset() / 60;
expect($button).toHaveTextContent(`22 Feb 2026 ${15 - localTimeOffset}:00`);
});
it('should correctly update formatted date', async () => {
const testDate = '2026-02-22T15:00:00.000Z';
editor.setData(testDate);
const { container, rerender } = render(
);
const user = userEvent.setup();
await user.click(screen.getByRole('button')); // click input and open modal
const $hours = screen.getByRole('spinbutton', { value: { max: 23 } });
await user.click($hours); // click hours input
await user.keyboard('12'); // change hours to 12
const submitButton = container.querySelector('.mantine-DateTimePicker-submitButton');
await user.click(submitButton!); // confirm input and close modal
// check if data was correctly updated
const datetime = editor.getData();
// Calculate offset for the specific test date to handle DST correctly
const localTimeOffset = new Date(testDate).getTimezoneOffset() / 60;
expect(datetime).toBe(`2026-02-22T${12 + localTimeOffset}:00:00.000Z`);
rerender(
);
// check if data was correctly updated for display
const $button = screen.getByRole('button'); // note: fails when modal is not closed
expect($button).toHaveClass('mantine-Input-input');
expect($button).toHaveTextContent(`22 Feb 2026 12:00`);
});
});