|
- import { QueryClient } from '@tanstack/react-query'
- import { beforeEach, describe, expect, it, vi } from 'vitest'
-
- import { prefetchForURL } from '@/lib/prefetchers'
-
- const postsApi = vi.hoisted (() => ({
- fetchPost: vi.fn (),
- fetchPostChanges: vi.fn (),
- fetchPosts: vi.fn (),
- }))
-
- const tagsApi = vi.hoisted (() => ({
- fetchTag: vi.fn (),
- fetchTagByName: vi.fn (),
- fetchTagChanges: vi.fn (),
- fetchTags: vi.fn (),
- }))
-
- const wikiApi = vi.hoisted (() => ({
- fetchWikiPage: vi.fn (),
- fetchWikiPageByTitle: vi.fn (),
- fetchWikiPages: vi.fn (),
- }))
-
- vi.mock ('@/lib/posts', () => postsApi)
- vi.mock ('@/lib/tags', () => tagsApi)
- vi.mock ('@/lib/wiki', () => wikiApi)
-
- const qc = () => new QueryClient ({
- defaultOptions: { queries: { retry: false } },
- })
-
- describe ('prefetchForURL', () => {
- beforeEach (() => {
- vi.clearAllMocks ()
- postsApi.fetchPosts.mockResolvedValue ({ posts: [], count: 0 })
- postsApi.fetchPost.mockResolvedValue ({ id: 1 })
- postsApi.fetchPostChanges.mockResolvedValue ({ versions: [], count: 0 })
- tagsApi.fetchTags.mockResolvedValue ({ tags: [], count: 0 })
- tagsApi.fetchTag.mockResolvedValue ({ id: 1 })
- tagsApi.fetchTagByName.mockResolvedValue (null)
- tagsApi.fetchTagChanges.mockResolvedValue ({ versions: [], count: 0 })
- wikiApi.fetchWikiPages.mockResolvedValue ([])
- wikiApi.fetchWikiPage.mockResolvedValue ({ id: 1 })
- wikiApi.fetchWikiPageByTitle.mockResolvedValue (null)
- })
-
- it ('prefetches post indexes from query parameters', async () => {
- await prefetchForURL (
- qc (),
- 'http://localhost/posts?tags=a+b&match=any&page=2&limit=5&order=title%3Aasc',
- )
-
- expect (postsApi.fetchPosts).toHaveBeenCalledWith (
- expect.objectContaining ({
- tags: 'a b',
- match: 'any',
- page: 2,
- limit: 5,
- order: 'title:asc',
- }),
- )
- })
-
- it ('prefetches post detail pages', async () => {
- await prefetchForURL (qc (), 'http://localhost/posts/12')
-
- expect (postsApi.fetchPost).toHaveBeenCalledWith ('12')
- })
-
- it ('prefetches tag indexes from query parameters', async () => {
- await prefetchForURL (
- qc (),
- 'http://localhost/tags?post=9&name=x&category=general&page=4&post_count_lte=10',
- )
-
- expect (tagsApi.fetchTags).toHaveBeenCalledWith (
- expect.objectContaining ({
- post: 9,
- name: 'x',
- category: 'general',
- page: 4,
- postCountLTE: 10,
- }),
- )
- })
-
- it ('prefetches wiki show pages and related tag/post data', async () => {
- wikiApi.fetchWikiPageByTitle.mockResolvedValueOnce ({
- id: 3,
- title: 'Actual',
- body: 'body',
- })
-
- await prefetchForURL (qc (), 'http://localhost/wiki/Alias')
-
- expect (wikiApi.fetchWikiPageByTitle).toHaveBeenCalledWith ('Alias', { version: undefined })
- expect (wikiApi.fetchWikiPage).toHaveBeenCalledWith ('3', {})
- expect (tagsApi.fetchTagByName).toHaveBeenCalledWith ('Actual')
- expect (postsApi.fetchPosts).toHaveBeenCalledWith (
- expect.objectContaining ({ tags: 'Actual', limit: 8 }),
- )
- })
-
- it ('ignores routes without a prefetcher', async () => {
- await prefetchForURL (qc (), 'http://localhost/unknown')
-
- expect (postsApi.fetchPosts).not.toHaveBeenCalled ()
- expect (tagsApi.fetchTags).not.toHaveBeenCalled ()
- expect (wikiApi.fetchWikiPages).not.toHaveBeenCalled ()
- })
- })
|