PageItemControl.spec.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { type IPageInfoForOperation, type IPageInfoForEmpty } from '@growi/core/dist/interfaces';
  2. import {
  3. fireEvent, screen, within,
  4. } from '@testing-library/dom';
  5. import { render } from '@testing-library/react';
  6. import { mock } from 'vitest-mock-extended';
  7. import { PageItemControl } from './PageItemControl';
  8. // mock for isIPageInfoForOperation and isIPageInfoForEmpty
  9. const mocks = vi.hoisted(() => ({
  10. isIPageInfoForOperationMock: vi.fn(),
  11. isIPageInfoForEmptyMock: vi.fn(),
  12. }));
  13. vi.mock('@growi/core/dist/interfaces', () => ({
  14. isIPageInfoForOperation: mocks.isIPageInfoForOperationMock,
  15. isIPageInfoForEmpty: mocks.isIPageInfoForEmptyMock,
  16. }));
  17. describe('PageItemControl.tsx', () => {
  18. describe('Should trigger onClickRenameMenuItem() when clicking the rename button', () => {
  19. it('without fetching PageInfo by useSWRxPageInfo', async() => {
  20. // setup
  21. const pageInfo = mock<IPageInfoForOperation>();
  22. const onClickRenameMenuItemMock = vi.fn();
  23. // return true when the argument is pageInfo in order to supress fetching
  24. mocks.isIPageInfoForOperationMock.mockImplementation((arg) => {
  25. if (arg === pageInfo) {
  26. return true;
  27. }
  28. });
  29. // return false for isIPageInfoForEmpty since we're using IPageInfoForOperation
  30. mocks.isIPageInfoForEmptyMock.mockReturnValue(false);
  31. const props = {
  32. pageId: 'dummy-page-id',
  33. isEnableActions: true,
  34. pageInfo,
  35. onClickRenameMenuItem: onClickRenameMenuItemMock,
  36. };
  37. render(<PageItemControl {...props} />);
  38. // when
  39. const button = within(screen.getByTestId('open-page-item-control-btn')).getByText(/more_vert/);
  40. fireEvent.click(button);
  41. const renameMenuItem = await screen.findByTestId('rename-page-btn');
  42. fireEvent.click(renameMenuItem);
  43. // then
  44. expect(onClickRenameMenuItemMock).toHaveBeenCalled();
  45. });
  46. it('with empty page (IPageInfoForEmpty)', async() => {
  47. // setup - Create an empty page mock with required properties
  48. const pageInfo: IPageInfoForEmpty = {
  49. emptyPageId: 'empty-page-id',
  50. isNotFound: true,
  51. isEmpty: true,
  52. isV5Compatible: true,
  53. isMovable: true, // Allow rename operation
  54. isDeletable: true,
  55. isAbleToDeleteCompletely: false,
  56. isRevertible: false,
  57. bookmarkCount: 0,
  58. isBookmarked: false,
  59. };
  60. const onClickRenameMenuItemMock = vi.fn();
  61. // return false for isIPageInfoForOperation since this is an empty page
  62. mocks.isIPageInfoForOperationMock.mockReturnValue(false);
  63. // return true when the argument is pageInfo (empty page)
  64. mocks.isIPageInfoForEmptyMock.mockImplementation((arg) => {
  65. if (arg === pageInfo) {
  66. return true;
  67. }
  68. return false;
  69. });
  70. const props = {
  71. pageId: 'dummy-page-id',
  72. isEnableActions: true,
  73. pageInfo,
  74. onClickRenameMenuItem: onClickRenameMenuItemMock,
  75. };
  76. render(<PageItemControl {...props} />);
  77. // when
  78. const button = within(screen.getByTestId('open-page-item-control-btn')).getByText(/more_vert/);
  79. fireEvent.click(button);
  80. const renameMenuItem = await screen.findByTestId('rename-page-btn');
  81. fireEvent.click(renameMenuItem);
  82. // then
  83. expect(onClickRenameMenuItemMock).toHaveBeenCalled();
  84. expect(onClickRenameMenuItemMock).toHaveBeenCalledWith('dummy-page-id', pageInfo);
  85. });
  86. });
  87. });