1
0

protocols.test.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { describe, it, expect } from 'vitest';
  2. import { recommend } from './protocols';
  3. describe('recommend', () => {
  4. it('recommends REALITY for heavy censorship + modern clients', () => {
  5. const r = recommend({ useCase: 'censorship', censorship: 'high', clientSupport: 'modern' });
  6. expect(r.protocol).toBe('VLESS');
  7. expect(r.security).toContain('REALITY');
  8. expect(r.links.some((l) => l.href === '/docs/config/reality')).toBe(true);
  9. });
  10. it('falls back to VMess+WS+TLS for broad clients under censorship', () => {
  11. const r = recommend({ useCase: 'censorship', censorship: 'high', clientSupport: 'broad' });
  12. expect(r.protocol).toBe('VMess');
  13. expect(r.transport).toBe('WebSocket');
  14. expect(r.security).toBe('TLS');
  15. });
  16. it('recommends Trojan for speed with broad clients', () => {
  17. const r = recommend({ useCase: 'speed', censorship: 'low', clientSupport: 'broad' });
  18. expect(r.protocol).toBe('Trojan');
  19. });
  20. it('recommends a CDN-friendly default for general modern use', () => {
  21. const r = recommend({ useCase: 'general', censorship: 'low', clientSupport: 'modern' });
  22. expect(r.protocol).toBe('VLESS');
  23. expect(r.transport).toBe('WebSocket');
  24. });
  25. it('always returns a non-empty rationale and at least one link', () => {
  26. const r = recommend({ useCase: 'general', censorship: 'medium', clientSupport: 'broad' });
  27. expect(r.rationale.length).toBeGreaterThan(0);
  28. expect(r.links.length).toBeGreaterThan(0);
  29. });
  30. });