// @vitest-environment jsdom
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { render, screen, waitFor } from '@testing-library/react'
import type { PropsWithChildren } from 'react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { AlbumSource } from '~/universal/types/cloudAlbum'
import { NavType } from '@/components/main/album/utils'
vi.mock('react-i18next', () => ({
useTranslation: () => ({ t: (key: string) => key })
}))
vi.mock('@/adapters/cloud-album', () => ({
cloudAlbumAdapter: {
getStats: vi.fn()
}
}))
vi.mock('@/components/common/album-source-switcher', () => ({
AlbumSourceSwitcher: () => null
}))
vi.mock('@/components/common/cloud-feature-highlights', () => ({
CloudFeatureHighlights: () => null
}))
vi.mock('@/components/common/cloud-refresh-button', () => ({
CloudRefreshButton: () => null
}))
vi.mock('@/components/main/album/cloud-loading', () => ({
CloudSidebarSkeleton: () =>
}))
vi.mock('@/store', () => ({
useAppStore: {
use: {
picBeds: () => [
{ type: 'picgo-cloud', name: 'PicGo Cloud', visible: true }
]
}
}
}))
import { cloudAlbumAdapter } from '@/adapters/cloud-album'
import { AlbumSidebar } from '@/components/main/album/album-sidebar'
const buildWrapper = () => {
const client = new QueryClient({
defaultOptions: { queries: { retry: false, gcTime: 0 } }
})
const Wrapper = ({ children }: PropsWithChildren) => (
{children}
)
return { client, Wrapper }
}
const baseProps = {
images: [],
providers: [],
navContext: { type: NavType.All, value: 'all' },
albumSource: AlbumSource.CLOUD,
isCloudAvailable: true,
onFilterChange: () => {}
}
describe('AlbumSidebar (cloud mode)', () => {
beforeEach(() => {
vi.clearAllMocks()
})
afterEach(() => {
vi.clearAllMocks()
})
it('renders All Photos count and provider count from stats query', async () => {
vi.mocked(cloudAlbumAdapter.getStats).mockResolvedValue({
success: true,
data: { total: 7, types: [{ type: 'picgo-cloud', count: 7 }] }
} as unknown as Awaited>)
const { Wrapper } = buildWrapper()
render(, { wrapper: Wrapper })
await waitFor(() => {
expect(screen.getByText('ALBUM_ALL_PHOTOS')).toBeTruthy()
expect(screen.getAllByText('7').length).toBeGreaterThanOrEqual(1)
expect(screen.getByText('PicGo Cloud')).toBeTruthy()
})
expect(cloudAlbumAdapter.getStats).toHaveBeenCalledOnce()
})
it('shows "—" for All Photos count when stats query errors out', async () => {
vi.mocked(cloudAlbumAdapter.getStats).mockResolvedValue({
success: false,
error: 'boom'
} as unknown as Awaited>)
const { Wrapper } = buildWrapper()
render(, { wrapper: Wrapper })
await waitFor(() => {
expect(screen.getByText('—')).toBeTruthy()
})
})
it('does not call stats adapter when isCloudAvailable=false', async () => {
const { Wrapper } = buildWrapper()
render(
,
{ wrapper: Wrapper }
)
// give react-query a microtask
await Promise.resolve()
expect(cloudAlbumAdapter.getStats).not.toHaveBeenCalled()
})
it('does not call stats adapter when albumSource is LOCAL', async () => {
const { Wrapper } = buildWrapper()
render(
,
{ wrapper: Wrapper }
)
await Promise.resolve()
expect(cloudAlbumAdapter.getStats).not.toHaveBeenCalled()
})
})