| import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; | |
| describe('pkg', () => { | |
| beforeEach(() => { | |
| vi.resetModules(); | |
| }); | |
| afterEach(() => { | |
| delete process.env.IS_PACKAGE; | |
| delete process.env.UA; | |
| }); | |
| it('requires init before request', async () => { | |
| const { request } = await import('./pkg'); | |
| await expect(request('/test/1')).rejects.toThrow('RSSHub not initialized. Please call init() first.'); | |
| }); | |
| it('config', async () => { | |
| const { init } = await import('./pkg'); | |
| await init({ | |
| UA: 'mock', | |
| }); | |
| const { config } = await import('./config'); | |
| expect(config.ua).toBe('mock'); | |
| }); | |
| it('request', async () => { | |
| const { init, request } = await import('./pkg'); | |
| await init(); | |
| const data = await request('/test/1'); | |
| expect(data).toMatchObject({ | |
| atomlink: 'http://localhost/test/1', | |
| title: 'Test 1', | |
| itunes_author: null, | |
| link: 'https://github.com/DIYgod/RSSHub', | |
| item: [ | |
| { | |
| title: 'Title1', | |
| description: 'Description1', | |
| pubDate: 'Mon, 31 Dec 2018 15:59:50 GMT', | |
| link: 'https://github.com/DIYgod/RSSHub/issues/1', | |
| author: 'DIYgod1', | |
| }, | |
| { | |
| title: 'Title2', | |
| description: 'Description2', | |
| pubDate: 'Mon, 31 Dec 2018 15:59:40 GMT', | |
| link: 'https://github.com/DIYgod/RSSHub/issues/2', | |
| author: 'DIYgod2', | |
| }, | |
| { | |
| title: 'Title3', | |
| description: 'Description3', | |
| pubDate: 'Mon, 31 Dec 2018 15:59:30 GMT', | |
| link: 'https://github.com/DIYgod/RSSHub/issues/3', | |
| author: 'DIYgod3', | |
| }, | |
| { | |
| title: 'Title4', | |
| description: 'Description4', | |
| pubDate: 'Mon, 31 Dec 2018 15:59:20 GMT', | |
| link: 'https://github.com/DIYgod/RSSHub/issues/4', | |
| author: 'DIYgod4', | |
| }, | |
| { | |
| title: 'Title5', | |
| description: 'Description5', | |
| pubDate: 'Mon, 31 Dec 2018 15:59:10 GMT', | |
| link: 'https://github.com/DIYgod/RSSHub/issues/5', | |
| author: 'DIYgod5', | |
| }, | |
| ], | |
| allowEmpty: false, | |
| }); | |
| }); | |
| it('error', async () => { | |
| try { | |
| const { init, request } = await import('./pkg'); | |
| await init(); | |
| await request('/test/error'); | |
| } catch (error) { | |
| expect(error).toBe('Error test'); | |
| } | |
| }); | |
| it('registerRoute adds custom routes and namespaces', async () => { | |
| const { init, registerRoute, request } = await import('./pkg'); | |
| await init(); | |
| await registerRoute( | |
| 'custom', | |
| { | |
| path: '/hello', | |
| name: 'Custom Hello', | |
| handler: () => ({ | |
| title: 'Custom', | |
| link: 'https://example.com', | |
| item: [ | |
| { | |
| title: 'Entry', | |
| link: 'https://example.com/entry', | |
| }, | |
| ], | |
| allowEmpty: true, | |
| }), | |
| }, | |
| { | |
| name: 'Custom Namespace', | |
| url: 'https://example.com', | |
| lang: 'en', | |
| } | |
| ); | |
| const data = await request('/custom/hello'); | |
| expect(data.title).toBe('Custom'); | |
| const { namespaces } = await import('./registry'); | |
| expect(namespaces.custom?.name).toBe('Custom Namespace'); | |
| expect(namespaces.custom?.routes['/hello']).toBeDefined(); | |
| }); | |
| it('registerRoute supports handlers that return Response', async () => { | |
| const { init, registerRoute } = await import('./pkg'); | |
| await init(); | |
| await registerRoute('custom-response', { | |
| path: '/hello', | |
| name: 'Custom Response', | |
| handler: () => new Response('ok'), | |
| }); | |
| const app = (await import('@/app')).default; | |
| const response = await app.request('/custom-response/hello'); | |
| expect(await response.text()).toBe('ok'); | |
| }); | |
| }); | |