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.
112 lines
3.6 KiB
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();
|
|
});
|
|
});
|
|
}); |