Design system.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

210 rindas
4.7 KiB

  1. import * as React from 'react';
  2. import {
  3. render,
  4. screen
  5. } from '@testing-library/react';
  6. import '@testing-library/jest-dom';
  7. import userEvent from '@testing-library/user-event';
  8. import * as ButtonBase from '@tesseract-design/web-base-button';
  9. import * as CheckControlBase from '@tesseract-design/web-base-checkcontrol';
  10. import { vi } from 'vitest';
  11. import { ToggleButton } from '.';
  12. vi.mock('@tesseract-design/web-base-button');
  13. vi.mock('@tesseract-design/web-base-checkcontrol');
  14. describe('ToggleButton', () => {
  15. it('renders a checkbox', () => {
  16. render(
  17. <ToggleButton />
  18. );
  19. const checkbox = screen.getByRole('checkbox');
  20. expect(checkbox).toBeInTheDocument();
  21. });
  22. it('renders an indeterminate checkbox', () => {
  23. render(
  24. <ToggleButton
  25. indeterminate
  26. />
  27. );
  28. const checkbox = screen.getByRole('checkbox');
  29. expect(checkbox).toHaveProperty('indeterminate', true);
  30. });
  31. it('renders a subtext', () => {
  32. render(
  33. <ToggleButton
  34. subtext="subtext"
  35. />
  36. );
  37. const subtext: HTMLElement = screen.getByTestId('subtext');
  38. expect(subtext).toBeInTheDocument();
  39. });
  40. it('renders a badge', () => {
  41. render(
  42. <ToggleButton
  43. badge="badge"
  44. />
  45. );
  46. const badge: HTMLElement = screen.getByTestId('badge');
  47. expect(badge).toBeInTheDocument();
  48. });
  49. describe('on indeterminate', () => {
  50. it('renders an indeterminate checkbox', () => {
  51. render(
  52. <ToggleButton
  53. indeterminate
  54. />
  55. );
  56. const checkbox = screen.getByRole('checkbox');
  57. expect(checkbox).toHaveProperty('indeterminate', true);
  58. });
  59. it('acknowledges passed ref', () => {
  60. const ref = React.createRef<HTMLInputElement>()
  61. render(
  62. <ToggleButton
  63. indeterminate
  64. ref={ref}
  65. />
  66. );
  67. expect(ref.current).toHaveProperty('indeterminate', true);
  68. });
  69. });
  70. it('handles click events', () => {
  71. const onClick = vi.fn().mockImplementationOnce((e) => { e.preventDefault(); })
  72. render(
  73. <ToggleButton
  74. onClick={onClick}
  75. />
  76. );
  77. const checkbox: HTMLInputElement = screen.getByRole('checkbox');
  78. userEvent.click(checkbox);
  79. expect(onClick).toBeCalled();
  80. });
  81. it('renders a compact button', () => {
  82. render(
  83. <ToggleButton
  84. compact
  85. />
  86. );
  87. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  88. compact: true,
  89. }));
  90. expect(ButtonBase.Label).toBeCalledWith(expect.objectContaining({
  91. compact: true,
  92. }));
  93. });
  94. describe.each(Object.values(ButtonBase.ButtonSize))('on %s size', (size) => {
  95. it('renders button styles', () => {
  96. render(
  97. <ToggleButton
  98. size={size}
  99. />
  100. );
  101. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  102. size,
  103. }));
  104. });
  105. it('renders badge styles', () => {
  106. render(
  107. <ToggleButton
  108. size={size}
  109. badge="badge"
  110. />
  111. );
  112. expect(ButtonBase.BadgeContainer).toBeCalledWith(expect.objectContaining({
  113. size,
  114. }));
  115. });
  116. });
  117. it.each(Object.values(ButtonBase.ButtonVariant))('renders a button with variant %s', (variant) => {
  118. render(
  119. <ToggleButton
  120. variant={variant}
  121. />
  122. );
  123. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  124. variant,
  125. }));
  126. });
  127. it('renders a bordered button', () => {
  128. render(
  129. <ToggleButton
  130. border
  131. />
  132. );
  133. expect(ButtonBase.Border).toBeCalledWith(expect.objectContaining({
  134. border: true,
  135. }));
  136. });
  137. it('renders a block button', () => {
  138. render(
  139. <ToggleButton
  140. block
  141. />
  142. );
  143. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  144. block: true,
  145. }));
  146. expect(ButtonBase.Border).toBeCalledWith(expect.objectContaining({
  147. block: true,
  148. }));
  149. expect(CheckControlBase.ClickAreaWrapper).toBeCalledWith(expect.objectContaining({
  150. block: true,
  151. }));
  152. });
  153. it('renders children', () => {
  154. render(
  155. <ToggleButton>
  156. Foo
  157. </ToggleButton>
  158. );
  159. const children: HTMLElement = screen.getByTestId('children');
  160. expect(children).toHaveTextContent('Foo');
  161. });
  162. it('renders a disabled button', () => {
  163. render(
  164. <ToggleButton
  165. disabled
  166. />
  167. );
  168. const checkbox: HTMLButtonElement = screen.getByRole('checkbox');
  169. expect(checkbox).toBeDisabled();
  170. });
  171. it('handles change events', () => {
  172. const onChange = vi.fn().mockImplementationOnce((e) => { e.preventDefault(); })
  173. render(
  174. <ToggleButton
  175. onChange={onChange}
  176. />
  177. );
  178. const checkbox: HTMLInputElement = screen.getByRole('checkbox');
  179. userEvent.click(checkbox);
  180. expect(onChange).toBeCalled();
  181. });
  182. });