useTeams.spec.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import {Organization} from 'fixtures/js-stubs/organization';
  2. import {Team} from 'fixtures/js-stubs/team';
  3. import {reactHooks} from 'sentry-test/reactTestingLibrary';
  4. import OrganizationStore from 'sentry/stores/organizationStore';
  5. import TeamStore from 'sentry/stores/teamStore';
  6. import useTeams from 'sentry/utils/useTeams';
  7. describe('useTeams', function () {
  8. const org = Organization();
  9. const mockTeams = [Team()];
  10. beforeEach(function () {
  11. TeamStore.reset();
  12. });
  13. it('provides teams from the team store', function () {
  14. TeamStore.loadInitialData(mockTeams);
  15. const {result} = reactHooks.renderHook(useTeams);
  16. const {teams} = result.current;
  17. expect(teams).toEqual(mockTeams);
  18. });
  19. it('loads more teams when using onSearch', async function () {
  20. TeamStore.loadInitialData(mockTeams);
  21. OrganizationStore.onUpdate(org, {replace: true});
  22. const newTeam2 = Team({id: '2', slug: 'test-team2'});
  23. const newTeam3 = Team({id: '3', slug: 'test-team3'});
  24. const mockRequest = MockApiClient.addMockResponse({
  25. url: `/organizations/${org.slug}/teams/`,
  26. method: 'GET',
  27. body: [newTeam2, newTeam3],
  28. });
  29. const {result, waitFor} = reactHooks.renderHook(useTeams);
  30. const {onSearch} = result.current;
  31. // Works with append
  32. const onSearchPromise = reactHooks.act(() => onSearch('test'));
  33. expect(result.current.fetching).toBe(true);
  34. await onSearchPromise;
  35. expect(result.current.fetching).toBe(false);
  36. // Wait for state to be reflected from the store
  37. await waitFor(() => result.current.teams.length === 3);
  38. expect(mockRequest).toHaveBeenCalled();
  39. expect(result.current.teams).toEqual([...mockTeams, newTeam2, newTeam3]);
  40. // de-duplicates items in the query results
  41. mockRequest.mockClear();
  42. await reactHooks.act(() => onSearch('test'));
  43. // No new items have been added
  44. expect(mockRequest).toHaveBeenCalled();
  45. expect(result.current.teams).toEqual([...mockTeams, newTeam2, newTeam3]);
  46. });
  47. it('provides only the users teams', function () {
  48. const userTeams = [Team({id: '1', isMember: true})];
  49. const nonUserTeams = [Team({id: '2', isMember: false})];
  50. TeamStore.loadInitialData([...userTeams, ...nonUserTeams], false, null);
  51. const {result} = reactHooks.renderHook(useTeams, {
  52. initialProps: {provideUserTeams: true},
  53. });
  54. const {teams} = result.current;
  55. expect(teams.length).toBe(1);
  56. expect(teams).toEqual(expect.arrayContaining(userTeams));
  57. });
  58. it('provides only the specified slugs', async function () {
  59. TeamStore.loadInitialData(mockTeams);
  60. const teamFoo = Team({slug: 'foo'});
  61. const mockRequest = MockApiClient.addMockResponse({
  62. url: `/organizations/${org.slug}/teams/`,
  63. method: 'GET',
  64. body: [teamFoo],
  65. });
  66. const {result, waitFor} = reactHooks.renderHook(useTeams, {
  67. initialProps: {slugs: ['foo']},
  68. });
  69. expect(result.current.initiallyLoaded).toBe(false);
  70. expect(mockRequest).toHaveBeenCalled();
  71. await waitFor(() => expect(result.current.teams.length).toBe(1));
  72. const {teams} = result.current;
  73. expect(teams).toEqual(expect.arrayContaining([teamFoo]));
  74. });
  75. it('only loads slugs when needed', function () {
  76. TeamStore.loadInitialData(mockTeams);
  77. const {result} = reactHooks.renderHook(useTeams, {
  78. initialProps: {slugs: [mockTeams[0].slug]},
  79. });
  80. const {teams, initiallyLoaded} = result.current;
  81. expect(initiallyLoaded).toBe(true);
  82. expect(teams).toEqual(expect.arrayContaining(mockTeams));
  83. });
  84. it('can load teams by id', async function () {
  85. const requestedTeams = [Team({id: '2', slug: 'requested-team'})];
  86. const mockRequest = MockApiClient.addMockResponse({
  87. url: `/organizations/${org.slug}/teams/`,
  88. method: 'GET',
  89. body: requestedTeams,
  90. });
  91. TeamStore.loadInitialData(mockTeams);
  92. const {result, waitFor} = reactHooks.renderHook(useTeams, {
  93. initialProps: {ids: ['2']},
  94. });
  95. expect(result.current.initiallyLoaded).toBe(false);
  96. expect(mockRequest).toHaveBeenCalled();
  97. await waitFor(() => expect(result.current.teams.length).toBe(1));
  98. const {teams} = result.current;
  99. expect(teams).toEqual(expect.arrayContaining(requestedTeams));
  100. });
  101. it('only loads ids when needed', function () {
  102. TeamStore.loadInitialData(mockTeams);
  103. const {result} = reactHooks.renderHook(useTeams, {
  104. initialProps: {ids: [mockTeams[0].id]},
  105. });
  106. const {teams, initiallyLoaded} = result.current;
  107. expect(initiallyLoaded).toBe(true);
  108. expect(teams).toEqual(expect.arrayContaining(mockTeams));
  109. });
  110. it('correctly returns hasMore before and after store update', async function () {
  111. const {result, waitFor} = reactHooks.renderHook(useTeams);
  112. const {teams, hasMore} = result.current;
  113. expect(hasMore).toBe(null);
  114. expect(teams).toEqual(expect.arrayContaining([]));
  115. reactHooks.act(() => TeamStore.loadInitialData(mockTeams, false, null));
  116. await waitFor(() => expect(result.current.teams.length).toBe(1));
  117. expect(result.current.hasMore).toBe(false);
  118. });
  119. });