Design system.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

191 Zeilen
4.1 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 ButtonBase from '@tesseract-design/web-base-button';
  8. import { vi } from 'vitest';
  9. import {
  10. ActionButton,
  11. ActionButtonType,
  12. } from '.';
  13. vi.mock('@tesseract-design/web-base-button');
  14. describe('ActionButton', () => {
  15. it('renders a button', () => {
  16. render(
  17. <ActionButton />
  18. );
  19. const button: HTMLButtonElement = screen.getByRole('button');
  20. expect(button).toBeInTheDocument();
  21. expect(button).toHaveProperty('type', 'button');
  22. });
  23. it('renders a subtext', () => {
  24. render(
  25. <ActionButton
  26. subtext="subtext"
  27. />
  28. );
  29. const subtext: HTMLElement = screen.getByTestId('subtext');
  30. expect(subtext).toBeInTheDocument();
  31. });
  32. it('renders a badge', () => {
  33. render(
  34. <ActionButton
  35. badge="badge"
  36. />
  37. );
  38. const badge: HTMLElement = screen.getByTestId('badge');
  39. expect(badge).toBeInTheDocument();
  40. });
  41. it('renders as a menu item', () => {
  42. render(
  43. <ActionButton
  44. menuItem
  45. />
  46. );
  47. const menuItemIndicator: HTMLElement = screen.getByTestId('menuItemIndicator');
  48. expect(menuItemIndicator).toBeInTheDocument();
  49. });
  50. it('handles click events', () => {
  51. const onClick = vi.fn().mockImplementationOnce((e) => { e.preventDefault() });
  52. render(
  53. <ActionButton
  54. onClick={onClick}
  55. />
  56. );
  57. const button: HTMLButtonElement = screen.getByRole('button');
  58. userEvent.click(button);
  59. expect(onClick).toBeCalled();
  60. });
  61. it('renders a compact button', () => {
  62. render(
  63. <ActionButton
  64. compact
  65. />
  66. );
  67. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  68. compact: true,
  69. }));
  70. expect(ButtonBase.Label).toBeCalledWith(expect.objectContaining({
  71. compact: true,
  72. }));
  73. });
  74. describe.each(Object.values(ButtonBase.ButtonSize))('on %s size', (size) => {
  75. it('renders button styles', () => {
  76. render(
  77. <ActionButton
  78. size={size}
  79. />
  80. );
  81. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  82. size,
  83. }));
  84. });
  85. it('renders badge styles', () => {
  86. render(
  87. <ActionButton
  88. size={size}
  89. badge="badge"
  90. />
  91. );
  92. expect(ButtonBase.BadgeContainer).toBeCalledWith(expect.objectContaining({
  93. size,
  94. }));
  95. });
  96. it('renders indicator styles', () => {
  97. render(
  98. <ActionButton
  99. size={size}
  100. menuItem
  101. />
  102. );
  103. expect(ButtonBase.IndicatorWrapper).toBeCalledWith(expect.objectContaining({
  104. size,
  105. }));
  106. });
  107. });
  108. it.each(Object.values(ButtonBase.ButtonVariant))('renders a button with variant %s', (variant) => {
  109. render(
  110. <ActionButton
  111. variant={variant}
  112. />
  113. );
  114. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  115. variant,
  116. }));
  117. });
  118. it('renders a bordered button', () => {
  119. render(
  120. <ActionButton
  121. border
  122. />
  123. );
  124. expect(ButtonBase.Border).toBeCalledWith(expect.objectContaining({
  125. border: true,
  126. }));
  127. });
  128. it('renders a block button', () => {
  129. render(
  130. <ActionButton
  131. block
  132. />
  133. );
  134. expect(ButtonBase.Border).toBeCalledWith(expect.objectContaining({
  135. block: true,
  136. }));
  137. });
  138. it('renders children', () => {
  139. render(
  140. <ActionButton>
  141. Foo
  142. </ActionButton>
  143. );
  144. const children: HTMLElement = screen.getByTestId('children');
  145. expect(children).toHaveTextContent('Foo');
  146. });
  147. it.each(Object.values(ActionButtonType))('renders a button with type %s', (buttonType) => {
  148. render(
  149. <ActionButton
  150. type={buttonType}
  151. />
  152. );
  153. const button: HTMLButtonElement = screen.getByRole('button');
  154. expect(button).toHaveProperty('type', buttonType);
  155. });
  156. it('renders a disabled button', () => {
  157. render(
  158. <ActionButton
  159. disabled
  160. />
  161. );
  162. const button: HTMLButtonElement = screen.getByRole('button');
  163. expect(button).toBeDisabled();
  164. });
  165. });