TableHeaderCell.spec.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import React from 'react';
  2. import { screen, within } from '@testing-library/react';
  3. import { render } from 'lib/testHelpers';
  4. import TableHeaderCell, {
  5. TableHeaderCellProps,
  6. } from 'components/common/table/TableHeaderCell/TableHeaderCell';
  7. import { SortOrder, TopicColumnsToSort } from 'generated-sources';
  8. import theme from 'theme/theme';
  9. import userEvent from '@testing-library/user-event';
  10. const SPACE_KEY = ' ';
  11. const testTitle = 'test title';
  12. const testPreviewText = 'test preview text';
  13. const handleOrderBy = jest.fn();
  14. const onPreview = jest.fn();
  15. const sortIconTitle = 'Sort icon';
  16. describe('TableHeaderCell', () => {
  17. const setupComponent = (props: Partial<TableHeaderCellProps> = {}) =>
  18. render(
  19. <table>
  20. <thead>
  21. <tr>
  22. <TableHeaderCell {...props} />;
  23. </tr>
  24. </thead>
  25. </table>
  26. );
  27. it('renders without props', () => {
  28. setupComponent();
  29. expect(screen.getByRole('columnheader')).toBeInTheDocument();
  30. });
  31. it('renders with title & preview text', () => {
  32. setupComponent({
  33. title: testTitle,
  34. previewText: testPreviewText,
  35. });
  36. const columnheader = screen.getByRole('columnheader');
  37. expect(within(columnheader).getByText(testTitle)).toBeInTheDocument();
  38. expect(within(columnheader).getByText(testPreviewText)).toBeInTheDocument();
  39. });
  40. it('renders with orderable props', () => {
  41. setupComponent({
  42. title: testTitle,
  43. orderBy: TopicColumnsToSort.NAME,
  44. orderValue: TopicColumnsToSort.NAME,
  45. sortOrder: SortOrder.ASC,
  46. handleOrderBy,
  47. });
  48. const columnheader = screen.getByRole('columnheader');
  49. const title = within(columnheader).getByRole('button');
  50. expect(title).toBeInTheDocument();
  51. expect(title).toHaveTextContent(testTitle);
  52. expect(title).toHaveStyle(`color: ${theme.table.th.color.active};`);
  53. expect(title).toHaveStyle('cursor: pointer;');
  54. });
  55. it('renders click on title triggers handler', () => {
  56. setupComponent({
  57. title: testTitle,
  58. orderBy: TopicColumnsToSort.NAME,
  59. orderValue: TopicColumnsToSort.NAME,
  60. handleOrderBy,
  61. });
  62. const columnheader = screen.getByRole('columnheader');
  63. const title = within(columnheader).getByRole('button');
  64. userEvent.click(title);
  65. expect(handleOrderBy.mock.calls.length).toBe(1);
  66. });
  67. it('renders space on title triggers handler', () => {
  68. setupComponent({
  69. title: testTitle,
  70. orderBy: TopicColumnsToSort.NAME,
  71. orderValue: TopicColumnsToSort.NAME,
  72. handleOrderBy,
  73. });
  74. const columnheader = screen.getByRole('columnheader');
  75. const title = within(columnheader).getByRole('button');
  76. userEvent.type(title, SPACE_KEY);
  77. // userEvent.type clicks and only then presses space
  78. expect(handleOrderBy.mock.calls.length).toBe(2);
  79. });
  80. it('click on preview triggers handler', () => {
  81. setupComponent({
  82. title: testTitle,
  83. previewText: testPreviewText,
  84. onPreview,
  85. });
  86. const columnheader = screen.getByRole('columnheader');
  87. const preview = within(columnheader).getByRole('button');
  88. userEvent.click(preview);
  89. expect(onPreview.mock.calls.length).toBe(1);
  90. });
  91. it('click on preview triggers handler', () => {
  92. setupComponent({
  93. title: testTitle,
  94. previewText: testPreviewText,
  95. onPreview,
  96. });
  97. const columnheader = screen.getByRole('columnheader');
  98. const preview = within(columnheader).getByRole('button');
  99. userEvent.type(preview, SPACE_KEY);
  100. // userEvent.type clicks and only then presses space
  101. expect(onPreview.mock.calls.length).toBe(2);
  102. });
  103. it('renders without sort indication', () => {
  104. setupComponent({
  105. title: testTitle,
  106. orderBy: TopicColumnsToSort.NAME,
  107. });
  108. const columnheader = screen.getByRole('columnheader');
  109. const title = within(columnheader).getByText(testTitle);
  110. expect(within(title).queryByTitle(sortIconTitle)).not.toBeInTheDocument();
  111. expect(title).toHaveStyle('cursor: default;');
  112. });
  113. it('renders with hightlighted title when orderBy and orderValue are equal', () => {
  114. setupComponent({
  115. title: testTitle,
  116. orderBy: TopicColumnsToSort.NAME,
  117. orderValue: TopicColumnsToSort.NAME,
  118. sortOrder: SortOrder.ASC,
  119. handleOrderBy: jest.fn(),
  120. });
  121. const columnheader = screen.getByRole('columnheader');
  122. const title = within(columnheader).getByText(testTitle);
  123. expect(title).toHaveStyle(`color: ${theme.table.th.color.active};`);
  124. });
  125. it('renders without hightlighted title when orderBy and orderValue are not equal', () => {
  126. setupComponent({
  127. title: testTitle,
  128. orderBy: TopicColumnsToSort.NAME,
  129. orderValue: TopicColumnsToSort.OUT_OF_SYNC_REPLICAS,
  130. handleOrderBy: jest.fn(),
  131. });
  132. const columnheader = screen.getByRole('columnheader');
  133. const title = within(columnheader).getByText(testTitle);
  134. expect(title).toHaveStyle(`color: ${theme.table.th.color.normal}`);
  135. });
  136. it('renders with default (primary) theme', () => {
  137. setupComponent({
  138. title: testTitle,
  139. });
  140. const columnheader = screen.getByRole('columnheader');
  141. const title = within(columnheader).getByText(testTitle);
  142. expect(title).toHaveStyle(
  143. `background: ${theme.table.th.backgroundColor.normal};`
  144. );
  145. });
  146. });