Continuous Integration / config (pull_request) Successful in 11s
Continuous Integration / changes (pull_request) Successful in 21s
Continuous Integration / backend-build (pull_request) Skipped
Continuous Integration / backend-test (pull_request) Skipped
Continuous Integration / vulnerability-scan (pull_request) Skipped
Continuous Integration / frontend-prepare (pull_request) Successful in 1m37s
Continuous Integration / frontend-build (pull_request) Successful in 2m12s
Continuous Integration / frontend-test (pull_request) Successful in 4m42s
Continuous Integration / frontend-lint (pull_request) Successful in 2m2s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 6m51s
Continuous Integration / deploy-test (pull_request) Skipped
Groups auth, setup, invitation, profile, users, cms, availability and system code (services/hooks, components, schemas, mocks, pages) under src/features/<name> instead of splitting by technical layer (api/, components/, lib/schemas/, mocks/, pages/). Renames the old connection-oriented `api` layer to `services` per feature, and splits the monolithic api/types.ts into per-feature types.ts files (with ProblemDetails/ApiResult merged into lib/api-client.ts as shared infra). Layout-agnostic code (ui primitives, app shell, i18n, test utils, lib) stays at the top level. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import { renderHook, waitFor, act } from '@testing-library/react';
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
import { http, HttpResponse } from 'msw';
|
|
import { createElement } from 'react';
|
|
import { describe, expect, it, vi } from 'vitest';
|
|
import { server } from '@/mocks/server';
|
|
import { API_BASE } from '@/features/auth/mocks/fixtures';
|
|
import { useAddCmsInstance } from './useAddCmsInstance';
|
|
|
|
function createWrapper() {
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: { queries: { retry: false }, mutations: { retry: false } },
|
|
});
|
|
return ({ children }: { children: React.ReactNode }) =>
|
|
createElement(QueryClientProvider, { client: queryClient }, children);
|
|
}
|
|
|
|
const CMS_URL = `${API_BASE}/api/v1/CmsInstances`;
|
|
|
|
describe('useAddCmsInstance', () => {
|
|
it('returns created instance on success', async () => {
|
|
const { result } = renderHook(() => useAddCmsInstance(), { wrapper: createWrapper() });
|
|
|
|
await act(async () => {
|
|
await result.current.mutateAsync({
|
|
name: 'Test CMS',
|
|
url: 'http://test.example.com',
|
|
apiKey: 'secret',
|
|
});
|
|
});
|
|
|
|
await waitFor(() => expect(result.current.isSuccess).toBe(true));
|
|
expect(result.current.data?.name).toBe('Test CMS');
|
|
});
|
|
|
|
it('calls onError callback on HTTP 400', async () => {
|
|
server.use(http.post(CMS_URL, () => HttpResponse.json({}, { status: 400 })));
|
|
|
|
const onError = vi.fn();
|
|
const { result } = renderHook(() => useAddCmsInstance({ onError }), {
|
|
wrapper: createWrapper(),
|
|
});
|
|
|
|
await act(async () => {
|
|
try {
|
|
await result.current.mutateAsync({ name: 'X', url: 'http://x.com', apiKey: 'k' });
|
|
} catch {
|
|
// expected
|
|
}
|
|
});
|
|
|
|
await waitFor(() => expect(onError).toHaveBeenCalled());
|
|
});
|
|
});
|