import React from 'react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { render, screen, waitFor } from '@testing-library/react'
import nock from 'nock'
import GithubStar from './index'
const GITHUB_HOST = 'https://api.github.com'
const GITHUB_PATH = '/repos/langgenius/dify'
const renderWithQueryClient = () => {
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
})
return render(
,
)
}
const mockGithubStar = (status: number, body: Record, delayMs = 0) => {
return nock(GITHUB_HOST).get(GITHUB_PATH).delay(delayMs).reply(status, body)
}
describe('GithubStar', () => {
beforeEach(() => {
nock.cleanAll()
})
// Shows fetched star count when request succeeds
it('should render fetched star count', async () => {
mockGithubStar(200, { stargazers_count: 123456 })
renderWithQueryClient()
expect(await screen.findByText('123,456')).toBeInTheDocument()
})
// Falls back to default star count when request fails
it('should render default star count on error', async () => {
mockGithubStar(500, {})
renderWithQueryClient()
expect(await screen.findByText('110,918')).toBeInTheDocument()
})
// Renders loader while fetching data
it('should show loader while fetching', async () => {
mockGithubStar(200, { stargazers_count: 222222 }, 50)
const { container } = renderWithQueryClient()
expect(container.querySelector('.animate-spin')).toBeInTheDocument()
await waitFor(() => expect(screen.getByText('222,222')).toBeInTheDocument())
})
})