CommonButton.spec.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. import { renderComponent } from '#tests/support/components/index.ts'
  3. import CommonButton from '../CommonButton.vue'
  4. describe('CommonButton.vue', () => {
  5. it('renders with default prop values', async () => {
  6. const view = renderComponent(CommonButton)
  7. const button = view.getByRole('button')
  8. expect(button).toHaveAttribute('type', 'button')
  9. expect(button).toHaveClasses(['btn', 'btn-secondary', 'btn-sm'])
  10. })
  11. it('renders default slot as the button label', async () => {
  12. const view = renderComponent(CommonButton, {
  13. slots: {
  14. default: 'Button',
  15. },
  16. })
  17. expect(view.getByRole('button', { name: 'Button' })).toBeInTheDocument()
  18. })
  19. it('supports type prop', async () => {
  20. const view = renderComponent(CommonButton, {
  21. props: {
  22. type: 'submit',
  23. },
  24. })
  25. expect(view.getByRole('button')).toHaveAttribute('type', 'submit')
  26. })
  27. it('supports form prop', async () => {
  28. const view = renderComponent(CommonButton, {
  29. props: {
  30. form: 'foobar',
  31. },
  32. })
  33. expect(view.getByRole('button')).toHaveAttribute('form', 'foobar')
  34. })
  35. it('supports disabled prop', async () => {
  36. const view = renderComponent(CommonButton, {
  37. props: {
  38. disabled: true,
  39. },
  40. })
  41. expect(view.getByRole('button')).toBeDisabled()
  42. })
  43. it('supports block prop', async () => {
  44. const view = renderComponent(CommonButton, {
  45. props: {
  46. block: true,
  47. },
  48. })
  49. expect(view.getByRole('button')).toHaveClasses(['btn-block'])
  50. })
  51. it.each([
  52. {
  53. variant: 'primary',
  54. classes: ['btn-primary'],
  55. },
  56. {
  57. variant: 'secondary',
  58. classes: ['btn-secondary'],
  59. },
  60. {
  61. variant: 'tertiary',
  62. classes: ['btn-neutral'],
  63. },
  64. {
  65. variant: 'submit',
  66. classes: ['btn-accent'],
  67. },
  68. {
  69. variant: 'danger',
  70. classes: ['btn-error'],
  71. },
  72. {
  73. variant: 'remove',
  74. classes: ['btn-info'],
  75. },
  76. ])('supports $variant variant', async ({ variant, classes }) => {
  77. const view = renderComponent(CommonButton, {
  78. props: {
  79. variant,
  80. },
  81. })
  82. expect(view.getByRole('button')).toHaveClasses(classes)
  83. })
  84. it('supports prefix/suffix icon props', async () => {
  85. const view = renderComponent(CommonButton, {
  86. props: {
  87. prefixIcon: 'logo',
  88. suffixIcon: 'logo',
  89. },
  90. })
  91. expect(view.getAllByIconName('logo').length).toBe(2)
  92. })
  93. it('supports icon prop', async () => {
  94. const view = renderComponent(CommonButton, {
  95. props: {
  96. icon: 'logo',
  97. },
  98. slots: {
  99. default: 'foobar',
  100. },
  101. })
  102. expect(view.getByIconName('logo')).toBeInTheDocument()
  103. expect(
  104. view.queryByRole('button', { name: 'foobar' }),
  105. ).not.toBeInTheDocument()
  106. })
  107. })