useAdvisorSignals.test.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
  2. import { act, renderHook, waitFor } from '@testing-library/react'
  3. import { PropsWithChildren } from 'react'
  4. import { beforeEach, describe, expect, it, vi } from 'vitest'
  5. import { useAdvisorSignals } from './useAdvisorSignals'
  6. const { mockUseBannedIPsQuery } = vi.hoisted(() => ({
  7. mockUseBannedIPsQuery: vi.fn(),
  8. }))
  9. vi.mock('@/data/banned-ips/banned-ips-query', () => ({
  10. useBannedIPsQuery: mockUseBannedIPsQuery,
  11. }))
  12. const createWrapper = () => {
  13. const queryClient = new QueryClient({
  14. defaultOptions: {
  15. queries: {
  16. retry: false,
  17. },
  18. },
  19. })
  20. return function Wrapper({ children }: PropsWithChildren) {
  21. return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  22. }
  23. }
  24. describe('useAdvisorSignals', () => {
  25. beforeEach(() => {
  26. window.localStorage.clear()
  27. vi.clearAllMocks()
  28. })
  29. it('resurfaces a dismissed banned-IP signal after the IP disappears and is banned again', async () => {
  30. let bannedIPs = ['203.0.113.10']
  31. mockUseBannedIPsQuery.mockImplementation(() => ({
  32. data: {
  33. banned_ipv4_addresses: bannedIPs,
  34. },
  35. isPending: false,
  36. isError: false,
  37. }))
  38. const { result, rerender } = renderHook(
  39. () => useAdvisorSignals({ projectRef: 'project-ref' }),
  40. {
  41. wrapper: createWrapper(),
  42. }
  43. )
  44. expect(result.current.data).toHaveLength(1)
  45. act(() => {
  46. result.current.dismissSignal('signal:banned-ip:203.0.113.10:v1')
  47. })
  48. await waitFor(() => {
  49. expect(result.current.data).toEqual([])
  50. })
  51. bannedIPs = []
  52. rerender()
  53. await waitFor(() => {
  54. expect(window.localStorage.getItem('advisor-signal-dismissals:project-ref')).toBe('[]')
  55. })
  56. bannedIPs = ['203.0.113.10']
  57. rerender()
  58. await waitFor(() => {
  59. expect(result.current.data).toHaveLength(1)
  60. expect(result.current.data[0].sourceData.ip).toBe('203.0.113.10')
  61. })
  62. })
  63. })