Website for showcasing all features of Tesseract Web.
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

190 righe
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. });