Files
RSSHub/lib/api/category/one.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

76 lines
2.6 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { handler, route } from '@/api/category/one';
import { namespaces } from '@/registry';
const createCtx = (param: Record<string, string>, query: Record<string, any> = {}) =>
({
req: {
valid: (type: string) => (type === 'param' ? param : query),
},
json: (data: unknown) => data,
}) as any;
const findCategory = (requireLang = false) => {
for (const [namespace, data] of Object.entries(namespaces)) {
for (const route of Object.values(data.routes)) {
const categories = route.categories || [];
if (categories.length > 0) {
if (requireLang && !data.lang) {
continue;
}
return { namespace, categories, lang: data.lang };
}
}
}
throw new Error('No categories found in registry data');
};
describe('api/category/one', () => {
it('returns namespaces that match a category', () => {
const { categories } = findCategory();
const category = categories[0];
const result = handler(createCtx({ category }, {}));
expect(Object.keys(result)).not.toHaveLength(0);
for (const namespace of Object.values(result)) {
for (const route of Object.values((namespace as { routes: Record<string, { categories?: string[] }> }).routes)) {
expect(route.categories || []).toContain(category);
}
}
});
it('intersects categories and filters by lang', () => {
const { namespace, categories, lang } = findCategory(true);
const [primary, secondary] = categories.length > 1 ? categories : [categories[0], categories[0]];
const selectedLang = lang || namespaces[namespace].lang;
const result = handler(
createCtx(
{ category: primary },
{
categories: [secondary],
lang: selectedLang,
}
)
);
expect(Object.keys(result)).toContain(namespace);
for (const ns of Object.values(result)) {
expect((ns as { lang?: string }).lang).toBe(selectedLang);
}
});
it('parses categories query string into array', () => {
const parsed = route.request?.query?.parse({ categories: 'a,b', lang: 'en' });
expect(parsed?.categories).toEqual(['a', 'b']);
expect(parsed?.lang).toBe('en');
});
it('returns empty result for unknown categories', () => {
const result = handler(createCtx({ category: 'rsshub-unknown-category' }, {}));
expect(result).toEqual({});
});
});