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 // ]) // }) })