You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ghost/apps/posts/test/unit/hooks/usePostFeedback.test.tsx

112 lines
3.6 KiB

/* eslint-disable @typescript-eslint/no-explicit-any */
import {beforeEach, describe, expect, it} from 'vitest';
import {createTestWrapper, endpoint, mockServer, when} from '../../utils/msw-helpers';
import {renderHook, waitFor} from '@testing-library/react';
import {usePostFeedback} from '@src/hooks/usePostFeedback';
describe('usePostFeedback', () => {
const testPostId = 'post-123';
beforeEach(() => {
mockServer.setup(); // Basic setup with defaults
});
it('returns empty feedback array when no feedback exists', async () => {
mockServer.setup({
feedback: []
});
const {result} = renderHook(() => usePostFeedback(testPostId), {
wrapper: createTestWrapper()
});
await waitFor(() => {
expect(result.current.feedback).toEqual([]);
expect(result.current.isLoading).toBe(false);
expect(result.current.error).toBeNull();
});
});
it('returns feedback data when successful', async () => {
const mockFeedback = [
{id: '1', score: 1},
{id: '2', score: 0}
];
mockServer.setup({
feedback: mockFeedback
});
const {result} = renderHook(() => usePostFeedback(testPostId), {
wrapper: createTestWrapper()
});
await waitFor(() => {
expect(result.current.feedback).toHaveLength(2);
expect(result.current.feedback[0]).toMatchObject({id: '1', score: 1});
expect(result.current.feedback[1]).toMatchObject({id: '2', score: 0});
expect(result.current.isLoading).toBe(false);
expect(result.current.error).toBeNull();
});
});
it('handles positive feedback filter', async () => {
mockServer.setup({
feedback: [
{id: '1', score: 1},
{id: '3', score: 1}
]
});
const {result} = renderHook(() => usePostFeedback(testPostId, 1), {
wrapper: createTestWrapper()
});
await waitFor(() => {
expect(result.current.feedback).toHaveLength(2);
expect(result.current.feedback[0]).toMatchObject({id: '1', score: 1});
expect(result.current.feedback[1]).toMatchObject({id: '3', score: 1});
});
});
it('handles negative feedback filter', async () => {
const negativeFeedback = [{id: '2', score: 0, message: 'Not helpful'}];
mockServer.setup({
customHandlers: [
when('get', '/ghost/api/admin/feedback/*', [
{
if: (req: Request) => new URL(req.url).searchParams.get('score') === '0',
response: {feedback: negativeFeedback}
}
], {feedback: []})
]
});
const {result} = renderHook(() => usePostFeedback(testPostId, 0), {
wrapper: createTestWrapper()
});
await waitFor(() => {
expect(result.current.feedback).toEqual(negativeFeedback);
});
});
it('handles server errors gracefully', async () => {
mockServer.setup({
customHandlers: [
endpoint.get('/ghost/api/admin/feedback/*', {error: 'Server error'}, 500)
]
});
const {result} = renderHook(() => usePostFeedback(testPostId), {
wrapper: createTestWrapper()
});
await waitFor(() => {
expect(result.current.feedback).toEqual([]);
expect(result.current.isLoading).toBe(false);
expect(result.current.error).toBeDefined();
});
});
});