useUserTeams.spec.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import {OrganizationFixture} from 'sentry-fixture/organization';
  2. import {TeamFixture} from 'sentry-fixture/team';
  3. import {reactHooks} from 'sentry-test/reactTestingLibrary';
  4. import OrganizationStore from 'sentry/stores/organizationStore';
  5. import TeamStore from 'sentry/stores/teamStore';
  6. import {isActiveSuperuser} from 'sentry/utils/isActiveSuperuser';
  7. import {QueryClient, QueryClientProvider} from 'sentry/utils/queryClient';
  8. import {useUserTeams} from './useUserTeams';
  9. jest.mock('sentry/utils/isActiveSuperuser', () => ({
  10. isActiveSuperuser: jest.fn(),
  11. }));
  12. const queryClient = new QueryClient({
  13. defaultOptions: {
  14. queries: {
  15. retry: false,
  16. },
  17. },
  18. });
  19. describe('useUserTeams', () => {
  20. const org = OrganizationFixture({
  21. access: [],
  22. });
  23. const wrapper = ({children}: {children?: any}) => (
  24. <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  25. );
  26. beforeEach(function () {
  27. TeamStore.reset();
  28. OrganizationStore.onUpdate(org, {replace: true});
  29. MockApiClient.clearMockResponses();
  30. queryClient.clear();
  31. });
  32. it('does not request user teams until the store has loaded', async function () {
  33. const userTeams = [TeamFixture({id: '1', isMember: true})];
  34. const nonUserTeams = [TeamFixture({id: '2', isMember: false})];
  35. const mockapi = MockApiClient.addMockResponse({
  36. url: `/organizations/org-slug/user-teams/`,
  37. body: userTeams,
  38. });
  39. const {result, waitFor} = reactHooks.renderHook(useUserTeams, {wrapper});
  40. const {teams} = result.current;
  41. expect(teams.length).toBe(0);
  42. expect(TeamStore.getState().loading).toBe(true);
  43. expect(mockapi).toHaveBeenCalledTimes(0);
  44. reactHooks.act(() => TeamStore.loadInitialData(nonUserTeams, true, null));
  45. expect(TeamStore.getState().loading).toBe(false);
  46. expect(TeamStore.getState().loadedUserTeams).toBe(false);
  47. await waitFor(() => result.current.teams.length === 1);
  48. expect(mockapi).toHaveBeenCalledTimes(1);
  49. await waitFor(() => expect(result.current.teams).toEqual(userTeams));
  50. });
  51. it('provides only the users teams', function () {
  52. const userTeams = [TeamFixture({id: '1', isMember: true})];
  53. const nonUserTeams = [TeamFixture({id: '2', isMember: false})];
  54. // User teams marked loaded because hasMore is false
  55. TeamStore.loadInitialData([...userTeams, ...nonUserTeams], false, null);
  56. expect(TeamStore.getState().loadedUserTeams).toBe(true);
  57. const {result} = reactHooks.renderHook(useUserTeams, {wrapper});
  58. const {teams} = result.current;
  59. expect(teams.length).toBe(1);
  60. expect(teams).toEqual(userTeams);
  61. });
  62. it('superuser loads all teams', function () {
  63. jest.mocked(isActiveSuperuser).mockReturnValue(true);
  64. const userTeams = [TeamFixture({id: '1', isMember: true})];
  65. const nonUserTeams = [TeamFixture({id: '2', isMember: false})];
  66. // User teams marked loaded because hasMore is false
  67. TeamStore.loadInitialData([...userTeams, ...nonUserTeams], false, null);
  68. expect(TeamStore.getState().loadedUserTeams).toBe(true);
  69. const {result} = reactHooks.renderHook(useUserTeams, {wrapper});
  70. const {teams} = result.current;
  71. expect(teams.length).toBe(2);
  72. expect(teams).toEqual(userTeams.concat(nonUserTeams));
  73. });
  74. it('org owner loads all teams', function () {
  75. const userTeams = [TeamFixture({id: '1', isMember: true})];
  76. const nonUserTeams = [TeamFixture({id: '2', isMember: false})];
  77. // User teams marked loaded because hasMore is false
  78. TeamStore.loadInitialData([...userTeams, ...nonUserTeams], false, null);
  79. expect(TeamStore.getState().loadedUserTeams).toBe(true);
  80. const organization = OrganizationFixture({
  81. access: ['org:admin'],
  82. });
  83. OrganizationStore.onUpdate(organization, {replace: true});
  84. const {result} = reactHooks.renderHook(() => useUserTeams(), {wrapper});
  85. const {teams} = result.current;
  86. expect(teams.length).toBe(2);
  87. expect(teams).toEqual(userTeams.concat(nonUserTeams));
  88. });
  89. });