import { beforeEach, describe, expect, it, vi } from 'vitest' import { fetchPostChanges, fetchPosts, toggleViewedFlg, updatePost } from '@/lib/posts' import type { FetchPostsParams } from '@/types' const api = vi.hoisted (() => ({ apiDelete: vi.fn (), apiGet: vi.fn (), apiPost: vi.fn (), apiPut: vi.fn (), })) vi.mock ('@/lib/api', () => api) const baseParams: FetchPostsParams = { url: '', title: '', tags: '', match: 'all', originalCreatedFrom: '', originalCreatedTo: '', createdFrom: '', createdTo: '', updatedFrom: '', updatedTo: '', page: 1, limit: 20, order: 'updated_at:desc', } describe ('posts API functions', () => { beforeEach (() => { vi.clearAllMocks () }) it ('maps post search parameters to backend snake_case names', async () => { api.apiGet.mockResolvedValueOnce ({ posts: [], count: 0 }) await fetchPosts ({ ...baseParams, title: 'title', tags: 'a b', originalCreatedFrom: '2026-01-01', updatedTo: '2026-02-01', }) expect (api.apiGet).toHaveBeenCalledWith ( '/posts', { params: { title: 'title', tags: 'a b', match: 'all', original_created_from: '2026-01-01', updated_to: '2026-02-01', page: 1, limit: 20, order: 'updated_at:desc', }, }, ) }) it ('updates posts with version and merge controls', async () => { api.apiPut.mockResolvedValueOnce ({ id: 5 }) await updatePost ( { id: 5, title: 'new title', tags: 'tag', parentPostIds: '1 2', originalCreatedFrom: null, originalCreatedBefore: '2026-01-02T00:00:00Z', }, { baseVersionNo: 7, force: true, merge: false }, ) expect (api.apiPut).toHaveBeenCalledWith ( '/posts/5', { title: 'new title', tags: 'tag', parent_post_ids: '1 2', original_created_from: null, original_created_before: '2026-01-02T00:00:00Z', }, { params: { base_version_no: '7', force: '1', merge: '0', }, }, ) }) it ('uses the viewed endpoint method matching the requested state', async () => { await toggleViewedFlg ('9', true) await toggleViewedFlg ('9', false) expect (api.apiPost).toHaveBeenCalledWith ('/posts/9/viewed') expect (api.apiDelete).toHaveBeenCalledWith ('/posts/9/viewed') }) it ('keeps optional post history filters out when blank', async () => { api.apiGet.mockResolvedValueOnce ({ versions: [], count: 0 }) await fetchPostChanges ({ page: 2, limit: 50 }) expect (api.apiGet).toHaveBeenCalledWith ( '/posts/versions', { params: { page: 2, limit: 50 } }, ) }) })