import { describe, it, expect, vi, beforeEach } from 'vitest'
import { useLottery } from '../use-lottery'
import { nextTick } from 'vue'
import { useRuntimeConfig } from 'nuxt/app'
import { formatDate, toDate } from '#lib/utils'
import dayjs, { Dayjs } from 'dayjs'
// Mocking necessary functions and utilities
vi.mock('nuxt/app', () => ({
useRuntimeConfig: vi.fn(),
}))
vi.mock('#lib/utils', () => ({
formatDate: vi.fn(),
toDate: vi.fn(),
}))
vi.mock('#lib/constants', () => ({
DATE_TIME_FORMAT: {
SHORT_DATE_FORMAT: 'YYYY-MM-DD',
},
PRIZES: [
{ key: 'special', value: 'Special Prize' },
{ key: 'first', value: 'First Prize' },
// Add more prizes as needed
],
}))
const mockFetch = vi.fn()
vi.stubGlobal('$fetch', mockFetch)
describe('useLottery', () => {
beforeEach(() => {
vi.clearAllMocks()
useRuntimeConfig.mockReturnValue({
public: {
DOMAIN_LOTTERY_RESULT: 'https://example.com',
},
})
formatDate.mockImplementation((date) => date)
toDate.mockImplementation(() => new Date('2023-01-01'))
})
it('should format and highlight numbers in the result via renderHtmlTables', () => {
const { renderHtmlTables, probeNumber, lotteryTable } = useLottery()
// Setup data
probeNumber.value = '45'
lotteryTable.lottery.result = {
special: '12345-67890',
first: '67890-12345',
}
const formattedTables = renderHtmlTables()
expect(formattedTables[0].value).toContain(
'45',
)
expect(formattedTables[1].value).toContain(
'45',
)
})
it('should replace specific text patterns correctly', () => {
const { replaceText } = useLottery()
let input = 'Kết quả xổ số ngày hôm nay'
let output = replaceText(input)
expect(output).toBe('Kết quả xổ số, ngày hôm nay')
input = 'Kết quả 2023-01-01'
output = replaceText(input)
expect(output).toBe('Kết quả 2023/01/01')
input = 'Kết quả chưa có kết quả'
output = replaceText(input)
expect(output).toBe('Kết quả')
input = 'Kết quả ngày 2023-01-01 chưa có kết quả'
output = replaceText(input)
expect(output).toBe('Kết quả, ngày 2023/01/01')
input = 'Kết quả xổ số'
output = replaceText(input)
expect(output).toBe('Kết quả xổ số')
})
it('should update lottery results when region changes', async () => {
const mockRegion = { id: 1, name: 'City A' }
const { onChangeRegion, lotteryHeader } = useLottery()
onChangeRegion(mockRegion)
await nextTick()
expect(lotteryHeader.region.id).toBe(1)
})
it('should handle date change and fetch cities correctly', async () => {
const { onChangeDate, lotteryHeader } = useLottery()
mockFetch.mockResolvedValueOnce({
rows: [
{ id: 1, name: 'City A' },
{ id: 2, name: 'City B' },
],
})
onChangeDate('2023-01-02')
await nextTick()
expect(formatDate).toHaveBeenCalledWith('2023-01-02', 'YYYY-MM-DD')
expect(lotteryHeader.date).toBe('2023-01-02')
expect(mockFetch).toHaveBeenCalledWith('https://example.com/lotte/cities', {
query: { date: '2023-01-02' },
})
})
// it('should fetch lottery results correctly', async () => {
// const { onChangeRegion, lotteryTable } = useLottery()
// mockFetch.mockResolvedValueOnce({
// rows: {
// title: 'Lottery Title',
// result: { special: '12345', prize1: '67890' },
// },
// })
// await onChangeRegion({ id: 2, name: 'City B' })
// console.log('lotteryTable nguyen', lotteryTable);
// expect(lotteryTable.lottery.title).toBe('Lottery Title')
// expect(lotteryTable.lottery.result.special).toBe('12345')
// })
it('should format and highlight numbers in the result via renderHtmlTables', () => {
const { renderHtmlTables, probeNumber, lotteryTable } = useLottery()
// Setup data
probeNumber.value = '45'
lotteryTable.lottery.result = {
special: '12345-67890',
first: '67890-12345',
}
const formattedTables = renderHtmlTables()
expect(formattedTables[0].value).toContain(
'45',
)
expect(formattedTables[1].value).toContain(
'45',
)
})
it('should replace specific text patterns correctly', () => {
const { replaceText } = useLottery()
let input = 'Kết quả xổ số ngày hôm nay'
let output = replaceText(input)
expect(output).toBe('Kết quả xổ số, ngày hôm nay')
input = 'Kết quả 2023-01-01'
output = replaceText(input)
expect(output).toBe('Kết quả 2023/01/01')
input = 'Kết quả chưa có kết quả'
output = replaceText(input)
expect(output).toBe('Kết quả')
input = 'Kết quả ngày 2023-01-01 chưa có kết quả'
output = replaceText(input)
expect(output).toBe('Kết quả, ngày 2023/01/01')
input = 'Kết quả xổ số'
output = replaceText(input)
expect(output).toBe('Kết quả xổ số')
})
it('should update lottery results when region changes', async () => {
const mockRegion = { id: 1, name: 'City A' }
const { onChangeRegion, lotteryHeader } = useLottery()
await onChangeRegion(mockRegion)
await nextTick()
expect(lotteryHeader.region.id).toBe(1)
})
it('should handle date change and fetch cities correctly', async () => {
const { onChangeDate, lotteryHeader } = useLottery()
mockFetch.mockResolvedValueOnce({
rows: [
{ id: 1, name: 'City A' },
{ id: 2, name: 'City B' },
],
})
await onChangeDate(dayjs('2023-01-02'))
await nextTick()
expect(formatDate).toHaveBeenCalledWith(
'Sun, 01 Jan 2023 17:00:00 GMT',
'YYYY-MM-DD',
)
})
// it('should handle no cities returned by fetchCities', async () => {
// const { onChangeDate, regions, lotteryHeader } = useLottery()
// mockFetch.mockResolvedValueOnce({
// rows: [],
// })
// onChangeDate({ toString: () => '2023-01-02' })
// await nextTick()
// expect(regions.value).toEqual([])
// expect(lotteryHeader.region).toBeNull()
// })
// it('should update lottery results when calling onSearchNumber', () => {
// const { onSearchNumber, lotteryTable } = useLottery()
// lotteryTable.originalResult = {
// special: '12345-67890',
// first: '98765-43210',
// }
// onSearchNumber(2)
// expect(lotteryTable.lottery.result.special).toBe('45 - 90')
// expect(lotteryTable.lottery.result.first).toBe('65 - 10')
// })
// it('should render correct HTML tables when calling renderHtmlTables', () => {
// const { renderHtmlTables, lotteryTable } = useLottery()
// lotteryTable.lottery.result = {
// special: '12345',
// first: '67890',
// }
// const result = renderHtmlTables()
// expect(result).toEqual([
// { key: 'special', value: '12345', name: 'Special Prize' },
// { key: 'first', value: '67890', name: 'First Prize' },
// // Additional checks for other prizes
// ])
// })
})