client-toggle-traffic-reset.test.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import type { ReactNode } from 'react';
  2. import { act, renderHook } from '@testing-library/react';
  3. import { QueryClientProvider } from '@tanstack/react-query';
  4. import { afterEach, describe, expect, it, vi } from 'vitest';
  5. import { useClients } from '@/hooks/useClients';
  6. import { makeTestQueryClient } from '@/test/test-utils';
  7. import { HttpUtil, Msg } from '@/utils';
  8. afterEach(() => {
  9. vi.restoreAllMocks();
  10. });
  11. describe('client enable toggle', () => {
  12. it.each([false, true])(
  13. 'preserves the hydrated traffic reset cycle when enable=%s',
  14. async (enable) => {
  15. const email = '[email protected]';
  16. vi.spyOn(HttpUtil, 'get').mockResolvedValue(
  17. new Msg(true, '', {
  18. client: {
  19. email,
  20. enable: !enable,
  21. trafficReset: 'monthly',
  22. trafficResetDay: 15,
  23. reset: 0,
  24. resetDay: 0,
  25. resetWeekday: 7,
  26. resetMax: 3,
  27. },
  28. inboundIds: [],
  29. }),
  30. );
  31. const post = vi
  32. .spyOn(HttpUtil, 'post')
  33. .mockImplementation(
  34. async (url: string) =>
  35. new Msg(true, '', url.includes('/setting/defaultSettings') ? {} : null),
  36. );
  37. const queryClient = makeTestQueryClient();
  38. const wrapper = ({ children }: { children: ReactNode }) => (
  39. <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  40. );
  41. const { result } = renderHook(() => useClients({ list: false }), { wrapper });
  42. await act(async () => {
  43. await result.current.setEnable(
  44. { email, trafficReset: 'never', trafficResetDay: 1 },
  45. enable,
  46. );
  47. });
  48. expect(HttpUtil.get).toHaveBeenCalledWith('/panel/api/clients/get/scheduled%40example.com');
  49. expect(post).toHaveBeenCalledWith(
  50. '/panel/api/clients/update/scheduled%40example.com',
  51. expect.objectContaining({
  52. email,
  53. enable,
  54. trafficReset: 'monthly',
  55. trafficResetDay: 15,
  56. reset: 0,
  57. resetDay: 0,
  58. resetWeekday: 7,
  59. resetMax: 3,
  60. }),
  61. { headers: { 'Content-Type': 'application/json' } },
  62. );
  63. },
  64. );
  65. });