1
0

outbound-tag-rename.test.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { describe, it, expect } from 'vitest';
  2. import type { XraySettingsValue } from '@/hooks/useXraySetting';
  3. import { propagateOutboundTagRename } from '@/pages/xray/basics/helpers';
  4. function baseTemplate(): XraySettingsValue {
  5. return {
  6. outbounds: [
  7. { tag: 'To-External-Proxy', protocol: 'vless' },
  8. { tag: 'direct', protocol: 'freedom' },
  9. ],
  10. routing: {
  11. rules: [
  12. {
  13. type: 'field',
  14. inboundTag: ['iran-in'],
  15. outboundTag: 'To-External-Proxy',
  16. },
  17. ],
  18. balancers: [
  19. {
  20. tag: 'lb-1',
  21. selector: ['To-External-Proxy', 'direct'],
  22. fallbackTag: 'To-External-Proxy',
  23. },
  24. ],
  25. },
  26. } as XraySettingsValue;
  27. }
  28. describe('propagateOutboundTagRename', () => {
  29. it('updates routing rule outboundTag when outbound is renamed', () => {
  30. const t = baseTemplate();
  31. propagateOutboundTagRename(t, 'To-External-Proxy', 'external-vps');
  32. expect(t.routing?.rules?.[0]?.outboundTag).toBe('external-vps');
  33. });
  34. it('updates balancer selector and fallbackTag', () => {
  35. const t = baseTemplate();
  36. propagateOutboundTagRename(t, 'To-External-Proxy', 'external-vps');
  37. expect(t.routing?.balancers?.[0]?.selector).toEqual(['external-vps', 'direct']);
  38. expect(t.routing?.balancers?.[0]?.fallbackTag).toBe('external-vps');
  39. });
  40. it('updates sockopt dialerProxy references in other outbounds', () => {
  41. const t = baseTemplate();
  42. (t.outbounds![1] as { streamSettings?: { sockopt?: { dialerProxy?: string } } }).streamSettings = {
  43. sockopt: { dialerProxy: 'To-External-Proxy' },
  44. };
  45. propagateOutboundTagRename(t, 'To-External-Proxy', 'external-vps');
  46. const dialerProxy = (t.outbounds![1] as { streamSettings?: { sockopt?: { dialerProxy?: string } } })
  47. .streamSettings?.sockopt?.dialerProxy;
  48. expect(dialerProxy).toBe('external-vps');
  49. });
  50. it('is a no-op when old and new tags are equal', () => {
  51. const t = baseTemplate();
  52. propagateOutboundTagRename(t, 'To-External-Proxy', 'To-External-Proxy');
  53. expect(t.routing?.rules?.[0]?.outboundTag).toBe('To-External-Proxy');
  54. });
  55. });