persistedStore.spec.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import {act} from 'react-test-renderer';
  2. import {Organization} from 'fixtures/js-stubs/organization';
  3. import {reactHooks} from 'sentry-test/reactTestingLibrary';
  4. import OrganizationStore from 'sentry/stores/organizationStore';
  5. import {
  6. DefaultLoadedPersistedStore,
  7. DefaultPersistedStore,
  8. PersistedStoreProvider,
  9. usePersistedStoreCategory,
  10. } from 'sentry/stores/persistedStore';
  11. import {OrganizationContext} from 'sentry/views/organizationContext';
  12. describe('PersistedStore', function () {
  13. let org, wrapper;
  14. beforeEach(() => {
  15. org = Organization();
  16. MockApiClient.addMockResponse({
  17. url: `/organizations/${org.slug}/client-state/`,
  18. body: {
  19. onboarding: {
  20. test: 1,
  21. },
  22. },
  23. });
  24. OrganizationStore.onUpdate(org, {replace: true});
  25. wrapper = ({children}) => (
  26. <PersistedStoreProvider>
  27. <OrganizationContext.Provider value={org}>
  28. {children}
  29. </OrganizationContext.Provider>
  30. </PersistedStoreProvider>
  31. );
  32. });
  33. afterEach(() => {
  34. MockApiClient.clearMockResponses();
  35. });
  36. it('provides the persisted data category from client-state API', async function () {
  37. const {result, waitForNextUpdate} = reactHooks.renderHook(usePersistedStoreCategory, {
  38. initialProps: 'onboarding' as const,
  39. wrapper,
  40. });
  41. await waitForNextUpdate();
  42. const [state] = result.current;
  43. expect(state).toMatchObject({
  44. test: 1,
  45. });
  46. });
  47. it('sets the persisted data category from client-state API', async function () {
  48. const {result, waitForNextUpdate} = reactHooks.renderHook(usePersistedStoreCategory, {
  49. initialProps: 'onboarding' as const,
  50. wrapper,
  51. });
  52. await waitForNextUpdate();
  53. const [_, setState] = result.current;
  54. const clientStateUpdate = MockApiClient.addMockResponse({
  55. url: `/organizations/${org.slug}/client-state/onboarding/`,
  56. method: 'PUT',
  57. });
  58. act(() => {
  59. setState({test: 2} as any);
  60. });
  61. const [state2] = result.current;
  62. expect(state2).toMatchObject({
  63. test: 2,
  64. });
  65. expect(clientStateUpdate).toHaveBeenCalledWith(
  66. `/organizations/${org.slug}/client-state/onboarding/`,
  67. expect.objectContaining({
  68. method: 'PUT',
  69. data: {
  70. test: 2,
  71. },
  72. })
  73. );
  74. });
  75. it('deletes the persisted data category on set to null', async function () {
  76. const {result, waitForNextUpdate} = reactHooks.renderHook(usePersistedStoreCategory, {
  77. initialProps: 'onboarding' as const,
  78. wrapper,
  79. });
  80. await waitForNextUpdate();
  81. const [_, setState] = result.current;
  82. const clientStateDelete = MockApiClient.addMockResponse({
  83. url: `/organizations/${org.slug}/client-state/onboarding/`,
  84. method: 'DELETE',
  85. });
  86. act(() => {
  87. setState(null);
  88. });
  89. const [state2] = result.current;
  90. expect(state2).toBe(DefaultPersistedStore.onboarding);
  91. expect(clientStateDelete).toHaveBeenCalledWith(
  92. `/organizations/${org.slug}/client-state/onboarding/`,
  93. expect.objectContaining({
  94. method: 'DELETE',
  95. })
  96. );
  97. });
  98. it('returns default when state is empty', async function () {
  99. MockApiClient.addMockResponse({
  100. url: `/organizations/${org.slug}/client-state/`,
  101. body: {},
  102. });
  103. const {result, waitForNextUpdate} = reactHooks.renderHook(usePersistedStoreCategory, {
  104. initialProps: 'onboarding' as const,
  105. wrapper,
  106. });
  107. const [state] = result.current;
  108. expect(state).toBe(DefaultPersistedStore.onboarding);
  109. await waitForNextUpdate();
  110. const [state2] = result.current;
  111. expect(state2).toBe(DefaultLoadedPersistedStore.onboarding);
  112. });
  113. it('returns default when state fails to load', function () {
  114. MockApiClient.addMockResponse({
  115. url: `/organizations/${org.slug}/client-state/`,
  116. statusCode: 500,
  117. });
  118. const {result} = reactHooks.renderHook(usePersistedStoreCategory, {
  119. initialProps: 'onboarding' as const,
  120. wrapper,
  121. });
  122. const [state] = result.current;
  123. expect(state).toBe(DefaultPersistedStore.onboarding);
  124. });
  125. });