useParams.spec.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import {createMemoryHistory, Route, Router, RouterContext} from 'react-router';
  2. import {render, screen} from 'sentry-test/reactTestingLibrary';
  3. import {useParams} from 'sentry/utils/useParams';
  4. import {useRouteContext} from 'sentry/utils/useRouteContext';
  5. import {RouteContext} from 'sentry/views/routeContext';
  6. const mockUsingCustomerDomain = jest.fn();
  7. const mockCustomerDomain = jest.fn();
  8. jest.mock('sentry/constants', () => {
  9. const sentryConstant = jest.requireActual('sentry/constants');
  10. return {
  11. ...sentryConstant,
  12. get usingCustomerDomain() {
  13. return mockUsingCustomerDomain();
  14. },
  15. get customerDomain() {
  16. return mockCustomerDomain();
  17. },
  18. };
  19. });
  20. describe('useParams', () => {
  21. describe('when the path has no params', () => {
  22. it('returns an empty object', () => {
  23. let params;
  24. function HomePage() {
  25. params = useParams();
  26. return null;
  27. }
  28. const memoryHistory = createMemoryHistory();
  29. memoryHistory.push('/?hello');
  30. render(
  31. <Router
  32. history={memoryHistory}
  33. render={props => {
  34. return (
  35. <RouteContext.Provider value={props}>
  36. <RouterContext {...props} />
  37. </RouteContext.Provider>
  38. );
  39. }}
  40. >
  41. <Route path="/" component={HomePage} />
  42. </Router>
  43. );
  44. expect(params).toEqual({});
  45. });
  46. });
  47. describe('when the path has some params', () => {
  48. it('returns an object of the URL params', () => {
  49. let params;
  50. function HomePage() {
  51. params = useParams();
  52. return null;
  53. }
  54. const memoryHistory = createMemoryHistory();
  55. memoryHistory.push('/sentry');
  56. render(
  57. <Router
  58. history={memoryHistory}
  59. render={props => {
  60. return (
  61. <RouteContext.Provider value={props}>
  62. <RouterContext {...props} />
  63. </RouteContext.Provider>
  64. );
  65. }}
  66. >
  67. <Route path="/:slug" component={HomePage} />
  68. </Router>
  69. );
  70. expect(params).toEqual({slug: 'sentry'});
  71. });
  72. });
  73. describe('customer domains', function () {
  74. afterEach(function () {
  75. jest.resetAllMocks();
  76. });
  77. it('populates orgId when customer domain is being used', function () {
  78. mockUsingCustomerDomain.mockReturnValue(true);
  79. mockCustomerDomain.mockReturnValue('albertos-apples');
  80. let originalParams;
  81. let useParamsValue;
  82. function Component() {
  83. const {params} = useRouteContext();
  84. originalParams = params;
  85. useParamsValue = useParams();
  86. return (
  87. <div>rendered component for org: {useParamsValue.orgId ?? 'no org id'}</div>
  88. );
  89. }
  90. const memoryHistory = createMemoryHistory();
  91. memoryHistory.push('/issues/?hello');
  92. render(
  93. <Router
  94. history={memoryHistory}
  95. render={props => {
  96. return (
  97. <RouteContext.Provider value={props}>
  98. <RouterContext {...props} />
  99. </RouteContext.Provider>
  100. );
  101. }}
  102. >
  103. <Route path="/issues/" component={Component} />
  104. </Router>
  105. );
  106. expect(
  107. screen.getByText('rendered component for org: albertos-apples')
  108. ).toBeInTheDocument();
  109. expect(originalParams).toEqual({});
  110. expect(useParamsValue).toEqual({
  111. orgId: 'albertos-apples',
  112. });
  113. });
  114. it('does not populate orgId when customer domain is not being used', function () {
  115. mockUsingCustomerDomain.mockReturnValue(false);
  116. mockCustomerDomain.mockReturnValue(undefined);
  117. let originalParams;
  118. let useParamsValue;
  119. function Component() {
  120. const {params} = useRouteContext();
  121. originalParams = params;
  122. useParamsValue = useParams();
  123. return (
  124. <div>rendered component for org: {useParamsValue.orgId ?? 'no org id'}</div>
  125. );
  126. }
  127. const memoryHistory = createMemoryHistory();
  128. memoryHistory.push('/issues/?hello');
  129. render(
  130. <Router
  131. history={memoryHistory}
  132. render={props => {
  133. return (
  134. <RouteContext.Provider value={props}>
  135. <RouterContext {...props} />
  136. </RouteContext.Provider>
  137. );
  138. }}
  139. >
  140. <Route path="/issues/" component={Component} />
  141. </Router>
  142. );
  143. expect(
  144. screen.getByText('rendered component for org: no org id')
  145. ).toBeInTheDocument();
  146. expect(originalParams).toEqual({});
  147. expect(useParamsValue).toEqual({});
  148. });
  149. });
  150. });