Files
metapi/src/server/services/alertRules.test.ts
T
cita 0f8176cd04 feat: Implement compatibility strategies for responses and chat endpoints
- Added `routeCompatibility.ts` to handle response compatibility for different endpoints.
- Introduced `chatEndpointStrategy.ts` to manage chat endpoint recovery and downgrading logic.
- Created tests for chat formats and input file handling in `chatFormatsCore.test.ts` and `inputFile.test.ts`.
- Developed `endpointCompatibility.ts` to define compatibility checks and header building for various endpoints.
- Implemented protocol lifecycle management in `protocolLifecycle.ts` and corresponding tests in `protocolModel.test.ts`.
- Enhanced tooltip functionality with a new `TooltipLayer` component and associated tests.
- Refactored existing components to improve tooltip handling and ensure proper rendering in the application.
2026-03-09 22:48:10 +08:00

48 lines
2.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { appendSessionTokenRebindHint, isCloudflareChallenge, isTokenExpiredError } from './alertRules.js';
describe('alertRules', () => {
it('detects cloudflare challenge messages', () => {
expect(isCloudflareChallenge('Cloudflare challenge detected')).toBe(true);
expect(isCloudflareChallenge('cf challenge required')).toBe(true);
expect(isCloudflareChallenge('invalid token')).toBe(false);
});
it('detects token expiration by status or message', () => {
expect(isTokenExpiredError({ status: 401, message: 'Unauthorized' })).toBe(true);
expect(isTokenExpiredError({ status: 403, message: 'Forbidden' })).toBe(false);
expect(isTokenExpiredError({ message: 'HTTP 401: access token required' })).toBe(true);
expect(isTokenExpiredError({ message: 'jwt expired' })).toBe(true);
expect(isTokenExpiredError({ message: 'token invalid' })).toBe(true);
expect(isTokenExpiredError({ message: 'invalid access token' })).toBe(true);
expect(isTokenExpiredError({ message: 'Token 无效' })).toBe(true);
expect(isTokenExpiredError({ message: '无权进行此操作,未登录且未提供 access token' })).toBe(false);
expect(isTokenExpiredError({ status: 500, message: 'upstream error' })).toBe(false);
});
it('does not treat endpoint dispatch denial as token expiration', () => {
expect(isTokenExpiredError({
status: 403,
message: 'This group does not allow /v1/messages dispatch',
})).toBe(false);
expect(isTokenExpiredError({
status: 403,
message: 'dispatch denied for /v1/responses',
})).toBe(false);
expect(isTokenExpiredError({
message: 'unauthorized',
})).toBe(false);
});
it('appends rebind hint for invalid access token messages', () => {
expect(appendSessionTokenRebindHint('无权进行此操作,access token 无效'))
.toContain('请在中转站重新生成系统访问令牌后重新绑定账号');
expect(appendSessionTokenRebindHint('invalid access token'))
.toContain('请在中转站重新生成系统访问令牌后重新绑定账号');
});
it('does not append rebind hint for unrelated messages', () => {
expect(appendSessionTokenRebindHint('network timeout')).toBe('network timeout');
});
});