import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { SiteDataService } from '../site-data.service'; describe('SiteDataService', () => { it('возвращает имя сервиса', () => { expect(SiteDataService.getServiceName()).toBe('SiteDataService'); }); it('пустые геттеры коллекций отдают [] до загрузки данных', () => { expect(SiteDataService.getAntiAdblokDomains()).toEqual([]); expect(SiteDataService.getSiteLanguages()).toEqual([]); expect(SiteDataService.getSiteNiches()).toEqual([]); }); describe('fetchSiteData', () => { const fetchMock = vi.fn(); beforeEach(() => { vi.stubGlobal('$fetch', fetchMock); fetchMock.mockReset(); }); afterEach(() => { vi.unstubAllGlobals(); }); it('раскладывает ответы трёх эндпоинтов по геттерам', async () => { fetchMock.mockImplementation((url: string) => { if (url.endsWith('/v1/site')) { return Promise.resolve({ data: { antiAdblockDomains: ['ads.example'], debugMode: false, enabled: true, recaptchaPublicKey: 'key' }, }); } if (url.endsWith('/v1/site/languages')) { return Promise.resolve({ data: { items: [{ guid: 'l1', title: 'English' }] } }); } if (url.endsWith('/v1/site/niches')) { return Promise.resolve({ data: { items: [{ guid: 'n1', title: 'Gay' }] } }); } return Promise.resolve({ data: {} }); }); await SiteDataService.fetchSiteData(); expect(SiteDataService.getAntiAdblokDomains()).toEqual(['ads.example']); expect(SiteDataService.isSiteEnabled()).toBe(true); expect(SiteDataService.getSiteLanguages()).toEqual([{ guid: 'l1', title: 'English' }]); expect(SiteDataService.getSiteNiches()).toEqual([{ guid: 'n1', title: 'Gay' }]); }); it('ошибка запроса не пробрасывается наружу', async () => { const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); fetchMock.mockRejectedValue(new Error('network')); await expect(SiteDataService.fetchSiteData()).resolves.toBeUndefined(); expect(consoleSpy).toHaveBeenCalled(); consoleSpy.mockRestore(); }); }); });