lazyLoad.spec.jsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import LazyLoad from 'app/components/lazyLoad';
  3. describe('LazyLoad', function () {
  4. it('renders with a loading indicator when promise is not resolved yet', function () {
  5. const promise = new Promise(() => {});
  6. const getComponent = () => promise;
  7. const wrapper = mountWithTheme(<LazyLoad component={getComponent} />);
  8. // Should be loading
  9. expect(wrapper.find('LoadingIndicator')).toHaveLength(1);
  10. });
  11. it('renders when given a promise of a "button" component', async function () {
  12. let res;
  13. const promise = new Promise(resolve => {
  14. res = resolve;
  15. });
  16. const getComponent = () => promise;
  17. const wrapper = mountWithTheme(<LazyLoad component={getComponent} />);
  18. // Should be loading
  19. expect(wrapper.find('LoadingIndicator')).toHaveLength(1);
  20. // resolve with button
  21. const ResolvedComponent = 'button';
  22. res(ResolvedComponent);
  23. await promise;
  24. // Need to wait for `retryableImport` to resolve
  25. await tick();
  26. wrapper.update();
  27. expect(wrapper.state('Component')).toEqual('button');
  28. expect(wrapper.find('button')).toHaveLength(1);
  29. expect(wrapper.find('LoadingIndicator')).toHaveLength(0);
  30. });
  31. it('renders with error message when promise is rejected', async function () {
  32. // eslint-disable-next-line no-console
  33. console.error = jest.fn();
  34. const getComponent = jest.fn(
  35. () =>
  36. new Promise((_resolve, reject) => reject(new Error('Could not load component')))
  37. );
  38. let wrapper;
  39. try {
  40. wrapper = mountWithTheme(<LazyLoad component={getComponent} />);
  41. } catch (err) {
  42. // ignore
  43. }
  44. // Need to wait for `retryableImport` to resolve
  45. await tick();
  46. wrapper.update();
  47. expect(wrapper.find('LoadingIndicator')).toHaveLength(0);
  48. expect(wrapper.find('LoadingError')).toHaveLength(1);
  49. // eslint-disable-next-line no-console
  50. expect(console.error).toHaveBeenCalled();
  51. // eslint-disable-next-line no-console
  52. console.error.mockRestore();
  53. });
  54. it('refetches when component changes', async function () {
  55. const getComponent = jest.fn(() => new Promise());
  56. const wrapper = mountWithTheme(<LazyLoad component={getComponent} />);
  57. // Should be loading
  58. expect(wrapper.find('LoadingIndicator')).toHaveLength(1);
  59. expect(getComponent).toHaveBeenCalled();
  60. // Update component prop
  61. const getComponent2 = jest.fn(() => new Promise());
  62. wrapper.setProps({component: getComponent2});
  63. expect(getComponent2).toHaveBeenCalledTimes(1);
  64. // Does not refetch on other prop changes
  65. wrapper.setProps({testProp: true});
  66. expect(getComponent2).toHaveBeenCalledTimes(1);
  67. });
  68. });