您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import React from 'react'
  2. import { cleanup, fireEvent, render } from '@testing-library/react'
  3. import Button from './index'
  4. afterEach(cleanup)
  5. // https://testing-library.com/docs/queries/about
  6. describe('Button', () => {
  7. describe('Button text', () => {
  8. test('Button text should be same as children', async () => {
  9. const { getByRole, container } = render(<Button>Click me</Button>)
  10. expect(getByRole('button').textContent).toBe('Click me')
  11. expect(container.querySelector('button')?.textContent).toBe('Click me')
  12. })
  13. })
  14. describe('Button loading', () => {
  15. test('Loading button text should include same as children', async () => {
  16. const { getByRole } = render(<Button loading>Click me</Button>)
  17. expect(getByRole('button').textContent?.includes('Loading')).toBe(true)
  18. })
  19. test('Not loading button text should include same as children', async () => {
  20. const { getByRole } = render(<Button loading={false}>Click me</Button>)
  21. expect(getByRole('button').textContent?.includes('Loading')).toBe(false)
  22. })
  23. test('Loading button should have loading classname', async () => {
  24. const animClassName = 'anim-breath'
  25. const { getByRole } = render(<Button loading spinnerClassName={animClassName}>Click me</Button>)
  26. expect(getByRole('button').getElementsByClassName('animate-spin')[0]?.className).toContain(animClassName)
  27. })
  28. })
  29. describe('Button style', () => {
  30. test('Button should have default variant', async () => {
  31. const { getByRole } = render(<Button>Click me</Button>)
  32. expect(getByRole('button').className).toContain('btn-secondary')
  33. })
  34. test('Button should have primary variant', async () => {
  35. const { getByRole } = render(<Button variant='primary'>Click me</Button>)
  36. expect(getByRole('button').className).toContain('btn-primary')
  37. })
  38. test('Button should have warning variant', async () => {
  39. const { getByRole } = render(<Button variant='warning'>Click me</Button>)
  40. expect(getByRole('button').className).toContain('btn-warning')
  41. })
  42. test('Button should have secondary variant', async () => {
  43. const { getByRole } = render(<Button variant='secondary'>Click me</Button>)
  44. expect(getByRole('button').className).toContain('btn-secondary')
  45. })
  46. test('Button should have secondary-accent variant', async () => {
  47. const { getByRole } = render(<Button variant='secondary-accent'>Click me</Button>)
  48. expect(getByRole('button').className).toContain('btn-secondary-accent')
  49. })
  50. test('Button should have ghost variant', async () => {
  51. const { getByRole } = render(<Button variant='ghost'>Click me</Button>)
  52. expect(getByRole('button').className).toContain('btn-ghost')
  53. })
  54. test('Button should have ghost-accent variant', async () => {
  55. const { getByRole } = render(<Button variant='ghost-accent'>Click me</Button>)
  56. expect(getByRole('button').className).toContain('btn-ghost-accent')
  57. })
  58. test('Button disabled should have disabled variant', async () => {
  59. const { getByRole } = render(<Button disabled>Click me</Button>)
  60. expect(getByRole('button').className).toContain('btn-disabled')
  61. })
  62. })
  63. describe('Button size', () => {
  64. test('Button should have default size', async () => {
  65. const { getByRole } = render(<Button>Click me</Button>)
  66. expect(getByRole('button').className).toContain('btn-medium')
  67. })
  68. test('Button should have small size', async () => {
  69. const { getByRole } = render(<Button size='small'>Click me</Button>)
  70. expect(getByRole('button').className).toContain('btn-small')
  71. })
  72. test('Button should have medium size', async () => {
  73. const { getByRole } = render(<Button size='medium'>Click me</Button>)
  74. expect(getByRole('button').className).toContain('btn-medium')
  75. })
  76. test('Button should have large size', async () => {
  77. const { getByRole } = render(<Button size='large'>Click me</Button>)
  78. expect(getByRole('button').className).toContain('btn-large')
  79. })
  80. })
  81. describe('Button destructive', () => {
  82. test('Button should have destructive classname', async () => {
  83. const { getByRole } = render(<Button destructive>Click me</Button>)
  84. expect(getByRole('button').className).toContain('btn-destructive')
  85. })
  86. })
  87. describe('Button events', () => {
  88. test('onClick should been call after clicked', async () => {
  89. const onClick = jest.fn()
  90. const { getByRole } = render(<Button onClick={onClick}>Click me</Button>)
  91. fireEvent.click(getByRole('button'))
  92. expect(onClick).toHaveBeenCalled()
  93. })
  94. })
  95. })