PageTitleHeader.spec.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import '@testing-library/jest-dom/vitest';
  2. import { faker } from '@faker-js/faker';
  3. import type { IPagePopulatedToShowRevision } from '@growi/core';
  4. import {
  5. fireEvent, render, screen, waitFor,
  6. } from '@testing-library/react';
  7. import { mock } from 'vitest-mock-extended';
  8. import { EditorMode } from '~/stores-universal/ui';
  9. import { PageTitleHeader } from './PageTitleHeader';
  10. const mocks = vi.hoisted(() => ({
  11. useIsUntitledPageMock: vi.fn(),
  12. useEditorModeMock: vi.fn(() => ({ data: EditorMode.Editor })),
  13. }));
  14. vi.mock('~/stores/ui', () => ({
  15. useIsUntitledPage: mocks.useIsUntitledPageMock,
  16. }));
  17. vi.mock('~/stores-universal/ui', async importOriginal => ({
  18. ...await importOriginal(),
  19. useEditorMode: mocks.useEditorModeMock,
  20. }));
  21. describe('PageTitleHeader Component with untitled page', () => {
  22. beforeAll(() => {
  23. mocks.useIsUntitledPageMock.mockImplementation(() => ({ data: true }));
  24. });
  25. it('should render the textbox correctly', async() => {
  26. // arrange
  27. const currentPage = mock<IPagePopulatedToShowRevision>({
  28. _id: faker.database.mongodbObjectId(),
  29. path: '/path/to/page/Untitled-1',
  30. });
  31. // act
  32. render(<PageTitleHeader currentPage={currentPage} />);
  33. // assert
  34. // header should be rendered
  35. const headerElement = screen.getByText('Untitled-1');
  36. const inputElement = screen.getByRole('textbox');
  37. const inputElementByPlaceholder = screen.getByPlaceholderText('Input page name');
  38. await waitFor(() => {
  39. expect(inputElement).toBeInTheDocument();
  40. expect(inputElement).toStrictEqual(inputElementByPlaceholder);
  41. expect(inputElement).toHaveValue(''); // empty
  42. expect(headerElement).toHaveClass('invisible');
  43. });
  44. });
  45. });
  46. describe('PageTitleHeader Component', () => {
  47. beforeAll(() => {
  48. mocks.useIsUntitledPageMock.mockImplementation(() => ({ data: false }));
  49. });
  50. it('should render the title correctly', async() => {
  51. // arrange
  52. const pageTitle = faker.lorem.slug();
  53. const currentPage = mock<IPagePopulatedToShowRevision>({
  54. _id: faker.database.mongodbObjectId(),
  55. path: `/path/to/page/${pageTitle}`,
  56. });
  57. // act
  58. render(<PageTitleHeader currentPage={currentPage} />);
  59. // assert
  60. // header should be rendered
  61. const headerElement = screen.getByText(pageTitle);
  62. await waitFor(() => {
  63. expect(headerElement).toBeInTheDocument();
  64. expect(headerElement).not.toHaveClass('invisible');
  65. });
  66. // textbox should not be rendered
  67. const inputElement = screen.queryByRole('textbox');
  68. expect(inputElement).not.toBeInTheDocument();
  69. });
  70. it('should render text input after clicking', async() => {
  71. // arrange
  72. const pageTitle = faker.lorem.slug();
  73. const currentPage = mock<IPagePopulatedToShowRevision>({
  74. _id: faker.database.mongodbObjectId(),
  75. path: `/path/to/page/${pageTitle}`,
  76. });
  77. // act
  78. render(<PageTitleHeader currentPage={currentPage} />);
  79. const headerElement = screen.getByText(pageTitle);
  80. await waitFor(() => expect(headerElement).toBeInTheDocument());
  81. // click
  82. fireEvent.click(headerElement);
  83. // assert
  84. const inputElement = screen.getByRole('textbox');
  85. await waitFor(() => {
  86. expect(inputElement).toBeInTheDocument();
  87. expect(inputElement).toHaveValue(pageTitle);
  88. expect(headerElement).toHaveClass('invisible');
  89. });
  90. });
  91. });