Design system.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

204 рядки
4.5 KiB

  1. import * as React from 'react';
  2. import {
  3. render,
  4. screen,
  5. } from '@testing-library/react';
  6. import userEvent from '@testing-library/user-event';
  7. import * as TextControlBase from '@tesseract-design/web-base-textcontrol';
  8. import { vi } from 'vitest';
  9. import {
  10. MaskedTextInput
  11. } from '.';
  12. vi.mock('@tesseract-design/web-base-textcontrol');
  13. describe('MaskedTextInput', () => {
  14. it('renders an input', () => {
  15. render(
  16. <MaskedTextInput />
  17. );
  18. const textbox: HTMLInputElement = screen.getByTestId('input');
  19. expect(textbox).toBeInTheDocument();
  20. expect(textbox).toHaveProperty('type', 'password');
  21. });
  22. it('renders a border', () => {
  23. render(
  24. <MaskedTextInput
  25. border
  26. />
  27. );
  28. const border = screen.getByTestId('border');
  29. expect(border).toBeInTheDocument();
  30. });
  31. it('renders a label', () => {
  32. render(
  33. <MaskedTextInput
  34. label="foo"
  35. />
  36. );
  37. const textbox = screen.getByLabelText('foo');
  38. expect(textbox).toBeInTheDocument();
  39. const label = screen.getByTestId('label');
  40. expect(label).toHaveTextContent('foo');
  41. });
  42. it('renders a hidden label', () => {
  43. render(
  44. <MaskedTextInput
  45. label="foo"
  46. hiddenLabel
  47. />
  48. );
  49. const textbox = screen.getByLabelText('foo');
  50. expect(textbox).toBeInTheDocument();
  51. const label = screen.queryByTestId('label');
  52. expect(label).toBeNull();
  53. });
  54. it('renders a hint', () => {
  55. render(
  56. <MaskedTextInput
  57. hint="foo"
  58. />
  59. );
  60. const hint = screen.getByTestId('hint');
  61. expect(hint).toBeInTheDocument();
  62. });
  63. it('renders an indicator', () => {
  64. render(
  65. <MaskedTextInput
  66. indicator={
  67. <div data-testid="indicator" />
  68. }
  69. />
  70. );
  71. const indicator = screen.getByTestId('indicator');
  72. expect(indicator).toBeInTheDocument();
  73. });
  74. describe.each(Object.values(TextControlBase.TextControlSize))('on %s size', (size) => {
  75. it('renders input styles', () => {
  76. render(
  77. <MaskedTextInput
  78. size={size}
  79. />
  80. );
  81. expect(TextControlBase.Input).toBeCalledWith(expect.objectContaining({
  82. size,
  83. }));
  84. });
  85. it('renders hint styles', () => {
  86. render(
  87. <MaskedTextInput
  88. size={size}
  89. hint="hint"
  90. />
  91. );
  92. expect(TextControlBase.HintWrapper).toBeCalledWith(expect.objectContaining({
  93. size,
  94. }));
  95. });
  96. it('renders indicator styles', () => {
  97. render(
  98. <MaskedTextInput
  99. size={size}
  100. indicator={
  101. <div data-testid="indicator" />
  102. }
  103. />
  104. );
  105. expect(TextControlBase.IndicatorWrapper).toBeCalledWith(expect.objectContaining({
  106. size,
  107. }));
  108. });
  109. });
  110. it('renders a block input', () => {
  111. render(
  112. <MaskedTextInput
  113. block
  114. />
  115. );
  116. expect(TextControlBase.Root).toBeCalledWith(expect.objectContaining({
  117. block: true,
  118. }));
  119. });
  120. describe.each(Object.values(TextControlBase.TextControlStyle))('on %s style', (style) => {
  121. it('renders input styles', () => {
  122. render(
  123. <MaskedTextInput
  124. style={style}
  125. />
  126. );
  127. expect(TextControlBase.Input).toBeCalledWith(expect.objectContaining({
  128. style,
  129. }));
  130. });
  131. it('renders hint styles', () => {
  132. render(
  133. <MaskedTextInput
  134. style={style}
  135. hint="hint"
  136. />
  137. );
  138. expect(TextControlBase.HintWrapper).toBeCalledWith(expect.objectContaining({
  139. style,
  140. }));
  141. });
  142. it('renders indicator styles', () => {
  143. render(
  144. <MaskedTextInput
  145. style={style}
  146. indicator={
  147. <div
  148. data-testid="indicator"
  149. />
  150. }
  151. />
  152. );
  153. expect(TextControlBase.IndicatorWrapper).toBeCalledWith(expect.objectContaining({
  154. style,
  155. }));
  156. });
  157. });
  158. it('handles change events', () => {
  159. const onChange = vi.fn().mockImplementationOnce((e) => { e.preventDefault() });
  160. render(
  161. <MaskedTextInput
  162. onChange={onChange}
  163. />
  164. );
  165. const textbox: HTMLInputElement = screen.getByTestId('input');
  166. userEvent.type(textbox, 'foobar');
  167. expect(onChange).toBeCalled();
  168. });
  169. it('handles input events', () => {
  170. const onInput = vi.fn().mockImplementationOnce((e) => { e.preventDefault() });
  171. render(
  172. <MaskedTextInput
  173. onInput={onInput}
  174. />
  175. );
  176. const textbox: HTMLInputElement = screen.getByTestId('input');
  177. userEvent.type(textbox, 'foobar');
  178. expect(onInput).toBeCalled();
  179. });
  180. });