useTeamsById.spec.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import {OrganizationFixture} from 'sentry-fixture/organization';
  2. import {TeamFixture} from 'sentry-fixture/team';
  3. import {renderHook, waitFor} from 'sentry-test/reactTestingLibrary';
  4. import OrganizationStore from 'sentry/stores/organizationStore';
  5. import TeamStore from 'sentry/stores/teamStore';
  6. import {QueryClient, QueryClientProvider} from 'sentry/utils/queryClient';
  7. import {useTeamsById as useTeamsById} from './useTeamsById';
  8. const queryClient = new QueryClient({
  9. defaultOptions: {
  10. queries: {
  11. retry: false,
  12. },
  13. },
  14. });
  15. describe('useTeamsById', function () {
  16. const org = OrganizationFixture();
  17. const mockTeams = [TeamFixture()];
  18. const wrapper = ({children}: {children?: any}) => (
  19. <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  20. );
  21. beforeEach(function () {
  22. TeamStore.reset();
  23. OrganizationStore.onUpdate(org, {replace: true});
  24. queryClient.clear();
  25. });
  26. it('provides teams from the team store', function () {
  27. TeamStore.loadInitialData(mockTeams);
  28. const {result} = renderHook(useTeamsById, {wrapper});
  29. const {teams} = result.current;
  30. expect(teams).toEqual(mockTeams);
  31. });
  32. it('waits for the teamstore to load', function () {
  33. const mockRequest = MockApiClient.addMockResponse({
  34. url: `/organizations/${org.slug}/teams/`,
  35. method: 'GET',
  36. body: mockTeams,
  37. });
  38. // TeamStore.loadInitialData not yet called
  39. expect(TeamStore.getState().loading).toBe(true);
  40. const {result} = renderHook(useTeamsById, {
  41. initialProps: {slugs: ['foo']},
  42. wrapper,
  43. });
  44. const {isLoading} = result.current;
  45. expect(isLoading).toBe(true);
  46. expect(mockRequest).not.toHaveBeenCalled();
  47. });
  48. it('provides only the specified slugs', async function () {
  49. TeamStore.loadInitialData(mockTeams);
  50. const teamFoo = TeamFixture({id: '49', slug: 'foo'});
  51. const mockRequest = MockApiClient.addMockResponse({
  52. url: `/organizations/${org.slug}/teams/`,
  53. method: 'GET',
  54. body: [teamFoo],
  55. });
  56. const {result} = renderHook(useTeamsById, {
  57. initialProps: {slugs: ['foo']},
  58. wrapper,
  59. });
  60. expect(result.current.isLoading).toBe(true);
  61. expect(mockRequest).toHaveBeenCalled();
  62. await waitFor(() => {
  63. expect(result.current.teams.length).toBe(1);
  64. });
  65. const {teams} = result.current;
  66. expect(teams).toEqual(expect.arrayContaining([teamFoo]));
  67. expect(TeamStore.getState().teams).toEqual(expect.arrayContaining([teamFoo]));
  68. });
  69. it('only loads slugs when needed', function () {
  70. TeamStore.loadInitialData(mockTeams);
  71. const {result} = renderHook(useTeamsById, {
  72. initialProps: {slugs: [mockTeams[0].slug]},
  73. wrapper,
  74. });
  75. const {teams, isLoading} = result.current;
  76. expect(isLoading).toBe(false);
  77. expect(teams).toEqual(expect.arrayContaining(mockTeams));
  78. });
  79. it('can load teams by id', async function () {
  80. const requestedTeams = [TeamFixture({id: '2', slug: 'requested-team'})];
  81. const mockRequest = MockApiClient.addMockResponse({
  82. url: `/organizations/${org.slug}/teams/`,
  83. method: 'GET',
  84. body: requestedTeams,
  85. });
  86. TeamStore.loadInitialData(mockTeams);
  87. const {result} = renderHook(useTeamsById, {
  88. initialProps: {ids: ['2']},
  89. wrapper,
  90. });
  91. expect(result.current.isLoading).toBe(true);
  92. expect(mockRequest).toHaveBeenCalled();
  93. await waitFor(() => expect(result.current.teams.length).toBe(1));
  94. const {teams} = result.current;
  95. expect(teams).toEqual(expect.arrayContaining(requestedTeams));
  96. expect(TeamStore.getState().teams).toEqual(expect.arrayContaining(requestedTeams));
  97. });
  98. it('only loads ids when needed', function () {
  99. TeamStore.loadInitialData(mockTeams);
  100. const {result} = renderHook(useTeamsById, {
  101. initialProps: {ids: [mockTeams[0].id]},
  102. wrapper,
  103. });
  104. const {teams, isLoading} = result.current;
  105. expect(isLoading).toBe(false);
  106. expect(teams).toEqual(expect.arrayContaining(mockTeams));
  107. });
  108. });