useMembers.spec.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import {OrganizationFixture} from 'sentry-fixture/organization';
  2. import {UserFixture} from 'sentry-fixture/user';
  3. import {act, renderHook, waitFor} from 'sentry-test/reactTestingLibrary';
  4. import MemberListStore from 'sentry/stores/memberListStore';
  5. import OrganizationStore from 'sentry/stores/organizationStore';
  6. import {useMembers} from 'sentry/utils/useMembers';
  7. describe('useMembers', function () {
  8. const org = OrganizationFixture();
  9. const mockUsers = [UserFixture()];
  10. beforeEach(function () {
  11. MemberListStore.reset();
  12. OrganizationStore.onUpdate(org, {replace: true});
  13. });
  14. it('provides members from the MemberListStore', function () {
  15. MemberListStore.loadInitialData(mockUsers);
  16. const {result} = renderHook(useMembers);
  17. const {members} = result.current;
  18. expect(members).toEqual(mockUsers);
  19. });
  20. it('loads more members when using onSearch', async function () {
  21. MemberListStore.loadInitialData(mockUsers);
  22. const newUser2 = UserFixture({id: '2', email: 'test-user2@example.com'});
  23. const newUser3 = UserFixture({id: '3', email: 'test-user3@example.com'});
  24. const mockRequest = MockApiClient.addMockResponse({
  25. url: `/organizations/${org.slug}/members/`,
  26. method: 'GET',
  27. body: [{user: newUser2}, {user: newUser3}],
  28. });
  29. const {result} = renderHook(useMembers);
  30. const {onSearch} = result.current;
  31. // Works with append
  32. await act(() => onSearch('test'));
  33. expect(result.current.fetching).toBe(false);
  34. // Wait for state to be reflected from the store
  35. await waitFor(() => result.current.members.length === 3);
  36. expect(mockRequest).toHaveBeenCalled();
  37. expect(result.current.members).toEqual([...mockUsers, newUser2, newUser3]);
  38. // de-duplicates items in the query results
  39. mockRequest.mockClear();
  40. await act(() => onSearch('test'));
  41. // No new items have been added
  42. expect(mockRequest).toHaveBeenCalled();
  43. expect(result.current.members).toEqual([...mockUsers, newUser2, newUser3]);
  44. });
  45. it('provides only the specified emails', async function () {
  46. MemberListStore.loadInitialData(mockUsers);
  47. const userFoo = UserFixture({email: 'foo@test.com'});
  48. const mockRequest = MockApiClient.addMockResponse({
  49. url: `/organizations/${org.slug}/members/`,
  50. method: 'GET',
  51. body: [{user: userFoo}],
  52. });
  53. const {result} = renderHook(useMembers, {
  54. initialProps: {emails: ['foo@test.com']},
  55. });
  56. expect(result.current.initiallyLoaded).toBe(false);
  57. expect(mockRequest).toHaveBeenCalled();
  58. await waitFor(() => expect(result.current.members.length).toBe(1));
  59. const {members} = result.current;
  60. expect(members).toEqual(expect.arrayContaining([userFoo]));
  61. });
  62. it('provides only the specified ids', async function () {
  63. MemberListStore.loadInitialData(mockUsers);
  64. const userFoo = UserFixture({id: '10'});
  65. const mockRequest = MockApiClient.addMockResponse({
  66. url: `/organizations/${org.slug}/members/`,
  67. method: 'GET',
  68. body: [{user: userFoo}],
  69. });
  70. const {result} = renderHook(useMembers, {
  71. initialProps: {ids: ['10']},
  72. });
  73. expect(result.current.initiallyLoaded).toBe(false);
  74. expect(mockRequest).toHaveBeenCalled();
  75. await waitFor(() => expect(result.current.members.length).toBe(1));
  76. const {members} = result.current;
  77. expect(members).toEqual(expect.arrayContaining([userFoo]));
  78. });
  79. it('only loads emails when needed', function () {
  80. MemberListStore.loadInitialData(mockUsers);
  81. const {result} = renderHook(useMembers, {
  82. initialProps: {emails: [mockUsers[0].email]},
  83. });
  84. const {members, initiallyLoaded} = result.current;
  85. expect(initiallyLoaded).toBe(true);
  86. expect(members).toEqual(expect.arrayContaining(mockUsers));
  87. });
  88. it('correctly returns hasMore before and after store update', async function () {
  89. const {result} = renderHook(useMembers);
  90. const {members, hasMore} = result.current;
  91. expect(hasMore).toBe(null);
  92. expect(members).toEqual(expect.arrayContaining([]));
  93. act(() => MemberListStore.loadInitialData(mockUsers, false, null));
  94. await waitFor(() => expect(result.current.members.length).toBe(1));
  95. expect(result.current.hasMore).toBe(false);
  96. });
  97. });