mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-09-01 14:57:14 +08:00
81ff849337
* feat(tests): add comprehensive unit tests for various utility functions and views - Implement tests for cache utility to ensure proper behavior with no cache and TTL keys. - Add tests for common utilities including string manipulation and path handling. - Introduce tests for directory import functionality to validate file imports and pattern matching. - Create tests for git hash retrieval to handle fallback scenarios. - Develop tests for deprecated got utility to verify response handling and retry logic. - Enhance got utility tests to include request hooks and search parameter handling. - Mock header generator tests to validate user agent handling. - Expand helpers tests to cover current path retrieval and duration parsing. - Implement tests for ofetch utility to ensure proper proxy handling and logging. - Add OpenTelemetry metric tests to validate metric serialization. - Create proxy tests to verify multi-proxy selection and failure handling. - Introduce request rewriter tests to validate fetch and get wrapper functionality. - Add timezone utility tests to handle various input types. - Implement view tests for Atom and RSS rendering to ensure correct output. - Create index view tests to validate debug information display based on configuration. * refactor: remove deprecated got implementation and associated tests * test: expand coverage for api, middleware, and utils
67 lines
2.1 KiB
TypeScript
67 lines
2.1 KiB
TypeScript
import http from 'node:http';
|
|
|
|
import { http as mswHttp, HttpResponse } from 'msw';
|
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
const loadOfetchWithLogger = async () => {
|
|
vi.resetModules();
|
|
const { default: logger } = await import('@/utils/logger');
|
|
const { default: ofetch } = await import('@/utils/ofetch');
|
|
return { logger, ofetch };
|
|
};
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
vi.unstubAllGlobals();
|
|
});
|
|
|
|
describe('ofetch', () => {
|
|
it('marks prefer-proxy header on retryable responses', async () => {
|
|
const { default: server } = await import('@/setup.test');
|
|
server.use(mswHttp.get('http://rsshub.test/fail-500', () => HttpResponse.text('fail', { status: 500 })));
|
|
|
|
const { logger, ofetch } = await loadOfetchWithLogger();
|
|
const warnSpy = vi.spyOn(logger, 'warn').mockImplementation(() => logger);
|
|
|
|
await expect(
|
|
ofetch('http://rsshub.test/fail-500', {
|
|
retry: 1,
|
|
retryDelay: 0,
|
|
onResponse({ options }) {
|
|
options.headers = null as unknown as Headers;
|
|
},
|
|
})
|
|
).rejects.toBeDefined();
|
|
|
|
expect(warnSpy).toHaveBeenCalled();
|
|
});
|
|
|
|
it('logs redirected responses', async () => {
|
|
const { logger, ofetch } = await loadOfetchWithLogger();
|
|
const httpSpy = vi.spyOn(logger, 'http').mockImplementation(() => logger);
|
|
|
|
const server = http.createServer((req, res) => {
|
|
if (req.url === '/redirect') {
|
|
res.statusCode = 302;
|
|
res.setHeader('Location', '/target');
|
|
res.end();
|
|
return;
|
|
}
|
|
res.statusCode = 200;
|
|
res.end('ok');
|
|
});
|
|
|
|
await new Promise<void>((resolve) => server.listen(0, resolve));
|
|
const address = server.address();
|
|
const port = typeof address === 'object' && address ? address.port : 0;
|
|
|
|
try {
|
|
await ofetch(`http://127.0.0.1:${port}/redirect`);
|
|
} finally {
|
|
server.close();
|
|
}
|
|
|
|
expect(httpSpy).toHaveBeenCalled();
|
|
});
|
|
});
|