blessing-skin-server/resources/assets/tests/views/widgets/NotificationsList.test.tsx
Zephyr Lykos 9524a234cf
cleanup: wip 3.1
mostly misc cleanups
2024-02-24 23:01:32 +08:00

69 lines
1.8 KiB
TypeScript

import {expect, vi, test} from 'vitest';
import {render, fireEvent, waitFor} from '@testing-library/react';
import {t} from '@/scripts/i18n';
import * as fetch from '@/scripts/net';
import NotificationsList, {
type Notification,
} from '@/views/widgets/NotificationsList';
vi.mock('@/scripts/net');
beforeEach(() => {
document.body.innerHTML = '';
});
function createContainer(notifications: Notification[]) {
const container = document.createElement('div');
container.dataset.notifications = JSON.stringify(notifications);
container.dataset.t = 'no unread';
document.body.append(container);
}
test('should not throw if element does not exist', () => {
render(<NotificationsList/>);
});
test('no unread notifications', () => {
createContainer([]);
const {queryByText} = render(<NotificationsList/>);
expect(queryByText('no unread')).toBeInTheDocument();
});
test('with unread notifications', () => {
createContainer([{id: '1', title: 'hi'}]);
const {queryByText} = render(<NotificationsList/>);
expect(queryByText('1')).toBeInTheDocument();
expect(queryByText('hi')).toBeInTheDocument();
});
test('read notification', async () => {
const time = new Date().toLocaleTimeString();
const fixture = {
title: 'hi - title',
content: 'content here',
time,
};
createContainer([{id: '1', title: 'hi'}]);
fetch.post.mockResolvedValue(fixture);
const {getByText, queryByText} = render(<NotificationsList/>);
fireEvent.click(getByText('hi'));
await waitFor(() => {
expect(fetch.post).toBeCalled();
});
expect(queryByText(fixture.title)).toBeInTheDocument();
expect(queryByText(fixture.content)).toBeInTheDocument();
expect(queryByText(fixture.time)).toBeInTheDocument();
expect(queryByText('no unread')).toBeInTheDocument();
expect(queryByText('1')).not.toBeInTheDocument();
fireEvent.click(getByText(t('general.confirm')));
});