panel-update-modal.test.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { fireEvent, screen } from '@testing-library/react';
  2. import { Modal } from 'antd';
  3. import { afterEach, describe, expect, it, vi } from 'vitest';
  4. import PanelUpdateModal from '@/pages/index/PanelUpdateModal';
  5. import { HttpUtil } from '@/utils';
  6. import { renderWithProviders } from './test-utils';
  7. let restoreUseModal = () => {};
  8. describe('panel update modal', () => {
  9. afterEach(() => {
  10. restoreUseModal();
  11. restoreUseModal = () => {};
  12. vi.mocked(HttpUtil.post).mockReset();
  13. });
  14. it('lets the confirmation close before the update request finishes', () => {
  15. const confirm = vi.fn();
  16. const useModal = vi.spyOn(Modal, 'useModal').mockReturnValue([
  17. {
  18. confirm,
  19. error: vi.fn(),
  20. warning: vi.fn(),
  21. } as unknown as ReturnType<typeof Modal.useModal>[0],
  22. <span key="modal-context" />,
  23. ]);
  24. restoreUseModal = () => useModal.mockRestore();
  25. vi.mocked(HttpUtil.post).mockReturnValue(new Promise(() => {}));
  26. const onClose = vi.fn();
  27. const onBusy = vi.fn();
  28. renderWithProviders(
  29. <PanelUpdateModal
  30. open
  31. info={{
  32. channel: 'dev',
  33. currentVersion: 'dev+old',
  34. latestVersion: 'dev+new',
  35. currentCommit: 'old',
  36. latestCommit: 'new',
  37. updateAvailable: true,
  38. }}
  39. devChannelEnable
  40. onClose={onClose}
  41. onBusy={onBusy}
  42. />,
  43. );
  44. fireEvent.click(screen.getByRole('button', { name: /Update Panel/ }));
  45. expect(confirm).toHaveBeenCalledOnce();
  46. const config = confirm.mock.calls[0]?.[0];
  47. if (!config?.onOk) throw new Error('Confirmation onOk handler was not registered');
  48. expect(config.onOk()).toBeUndefined();
  49. expect(onClose).toHaveBeenCalledOnce();
  50. expect(HttpUtil.post).toHaveBeenCalledWith('/panel/api/server/updatePanel');
  51. expect(onBusy).toHaveBeenCalledWith({
  52. busy: true,
  53. tip: 'Installation is in progress, please do not refresh this page (dev+new)',
  54. });
  55. });
  56. });