Design system.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

204 lignes
4.1 KiB

  1. import * as React from 'react';
  2. import {
  3. cleanup,
  4. render,
  5. screen,
  6. } from '@testing-library/react';
  7. import userEvent from '@testing-library/user-event';
  8. import { Button } from '@tesseract-design/web-base';
  9. import {
  10. vi,
  11. expect,
  12. describe,
  13. it,
  14. afterEach,
  15. } from 'vitest';
  16. import matchers from '@testing-library/jest-dom/matchers';
  17. import {
  18. LinkButton,
  19. LinkButtonDerivedElement,
  20. } from '.';
  21. expect.extend(matchers);
  22. describe('LinkButton', () => {
  23. afterEach(() => {
  24. cleanup();
  25. });
  26. it('renders a button', () => {
  27. render(
  28. <LinkButton
  29. href="https://www.example.com"
  30. />,
  31. );
  32. const button = screen.getByRole('link');
  33. expect(button).toBeInTheDocument();
  34. });
  35. it('renders a subtext', () => {
  36. render(
  37. <LinkButton
  38. href="#"
  39. subtext="subtext"
  40. />,
  41. );
  42. const subtext = screen.getByTestId('subtext');
  43. expect(subtext).toBeInTheDocument();
  44. });
  45. it('renders a badge', () => {
  46. render(
  47. <LinkButton
  48. href="#"
  49. badge="badge"
  50. />,
  51. );
  52. const badge = screen.getByTestId('badge');
  53. expect(badge).toBeInTheDocument();
  54. });
  55. it('renders as a menu item', () => {
  56. render(
  57. <LinkButton
  58. href="#"
  59. menuItem
  60. />,
  61. );
  62. const menuItemIndicator = screen.getByTestId('menuItemIndicator');
  63. expect(menuItemIndicator).toBeInTheDocument();
  64. });
  65. it('handles click events', async () => {
  66. const onClick = vi.fn().mockImplementationOnce(
  67. (e: React.MouseEvent<LinkButtonDerivedElement>) => {
  68. e.preventDefault();
  69. },
  70. );
  71. render(
  72. <LinkButton
  73. href="#"
  74. onClick={onClick}
  75. />,
  76. );
  77. const button = screen.getByRole('link');
  78. await userEvent.click(button);
  79. expect(onClick).toBeCalled();
  80. });
  81. it('renders a compact link', () => {
  82. render(
  83. <LinkButton
  84. href="#"
  85. compact
  86. />,
  87. );
  88. const button = screen.getByRole('link');
  89. expect(button).toHaveClass('pl-2 gap-2 pr-2');
  90. });
  91. describe.each`
  92. size | className
  93. ${'small'} | ${'h-10'}
  94. ${'medium'} | ${'h-12'}
  95. ${'large'} | ${'h-16'}
  96. `('on $size size', ({
  97. size,
  98. className,
  99. }: { size: Button.Size, className: string }) => {
  100. it('renders link styles', () => {
  101. render(
  102. <LinkButton
  103. href="#"
  104. size={size}
  105. />,
  106. );
  107. const button = screen.getByRole('link');
  108. expect(button).toHaveClass(className);
  109. });
  110. it('renders badge styles', () => {
  111. render(
  112. <LinkButton
  113. href="#"
  114. size={size}
  115. badge="badge"
  116. />,
  117. );
  118. const badge = screen.getByTestId('badge');
  119. expect(badge).toBeInTheDocument();
  120. });
  121. });
  122. it.each`
  123. variant | className
  124. ${'bare'} | ${'bg-negative'}
  125. ${'outline'} | ${'border-2'}
  126. ${'filled'} | ${'bg-primary'}
  127. `('renders a link with $variant variant', ({
  128. variant,
  129. className,
  130. }: { variant: Button.Variant, className: string }) => {
  131. render(
  132. <LinkButton
  133. href="#"
  134. variant={variant}
  135. />,
  136. );
  137. const button = screen.getByRole('link');
  138. expect(button).toHaveClass(className);
  139. });
  140. it('renders a block link', () => {
  141. render(
  142. <LinkButton
  143. href="#"
  144. block
  145. />,
  146. );
  147. const button = screen.getByRole('link');
  148. expect(button).toHaveClass('w-full flex');
  149. });
  150. it('renders children', () => {
  151. render(
  152. <LinkButton
  153. href="#"
  154. >
  155. Foo
  156. </LinkButton>,
  157. );
  158. const children = screen.getByTestId('children');
  159. expect(children).toHaveTextContent('Foo');
  160. });
  161. it.each(Button.AVAILABLE_TYPES)('renders a link with type %s', (buttonType) => {
  162. render(
  163. <LinkButton
  164. href="#"
  165. type={buttonType}
  166. />,
  167. );
  168. const button = screen.getByRole('link');
  169. expect(button).toHaveProperty('type', buttonType);
  170. });
  171. it('renders a disabled link', () => {
  172. render(
  173. <LinkButton
  174. href="#"
  175. disabled
  176. />,
  177. );
  178. const button = screen.queryByRole('link');
  179. expect(button).toBeNull();
  180. });
  181. });