Design system.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

183 行
3.8 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. LinkButton,
  11. } from '.';
  12. vi.mock('@tesseract-design/web-base-button');
  13. describe('LinkButton', () => {
  14. it('renders 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('renders 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('renders 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('renders 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('handles click events', () => {
  51. const onClick = vi.fn().mockImplementationOnce((e) => { e.preventDefault() });
  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('renders 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(Object.values(ButtonBase.ButtonSize))('on %s size', (size) => {
  76. it('renders button styles', () => {
  77. render(
  78. <LinkButton
  79. size={size}
  80. />
  81. );
  82. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  83. size,
  84. }));
  85. });
  86. it('renders badge styles', () => {
  87. render(
  88. <LinkButton
  89. size={size}
  90. badge="badge"
  91. />
  92. );
  93. expect(ButtonBase.BadgeContainer).toBeCalledWith(expect.objectContaining({
  94. size,
  95. }));
  96. });
  97. it('renders indicator styles', () => {
  98. render(
  99. <LinkButton
  100. size={size}
  101. menuItem
  102. />
  103. );
  104. expect(ButtonBase.IndicatorWrapper).toBeCalledWith(expect.objectContaining({
  105. size,
  106. }));
  107. });
  108. });
  109. it.each(Object.values(ButtonBase.ButtonVariant))('renders a button with variant %s', (variant) => {
  110. render(
  111. <LinkButton
  112. variant={variant}
  113. />
  114. );
  115. expect(ButtonBase.Button).toBeCalledWith(expect.objectContaining({
  116. variant,
  117. }));
  118. });
  119. it('renders a bordered button', () => {
  120. render(
  121. <LinkButton
  122. border
  123. />
  124. );
  125. expect(ButtonBase.Border).toBeCalledWith(expect.objectContaining({
  126. border: true,
  127. }));
  128. });
  129. it('renders a block button', () => {
  130. render(
  131. <LinkButton
  132. block
  133. />
  134. );
  135. expect(ButtonBase.Border).toBeCalledWith(expect.objectContaining({
  136. block: true,
  137. }));
  138. });
  139. it('renders children', () => {
  140. render(
  141. <LinkButton>
  142. Foo
  143. </LinkButton>
  144. );
  145. const children: HTMLElement = screen.getByTestId('children');
  146. expect(children).toHaveTextContent('Foo');
  147. });
  148. it('renders a disabled link', () => {
  149. render(
  150. <LinkButton
  151. href="http://example.com"
  152. disabled
  153. />
  154. );
  155. const button = screen.queryByRole('link');
  156. expect(button).toBeNull();
  157. });
  158. });