Files
RSSHub/lib/utils/proxy/unify-proxy.test.ts
T
DIYgod 81ff849337 feat(tests): add comprehensive unit tests for various utility functions and views (#20779)
* 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
2025-12-29 17:34:48 +08:00

149 lines
5.4 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import unifyProxy, { unifyProxies } from '@/utils/proxy/unify-proxy';
const emptyProxyObj = {
protocol: undefined,
host: undefined,
port: undefined,
auth: undefined,
url_regex: '.*',
};
const effectiveExpect = ({ proxyUri, proxyObj }, expectUri, expectObj) => {
expect(proxyUri).toBe(expectUri);
expect(proxyObj).toEqual(expectObj);
};
describe('unify-proxy', () => {
const nullExpect = (unified) => effectiveExpect(unified, undefined, emptyProxyObj);
it('proxy empty', () => {
nullExpect(unifyProxy('', emptyProxyObj));
});
it('proxy-uri invalid', () => {
nullExpect(unifyProxy('http://inv lid.test', emptyProxyObj));
});
it('proxy-uri invalid protocol', () => {
nullExpect(unifyProxy('ftp://rsshub.proxy', emptyProxyObj));
});
it('proxy-obj no host', () => {
nullExpect(unifyProxy('', { ...emptyProxyObj, protocol: 'http', port: '2333' }));
});
it('proxy-obj invalid host', () => {
nullExpect(unifyProxy('', { ...emptyProxyObj, protocol: 'http', host: 'inv lid.test', port: '2333' }));
});
it('proxy-obj invalid protocol', () => {
nullExpect(unifyProxy('', { ...emptyProxyObj, protocol: 'ftp', host: 'rsshub.proxy', port: '2333' }));
});
const httpNoPortUri = 'http://rsshub.proxy';
const httpNoPortObj = { ...emptyProxyObj, protocol: 'http', host: 'rsshub.proxy' };
const httpNoPortExpect = (unified) => effectiveExpect(unified, httpNoPortUri, httpNoPortObj);
it('proxy-uri http no port', () => {
httpNoPortExpect(unifyProxy(httpNoPortUri, emptyProxyObj));
});
it('proxy-obj http no port', () => {
httpNoPortExpect(unifyProxy('', httpNoPortObj));
});
const httpUri = 'http://rsshub.proxy:2333';
const httpObj = { ...httpNoPortObj, port: '2333' };
const httpExpect = (unified) => effectiveExpect(unified, httpUri, httpObj);
it('proxy-uri http', () => {
httpExpect(unifyProxy(httpUri, emptyProxyObj));
});
it('proxy-obj http', () => {
httpExpect(unifyProxy('', httpObj));
});
const httpsUri = 'https://rsshub.proxy:2333';
const httpsObj = { ...httpObj, protocol: 'https' };
const httpsExpect = (unified) => effectiveExpect(unified, httpsUri, httpsObj);
it('proxy-uri https', () => {
httpsExpect(unifyProxy(httpsUri, emptyProxyObj));
});
it('proxy-obj https', () => {
httpsExpect(unifyProxy('', httpsObj));
});
const socks5Uri = 'socks5://rsshub.proxy:2333';
const socks5Obj = { ...httpObj, protocol: 'socks5' };
const socks5Expect = (unified) => effectiveExpect(unified, socks5Uri, socks5Obj);
it('proxy-uri socks5', () => {
socks5Expect(unifyProxy(socks5Uri, emptyProxyObj));
});
it('proxy-obj socks5', () => {
socks5Expect(unifyProxy('', socks5Obj));
});
const overrideObj = { ...emptyProxyObj, protocol: 'http', host: 'over.ride', port: '6666' };
it('proxy-uri override proxy-obj {PROTOCAL,HOST,PORT}', () => {
socks5Expect(unifyProxy(socks5Uri, overrideObj));
});
const noProtocolUri = 'rsshub.proxy:2333';
it('proxy-uri no protocol', () => {
httpExpect(unifyProxy(noProtocolUri, emptyProxyObj));
});
const noProtocolObj = { ...httpObj, protocol: undefined };
it('proxy-obj no protocol', () => {
httpExpect(unifyProxy('', noProtocolObj));
});
const protocolInHostObj = { ...httpObj, host: httpNoPortUri, protocol: undefined };
it('proxy-obj protocol in host', () => {
httpExpect(unifyProxy('', protocolInHostObj));
});
const portInHostObj = { ...httpNoPortObj, host: httpUri };
it('proxy-obj port in host', () => {
httpExpect(unifyProxy('', portInHostObj));
});
const everythingInHostObj = { ...emptyProxyObj, host: httpUri };
it('proxy-obj everything in host', () => {
httpExpect(unifyProxy('', everythingInHostObj));
});
const portBothObj = { ...portInHostObj, port: '6666' };
it('proxy-obj port in host override proxy-obj port', () => {
httpExpect(unifyProxy('', portBothObj));
});
const PortNaNObj = { ...httpNoPortObj, port: 'test' };
it('proxy-obj port NaN', () => {
httpNoPortExpect(unifyProxy('', PortNaNObj));
});
const httpsAuthUri = 'https://user:pass@rsshub.proxy:2333';
it('proxy-uri https auth', () => {
effectiveExpect(unifyProxy(httpsAuthUri, emptyProxyObj), httpsAuthUri, httpsObj);
});
const httpsAuthObj = { ...httpsObj, auth: 'testtest' };
it('proxy-obj https auth', () => {
effectiveExpect(unifyProxy('', httpsAuthObj), httpsUri, httpsAuthObj);
});
const socks5AuthUri = 'socks5://user:pass@rsshub.proxy:2333';
it('proxy-uri socks5 auth', () => {
effectiveExpect(unifyProxy(socks5AuthUri, emptyProxyObj), socks5AuthUri, socks5Obj);
});
const socks5AuthObj = { ...socks5Obj, auth: 'testtest' };
it('proxy-obj socks5 auth (invalid)', () => {
socks5Expect(unifyProxy('', socks5AuthObj));
});
it('proxy-uri user@pass override proxy-obj auth', () => {
effectiveExpect(unifyProxy(httpsAuthUri, httpsAuthObj), httpsAuthUri, httpsObj);
});
it('unifyProxies filters invalid proxy uris', () => {
const results = unifyProxies(['http://rsshub.proxy:2333', 'http://inv lid.test'], emptyProxyObj);
expect(results).toHaveLength(1);
expect(results[0].proxyUri).toBe('http://rsshub.proxy:2333');
});
});