NotAvailableForReadOnlyUser.spec.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import type { ReactNode } from 'react';
  2. import { render, screen } from '@testing-library/react';
  3. import { Provider } from 'jotai';
  4. import { useHydrateAtoms } from 'jotai/utils';
  5. import { describe, expect, it, vi } from 'vitest';
  6. import { isRomUserAllowedToCommentAtom } from '~/states/server-configurations';
  7. import { NotAvailableIfReadOnlyUserNotAllowedToComment } from './NotAvailableForReadOnlyUser';
  8. const useIsReadOnlyUser = vi.hoisted(() => vi.fn().mockReturnValue(true));
  9. vi.mock('~/states/context', () => ({
  10. useIsReadOnlyUser,
  11. }));
  12. vi.mock('react-disable', () => ({
  13. Disable: ({
  14. children,
  15. disabled,
  16. }: {
  17. children: ReactNode;
  18. disabled: boolean;
  19. }) => <div aria-hidden={disabled ? 'true' : undefined}>{children}</div>,
  20. }));
  21. const HydrateAtoms = ({
  22. children,
  23. initialValues,
  24. }: {
  25. children: ReactNode;
  26. initialValues: Array<[typeof isRomUserAllowedToCommentAtom, boolean]>;
  27. }) => {
  28. useHydrateAtoms(initialValues);
  29. return <>{children}</>;
  30. };
  31. describe('NotAvailableForReadOnlyUser.tsx', () => {
  32. it('renders NotAvailable component as enable when user is read-only and comments by rom users is allowed', async () => {
  33. useIsReadOnlyUser.mockReturnValue(true);
  34. render(
  35. <Provider>
  36. <HydrateAtoms initialValues={[[isRomUserAllowedToCommentAtom, true]]}>
  37. <NotAvailableIfReadOnlyUserNotAllowedToComment>
  38. <div data-testid="test-child">Test Child</div>
  39. </NotAvailableIfReadOnlyUserNotAllowedToComment>
  40. </HydrateAtoms>
  41. </Provider>,
  42. );
  43. // when
  44. const element = screen.getByTestId('test-child');
  45. const wrapperElement = element.parentElement;
  46. // then
  47. expect(wrapperElement).not.toHaveAttribute('aria-hidden', 'true');
  48. });
  49. it('renders NotAvailable component as disable when user is read-only and comments by rom users is not allowed', async () => {
  50. useIsReadOnlyUser.mockReturnValue(true);
  51. render(
  52. <Provider>
  53. <HydrateAtoms initialValues={[[isRomUserAllowedToCommentAtom, false]]}>
  54. <NotAvailableIfReadOnlyUserNotAllowedToComment>
  55. <div data-testid="test-child">Test Child</div>
  56. </NotAvailableIfReadOnlyUserNotAllowedToComment>
  57. </HydrateAtoms>
  58. </Provider>,
  59. );
  60. // when
  61. const element = screen.getByTestId('test-child');
  62. const wrapperElement = element.parentElement;
  63. // then
  64. expect(wrapperElement).toHaveAttribute('aria-hidden', 'true');
  65. });
  66. it('renders NotAvailable component as enable when user is not read-only and comments by rom users is allowed', async () => {
  67. useIsReadOnlyUser.mockReturnValue(false);
  68. render(
  69. <Provider>
  70. <HydrateAtoms initialValues={[[isRomUserAllowedToCommentAtom, true]]}>
  71. <NotAvailableIfReadOnlyUserNotAllowedToComment>
  72. <div data-testid="test-child">Test Child</div>
  73. </NotAvailableIfReadOnlyUserNotAllowedToComment>
  74. </HydrateAtoms>
  75. </Provider>,
  76. );
  77. // when
  78. const element = screen.getByTestId('test-child');
  79. const wrapperElement = element.parentElement;
  80. // then
  81. expect(wrapperElement).not.toHaveAttribute('aria-hidden', 'true');
  82. });
  83. it('renders NotAvailable component as enable when user is not read-only and comments by rom users is not allowed', async () => {
  84. useIsReadOnlyUser.mockReturnValue(false);
  85. render(
  86. <Provider>
  87. <HydrateAtoms initialValues={[[isRomUserAllowedToCommentAtom, false]]}>
  88. <NotAvailableIfReadOnlyUserNotAllowedToComment>
  89. <div data-testid="test-child">Test Child</div>
  90. </NotAvailableIfReadOnlyUserNotAllowedToComment>
  91. </HydrateAtoms>
  92. </Provider>,
  93. );
  94. // when
  95. const element = screen.getByTestId('test-child');
  96. const wrapperElement = element.parentElement;
  97. // then
  98. expect(wrapperElement).not.toHaveAttribute('aria-hidden', 'true');
  99. });
  100. });