Website for showcasing all features of Tesseract Web.
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.
 
 

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