@getmicdrop/svelte-components 5.5.4 → 5.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/dist/calendar/AboutShow/AboutShow.spec.d.ts +2 -0
  2. package/dist/calendar/AboutShow/AboutShow.spec.d.ts.map +1 -0
  3. package/dist/calendar/AboutShow/AboutShow.spec.js +791 -0
  4. package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts +2 -0
  5. package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts.map +1 -0
  6. package/dist/calendar/Calendar/MiniMonthCalendar.spec.js +1191 -0
  7. package/dist/calendar/FAQs/FAQs.spec.d.ts +2 -0
  8. package/dist/calendar/FAQs/FAQs.spec.d.ts.map +1 -0
  9. package/dist/calendar/FAQs/FAQs.spec.js +238 -0
  10. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts +2 -0
  11. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts.map +1 -0
  12. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.js +420 -0
  13. package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts +2 -0
  14. package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts.map +1 -0
  15. package/dist/calendar/OrderSummary/OrderSummary.spec.js +808 -0
  16. package/dist/calendar/PublicCard/PublicCard.spec.d.ts +2 -0
  17. package/dist/calendar/PublicCard/PublicCard.spec.d.ts.map +1 -0
  18. package/dist/calendar/PublicCard/PublicCard.spec.js +301 -0
  19. package/dist/calendar/ShowCard/ShowCard.spec.d.ts +2 -0
  20. package/dist/calendar/ShowCard/ShowCard.spec.d.ts.map +1 -0
  21. package/dist/calendar/ShowCard/ShowCard.spec.js +714 -0
  22. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts +2 -0
  23. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts.map +1 -0
  24. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.js +241 -0
  25. package/dist/components/Layout/Section.spec.d.ts +2 -0
  26. package/dist/components/Layout/Section.spec.d.ts.map +1 -0
  27. package/dist/components/Layout/Section.spec.js +149 -0
  28. package/dist/components/Layout/Sidebar.spec.d.ts +2 -0
  29. package/dist/components/Layout/Sidebar.spec.d.ts.map +1 -0
  30. package/dist/components/Layout/Sidebar.spec.js +186 -0
  31. package/dist/components/Layout/Stack.spec.js +3 -3
  32. package/dist/constants/formOptions.spec.js +9 -5
  33. package/dist/datetime/__tests__/format.test.js +1 -1
  34. package/dist/datetime/__tests__/parse.test.js +1 -1
  35. package/dist/datetime/__tests__/timezone.test.js +124 -2
  36. package/dist/datetime/parse.js +1 -1
  37. package/dist/forms/createFieldTracker.spec.d.ts +2 -0
  38. package/dist/forms/createFieldTracker.spec.d.ts.map +1 -0
  39. package/dist/forms/createFieldTracker.spec.js +343 -0
  40. package/dist/forms/createFormStore.spec.d.ts +2 -0
  41. package/dist/forms/createFormStore.spec.d.ts.map +1 -0
  42. package/dist/forms/createFormStore.spec.js +689 -0
  43. package/dist/forms/createFormStore.svelte.js +0 -1
  44. package/dist/index.d.ts +4 -112
  45. package/dist/index.js +4 -190
  46. package/dist/patterns/data/DataGrid.spec.d.ts +2 -0
  47. package/dist/patterns/data/DataGrid.spec.d.ts.map +1 -0
  48. package/dist/patterns/data/DataGrid.spec.js +159 -0
  49. package/dist/patterns/data/DataList.spec.d.ts +2 -0
  50. package/dist/patterns/data/DataList.spec.d.ts.map +1 -0
  51. package/dist/patterns/data/DataList.spec.js +158 -0
  52. package/dist/patterns/data/DataTable.spec.d.ts +2 -0
  53. package/dist/patterns/data/DataTable.spec.d.ts.map +1 -0
  54. package/dist/patterns/data/DataTable.spec.js +196 -0
  55. package/dist/patterns/forms/FormActions.spec.js +10 -3
  56. package/dist/patterns/forms/FormGrid.spec.d.ts +2 -0
  57. package/dist/patterns/forms/FormGrid.spec.d.ts.map +1 -0
  58. package/dist/patterns/forms/FormGrid.spec.js +125 -0
  59. package/dist/patterns/forms/FormSection.spec.d.ts +2 -0
  60. package/dist/patterns/forms/FormSection.spec.d.ts.map +1 -0
  61. package/dist/patterns/forms/FormSection.spec.js +153 -0
  62. package/dist/patterns/layout/Sidebar.spec.d.ts +2 -0
  63. package/dist/patterns/layout/Sidebar.spec.d.ts.map +1 -0
  64. package/dist/patterns/layout/Sidebar.spec.js +159 -0
  65. package/dist/patterns/navigation/BottomNav.svelte +4 -4
  66. package/dist/patterns/navigation/Header.spec.js +33 -24
  67. package/dist/patterns/page/PageHeader.spec.d.ts +2 -0
  68. package/dist/patterns/page/PageHeader.spec.d.ts.map +1 -0
  69. package/dist/patterns/page/PageHeader.spec.js +167 -0
  70. package/dist/patterns/page/PageLayout.spec.d.ts +2 -0
  71. package/dist/patterns/page/PageLayout.spec.d.ts.map +1 -0
  72. package/dist/patterns/page/PageLayout.spec.js +145 -0
  73. package/dist/patterns/page/PageLoader.spec.js +5 -2
  74. package/dist/patterns/page/SectionHeader.spec.d.ts +2 -0
  75. package/dist/patterns/page/SectionHeader.spec.d.ts.map +1 -0
  76. package/dist/patterns/page/SectionHeader.spec.js +197 -0
  77. package/dist/presets/badges.spec.d.ts +2 -0
  78. package/dist/presets/badges.spec.d.ts.map +1 -0
  79. package/dist/presets/badges.spec.js +172 -0
  80. package/dist/presets/buttons.spec.d.ts +2 -0
  81. package/dist/presets/buttons.spec.d.ts.map +1 -0
  82. package/dist/presets/buttons.spec.js +135 -0
  83. package/dist/primitives/Accordion/Accordion.spec.d.ts +2 -0
  84. package/dist/primitives/Accordion/Accordion.spec.d.ts.map +1 -0
  85. package/dist/primitives/Accordion/Accordion.spec.js +83 -0
  86. package/dist/primitives/Accordion/AccordionItem.spec.d.ts +2 -0
  87. package/dist/primitives/Accordion/AccordionItem.spec.d.ts.map +1 -0
  88. package/dist/primitives/Accordion/AccordionItem.spec.js +661 -0
  89. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -0
  90. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts +35 -0
  91. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts.map +1 -0
  92. package/dist/primitives/Alert/Alert.spec.js +5 -2
  93. package/dist/primitives/Avatar/Avatar.spec.d.ts +2 -0
  94. package/dist/primitives/Avatar/Avatar.spec.d.ts.map +1 -0
  95. package/dist/primitives/Avatar/Avatar.spec.js +211 -0
  96. package/dist/primitives/Badges/Badge.spec.js +109 -68
  97. package/dist/primitives/BottomSheet/BottomSheet.spec.js +36 -27
  98. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte +13 -0
  99. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts +7 -0
  100. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts.map +1 -0
  101. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +15 -13
  102. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +5 -5
  103. package/dist/primitives/Button/Button.spec.js +83 -71
  104. package/dist/primitives/Button/ButtonSaveDemo.spec.js +100 -2
  105. package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts +2 -0
  106. package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts.map +1 -0
  107. package/dist/primitives/Button/ButtonVariantShowcase.spec.js +202 -0
  108. package/dist/primitives/Card.spec.js +1 -1
  109. package/dist/primitives/Checkbox/Checkbox.spec.d.ts +2 -0
  110. package/dist/primitives/Checkbox/Checkbox.spec.d.ts.map +1 -0
  111. package/dist/primitives/Checkbox/Checkbox.spec.js +252 -0
  112. package/dist/primitives/DarkModeToggle.spec.js +84 -51
  113. package/dist/primitives/Drawer/Drawer.spec.d.ts +2 -0
  114. package/dist/primitives/Drawer/Drawer.spec.d.ts.map +1 -0
  115. package/dist/primitives/Drawer/Drawer.spec.js +212 -0
  116. package/dist/primitives/Dropdown/Dropdown.spec.d.ts +2 -0
  117. package/dist/primitives/Dropdown/Dropdown.spec.d.ts.map +1 -0
  118. package/dist/primitives/Dropdown/Dropdown.spec.js +366 -0
  119. package/dist/primitives/Dropdown/DropdownItem.spec.d.ts +2 -0
  120. package/dist/primitives/Dropdown/DropdownItem.spec.d.ts.map +1 -0
  121. package/dist/primitives/Dropdown/DropdownItem.spec.js +182 -0
  122. package/dist/primitives/Icons/iconTestUtils.spec.d.ts +2 -0
  123. package/dist/primitives/Icons/iconTestUtils.spec.d.ts.map +1 -0
  124. package/dist/primitives/Icons/iconTestUtils.spec.js +235 -0
  125. package/dist/primitives/Input/Input.spec.js +14 -14
  126. package/dist/primitives/Input/Input.svelte +1 -14
  127. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  128. package/dist/primitives/Input/Select.spec.js +11 -17
  129. package/dist/primitives/Input/Textarea.spec.d.ts +2 -0
  130. package/dist/primitives/Input/Textarea.spec.d.ts.map +1 -0
  131. package/dist/primitives/Input/Textarea.spec.js +255 -0
  132. package/dist/primitives/Label/Label.spec.d.ts +2 -0
  133. package/dist/primitives/Label/Label.spec.d.ts.map +1 -0
  134. package/dist/primitives/Label/Label.spec.js +157 -0
  135. package/dist/primitives/Modal/Modal.spec.js +29 -25
  136. package/dist/primitives/Modal/ModalTestWrapper.svelte +65 -0
  137. package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts +23 -0
  138. package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts.map +1 -0
  139. package/dist/primitives/NumberInput/NumberInput.spec.d.ts +2 -0
  140. package/dist/primitives/NumberInput/NumberInput.spec.d.ts.map +1 -0
  141. package/dist/primitives/NumberInput/NumberInput.spec.js +235 -0
  142. package/dist/primitives/Pagination/Pagination.spec.d.ts +2 -0
  143. package/dist/primitives/Pagination/Pagination.spec.d.ts.map +1 -0
  144. package/dist/primitives/Pagination/Pagination.spec.js +266 -0
  145. package/dist/primitives/Radio/Radio.spec.d.ts +2 -0
  146. package/dist/primitives/Radio/Radio.spec.d.ts.map +1 -0
  147. package/dist/primitives/Radio/Radio.spec.js +206 -0
  148. package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts +2 -0
  149. package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts.map +1 -0
  150. package/dist/primitives/Skeleton/CardPlaceholder.spec.js +156 -0
  151. package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts +2 -0
  152. package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts.map +1 -0
  153. package/dist/primitives/Skeleton/ImagePlaceholder.spec.js +120 -0
  154. package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts +2 -0
  155. package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts.map +1 -0
  156. package/dist/primitives/Skeleton/ListPlaceholder.spec.js +220 -0
  157. package/dist/primitives/Skeleton/Skeleton.spec.d.ts +2 -0
  158. package/dist/primitives/Skeleton/Skeleton.spec.d.ts.map +1 -0
  159. package/dist/primitives/Skeleton/Skeleton.spec.js +173 -0
  160. package/dist/primitives/Spinner/Spinner.spec.js +25 -29
  161. package/dist/primitives/Tabs/TabItem.spec.d.ts +2 -0
  162. package/dist/primitives/Tabs/TabItem.spec.d.ts.map +1 -0
  163. package/dist/primitives/Tabs/TabItem.spec.js +130 -0
  164. package/dist/primitives/Tabs/Tabs.spec.d.ts +2 -0
  165. package/dist/primitives/Tabs/Tabs.spec.d.ts.map +1 -0
  166. package/dist/primitives/Tabs/Tabs.spec.js +295 -0
  167. package/dist/primitives/Tabs/TabsWithItems.test.svelte +18 -0
  168. package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts +16 -0
  169. package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts.map +1 -0
  170. package/dist/primitives/Toggle.spec.js +93 -77
  171. package/dist/primitives/Typography/Typography.spec.d.ts +2 -0
  172. package/dist/primitives/Typography/Typography.spec.d.ts.map +1 -0
  173. package/dist/primitives/Typography/Typography.spec.js +183 -0
  174. package/dist/primitives/ValidationError.spec.js +1 -1
  175. package/dist/primitives/index.d.ts +1 -0
  176. package/dist/primitives/index.js +3 -0
  177. package/dist/recipes/CropImage/CropImage.spec.js +1 -9
  178. package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts +2 -0
  179. package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts.map +1 -0
  180. package/dist/recipes/ImageUploader/ImageUploader.spec.js +1351 -0
  181. package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts +2 -0
  182. package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts.map +1 -0
  183. package/dist/recipes/SuperLogin/SuperLogin.spec.js +1436 -0
  184. package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts +2 -0
  185. package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts.map +1 -0
  186. package/dist/recipes/feedback/EmptyState/EmptyState.spec.js +202 -0
  187. package/dist/recipes/feedback/ErrorDisplay.spec.js +6 -6
  188. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +21 -17
  189. package/dist/recipes/fields/CheckboxField.spec.d.ts +2 -0
  190. package/dist/recipes/fields/CheckboxField.spec.d.ts.map +1 -0
  191. package/dist/recipes/fields/CheckboxField.spec.js +135 -0
  192. package/dist/recipes/fields/FormField.spec.d.ts +2 -0
  193. package/dist/recipes/fields/FormField.spec.d.ts.map +1 -0
  194. package/dist/recipes/fields/FormField.spec.js +159 -0
  195. package/dist/recipes/fields/RadioGroup.spec.d.ts +2 -0
  196. package/dist/recipes/fields/RadioGroup.spec.d.ts.map +1 -0
  197. package/dist/recipes/fields/RadioGroup.spec.js +199 -0
  198. package/dist/recipes/fields/SelectField.spec.d.ts +2 -0
  199. package/dist/recipes/fields/SelectField.spec.d.ts.map +1 -0
  200. package/dist/recipes/fields/SelectField.spec.js +188 -0
  201. package/dist/recipes/fields/TextareaField.spec.d.ts +2 -0
  202. package/dist/recipes/fields/TextareaField.spec.d.ts.map +1 -0
  203. package/dist/recipes/fields/TextareaField.spec.js +205 -0
  204. package/dist/recipes/fields/ToggleField.spec.d.ts +2 -0
  205. package/dist/recipes/fields/ToggleField.spec.d.ts.map +1 -0
  206. package/dist/recipes/fields/ToggleField.spec.js +153 -0
  207. package/dist/recipes/inputs/MultiSelect.spec.js +4 -3
  208. package/dist/recipes/inputs/MultiSelect.svelte +10 -3
  209. package/dist/recipes/inputs/MultiSelect.svelte.d.ts +2 -0
  210. package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
  211. package/dist/recipes/inputs/OTPInput.spec.js +52 -39
  212. package/dist/recipes/inputs/PasswordInput.spec.d.ts +2 -0
  213. package/dist/recipes/inputs/PasswordInput.spec.d.ts.map +1 -0
  214. package/dist/recipes/inputs/PasswordInput.spec.js +410 -0
  215. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +253 -173
  216. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte +71 -0
  217. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts +9 -0
  218. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts.map +1 -0
  219. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +1246 -300
  220. package/dist/recipes/inputs/Search.spec.d.ts +2 -0
  221. package/dist/recipes/inputs/Search.spec.d.ts.map +1 -0
  222. package/dist/recipes/inputs/Search.spec.js +177 -0
  223. package/dist/recipes/inputs/SelectDropdown.spec.d.ts +2 -0
  224. package/dist/recipes/inputs/SelectDropdown.spec.d.ts.map +1 -0
  225. package/dist/recipes/inputs/SelectDropdown.spec.js +512 -0
  226. package/dist/recipes/modals/AlertModal.spec.d.ts +2 -0
  227. package/dist/recipes/modals/AlertModal.spec.d.ts.map +1 -0
  228. package/dist/recipes/modals/AlertModal.spec.js +432 -0
  229. package/dist/recipes/modals/ConfirmationModal.spec.js +36 -21
  230. package/dist/recipes/modals/InputModal.spec.d.ts +2 -0
  231. package/dist/recipes/modals/InputModal.spec.d.ts.map +1 -0
  232. package/dist/recipes/modals/InputModal.spec.js +872 -0
  233. package/dist/recipes/modals/ModalTestWrapper.spec.d.ts +2 -0
  234. package/dist/recipes/modals/ModalTestWrapper.spec.d.ts.map +1 -0
  235. package/dist/recipes/modals/ModalTestWrapper.spec.js +502 -0
  236. package/dist/recipes/modals/StatusModal.spec.d.ts +2 -0
  237. package/dist/recipes/modals/StatusModal.spec.d.ts.map +1 -0
  238. package/dist/recipes/modals/StatusModal.spec.js +599 -0
  239. package/dist/services/ShowService.spec.js +18 -15
  240. package/dist/stories/ButtonAuditDashboard.spec.d.ts +2 -0
  241. package/dist/stories/ButtonAuditDashboard.spec.d.ts.map +1 -0
  242. package/dist/stories/ButtonAuditDashboard.spec.js +913 -0
  243. package/dist/stories/ButtonAuditReview.spec.d.ts +2 -0
  244. package/dist/stories/ButtonAuditReview.spec.d.ts.map +1 -0
  245. package/dist/stories/ButtonAuditReview.spec.js +422 -0
  246. package/dist/stories/ButtonGridView.spec.d.ts +2 -0
  247. package/dist/stories/ButtonGridView.spec.d.ts.map +1 -0
  248. package/dist/stories/ButtonGridView.spec.js +667 -0
  249. package/dist/stories/ButtonShowcase.spec.d.ts +2 -0
  250. package/dist/stories/ButtonShowcase.spec.d.ts.map +1 -0
  251. package/dist/stories/ButtonShowcase.spec.js +499 -0
  252. package/dist/stories/PatternsGallery.spec.d.ts +2 -0
  253. package/dist/stories/PatternsGallery.spec.d.ts.map +1 -0
  254. package/dist/stories/PatternsGallery.spec.js +514 -0
  255. package/dist/stories/PrimitivesGallery.spec.d.ts +2 -0
  256. package/dist/stories/PrimitivesGallery.spec.d.ts.map +1 -0
  257. package/dist/stories/PrimitivesGallery.spec.js +813 -0
  258. package/dist/stories/RecipesGallery.spec.d.ts +2 -0
  259. package/dist/stories/RecipesGallery.spec.d.ts.map +1 -0
  260. package/dist/stories/RecipesGallery.spec.js +299 -0
  261. package/dist/stripe/useStripeTheme.spec.d.ts +2 -0
  262. package/dist/stripe/useStripeTheme.spec.d.ts.map +1 -0
  263. package/dist/stripe/useStripeTheme.spec.js +793 -0
  264. package/dist/telemetry.d.ts.map +1 -1
  265. package/dist/telemetry.js +6 -5
  266. package/dist/telemetry.spec.js +495 -12
  267. package/dist/tokens/__tests__/colors.test.d.ts +2 -0
  268. package/dist/tokens/__tests__/colors.test.d.ts.map +1 -0
  269. package/dist/tokens/__tests__/colors.test.js +152 -0
  270. package/dist/tokens/__tests__/radius.test.d.ts +2 -0
  271. package/dist/tokens/__tests__/radius.test.d.ts.map +1 -0
  272. package/dist/tokens/__tests__/radius.test.js +118 -0
  273. package/dist/tokens/__tests__/shadows.test.d.ts +2 -0
  274. package/dist/tokens/__tests__/shadows.test.d.ts.map +1 -0
  275. package/dist/tokens/__tests__/shadows.test.js +105 -0
  276. package/dist/tokens/__tests__/spacing.test.js +11 -8
  277. package/dist/tokens/__tests__/typography.test.d.ts +2 -0
  278. package/dist/tokens/__tests__/typography.test.d.ts.map +1 -0
  279. package/dist/tokens/__tests__/typography.test.js +156 -0
  280. package/dist/tokens/__tests__/z-index.test.d.ts +2 -0
  281. package/dist/tokens/__tests__/z-index.test.d.ts.map +1 -0
  282. package/dist/tokens/__tests__/z-index.test.js +121 -0
  283. package/dist/utils/apiConfig.spec.js +102 -1
  284. package/dist/utils/formatters.spec.d.ts +2 -0
  285. package/dist/utils/formatters.spec.d.ts.map +1 -0
  286. package/dist/utils/formatters.spec.js +82 -0
  287. package/dist/utils/transitions.spec.d.ts +2 -0
  288. package/dist/utils/transitions.spec.d.ts.map +1 -0
  289. package/dist/utils/transitions.spec.js +130 -0
  290. package/package.json +8 -3
@@ -0,0 +1,791 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { render, screen, cleanup, fireEvent } from '@testing-library/svelte';
3
+ import AboutShow from './AboutShow.svelte';
4
+
5
+ describe('AboutShow Component', () => {
6
+ afterEach(() => {
7
+ cleanup();
8
+ });
9
+
10
+ describe('basic rendering', () => {
11
+ it('renders with default props', () => {
12
+ render(AboutShow);
13
+ expect(screen.getByText('About the Show')).toBeInTheDocument();
14
+ });
15
+
16
+ it('renders custom title', () => {
17
+ render(AboutShow, { props: { title: 'Show Details' } });
18
+ expect(screen.getByText('Show Details')).toBeInTheDocument();
19
+ });
20
+
21
+ it('hides title when showTitle is false', () => {
22
+ render(AboutShow, { props: { showTitle: false } });
23
+ expect(screen.queryByText('About the Show')).not.toBeInTheDocument();
24
+ });
25
+
26
+ it('renders without crashing with empty props', () => {
27
+ const { container } = render(AboutShow);
28
+ expect(container.querySelector('.flex.flex-col.gap-3')).toBeInTheDocument();
29
+ });
30
+ });
31
+
32
+ describe('show image', () => {
33
+ it('renders show image when ShowImage and description are provided', () => {
34
+ render(AboutShow, {
35
+ props: {
36
+ ShowImage: 'https://example.com/image.jpg',
37
+ description: 'Test description'
38
+ }
39
+ });
40
+ const img = screen.getByAltText('');
41
+ expect(img).toBeInTheDocument();
42
+ expect(img).toHaveAttribute('src', 'https://example.com/image.jpg');
43
+ });
44
+
45
+ it('does not render image when ShowImage is empty', () => {
46
+ render(AboutShow, {
47
+ props: {
48
+ ShowImage: '',
49
+ description: 'Test description'
50
+ }
51
+ });
52
+ expect(screen.queryByRole('img')).not.toBeInTheDocument();
53
+ });
54
+
55
+ it('does not render image when description is empty', () => {
56
+ render(AboutShow, {
57
+ props: {
58
+ ShowImage: 'https://example.com/image.jpg',
59
+ description: ''
60
+ }
61
+ });
62
+ expect(screen.queryByRole('img', { name: '' })).not.toBeInTheDocument();
63
+ });
64
+
65
+ it('applies correct styling to show image', () => {
66
+ render(AboutShow, {
67
+ props: {
68
+ ShowImage: 'https://example.com/image.jpg',
69
+ description: 'Test description'
70
+ }
71
+ });
72
+ const img = screen.getByAltText('');
73
+ expect(img.className).toContain('rounded-lg');
74
+ expect(img.className).toContain('object-contain');
75
+ expect(img.className).toContain('w-full');
76
+ });
77
+ });
78
+
79
+ describe('description display', () => {
80
+ it('renders short description without read more', () => {
81
+ const shortDescription = 'This is a short description';
82
+ render(AboutShow, { props: { description: shortDescription } });
83
+ expect(screen.getByText(shortDescription)).toBeInTheDocument();
84
+ expect(screen.queryByText('Show more')).not.toBeInTheDocument();
85
+ });
86
+
87
+ it('renders truncated long description with show more button', () => {
88
+ const longDescription = 'a'.repeat(1600);
89
+ render(AboutShow, { props: { description: longDescription } });
90
+ expect(screen.getByText(/^a+\.\.\.$/)).toBeInTheDocument();
91
+ expect(screen.getByText('Show more')).toBeInTheDocument();
92
+ });
93
+
94
+ it('expands description when show more is clicked', async () => {
95
+ const longDescription = 'a'.repeat(1600);
96
+ render(AboutShow, { props: { description: longDescription } });
97
+
98
+ const showMoreButton = screen.getByText('Show more');
99
+ await fireEvent.click(showMoreButton);
100
+
101
+ expect(screen.getByText('Show less')).toBeInTheDocument();
102
+ expect(screen.queryByText('Show more')).not.toBeInTheDocument();
103
+ });
104
+
105
+ it('collapses description when show less is clicked', async () => {
106
+ const longDescription = 'a'.repeat(1600);
107
+ render(AboutShow, { props: { description: longDescription } });
108
+
109
+ const showMoreButton = screen.getByText('Show more');
110
+ await fireEvent.click(showMoreButton);
111
+
112
+ const showLessButton = screen.getByText('Show less');
113
+ await fireEvent.click(showLessButton);
114
+
115
+ expect(screen.getByText('Show more')).toBeInTheDocument();
116
+ expect(screen.queryByText('Show less')).not.toBeInTheDocument();
117
+ });
118
+
119
+ it('does not show read more when showReadMore is false', () => {
120
+ const longDescription = 'a'.repeat(1600);
121
+ render(AboutShow, {
122
+ props: {
123
+ description: longDescription,
124
+ showReadMore: false
125
+ }
126
+ });
127
+ expect(screen.queryByText('Show more')).not.toBeInTheDocument();
128
+ expect(screen.getByText(longDescription)).toBeInTheDocument();
129
+ });
130
+
131
+ it('preserves whitespace in description with whitespace-pre-line', () => {
132
+ const descriptionWithNewlines = 'Line 1\nLine 2\nLine 3';
133
+ const { container } = render(AboutShow, {
134
+ props: { description: descriptionWithNewlines }
135
+ });
136
+ const paragraph = container.querySelector('p');
137
+ expect(paragraph.className).toContain('whitespace-pre-line');
138
+ });
139
+
140
+ it('does not render description when empty', () => {
141
+ const { container } = render(AboutShow, { props: { description: '' } });
142
+ const paragraphs = container.querySelectorAll('p');
143
+ const descriptionParagraphs = Array.from(paragraphs).filter(p =>
144
+ p.className.includes('whitespace-pre-line')
145
+ );
146
+ expect(descriptionParagraphs.length).toBe(0);
147
+ });
148
+ });
149
+
150
+ describe('performers filtering', () => {
151
+ it('filters out unconfirmed performers', () => {
152
+ const performers = [
153
+ {
154
+ ID: 1,
155
+ acceptedState: 1,
156
+ shouldBeHidden: false,
157
+ RosterPerformer: {
158
+ User: {
159
+ performerProfile: {
160
+ firstName: 'John',
161
+ lastName: 'Doe',
162
+ profileImage: 'image1.jpg'
163
+ }
164
+ }
165
+ }
166
+ }
167
+ ];
168
+ render(AboutShow, { props: { performers } });
169
+ expect(screen.queryByText('John Doe')).not.toBeInTheDocument();
170
+ });
171
+
172
+ it('filters out hidden performers', () => {
173
+ const performers = [
174
+ {
175
+ ID: 1,
176
+ acceptedState: 2,
177
+ shouldBeHidden: true,
178
+ RosterPerformer: {
179
+ User: {
180
+ performerProfile: {
181
+ firstName: 'Jane',
182
+ lastName: 'Smith',
183
+ profileImage: 'image2.jpg'
184
+ }
185
+ }
186
+ }
187
+ }
188
+ ];
189
+ render(AboutShow, { props: { performers } });
190
+ expect(screen.queryByText('Jane Smith')).not.toBeInTheDocument();
191
+ });
192
+
193
+ it('filters out performers without names', () => {
194
+ const performers = [
195
+ {
196
+ ID: 1,
197
+ acceptedState: 2,
198
+ shouldBeHidden: false,
199
+ RosterPerformer: {
200
+ User: {
201
+ performerProfile: {
202
+ profileImage: 'image3.jpg'
203
+ }
204
+ }
205
+ }
206
+ }
207
+ ];
208
+ render(AboutShow, { props: { performers } });
209
+ const performerCards = screen.queryAllByRole('img');
210
+ expect(performerCards.length).toBe(0);
211
+ });
212
+
213
+ it('shows confirmed, non-hidden performers with names', () => {
214
+ const performers = [
215
+ {
216
+ ID: 1,
217
+ acceptedState: 2,
218
+ shouldBeHidden: false,
219
+ RosterPerformer: {
220
+ User: {
221
+ performerProfile: {
222
+ firstName: 'Alice',
223
+ lastName: 'Wonder',
224
+ profileImage: 'alice.jpg'
225
+ }
226
+ }
227
+ }
228
+ }
229
+ ];
230
+ render(AboutShow, { props: { performers } });
231
+ expect(screen.getByText('Alice Wonder')).toBeInTheDocument();
232
+ });
233
+
234
+ it('does not render performers section when no valid performers', () => {
235
+ const { container } = render(AboutShow, { props: { performers: [] } });
236
+ const performerSection = container.querySelector('.py-2');
237
+ expect(performerSection).not.toBeInTheDocument();
238
+ });
239
+ });
240
+
241
+ describe('performer display', () => {
242
+ const validPerformer = {
243
+ ID: 1,
244
+ acceptedState: 2,
245
+ shouldBeHidden: false,
246
+ RosterPerformer: {
247
+ User: {
248
+ performerProfile: {
249
+ firstName: 'Bob',
250
+ lastName: 'Builder',
251
+ profileImage: 'bob.jpg'
252
+ }
253
+ }
254
+ }
255
+ };
256
+
257
+ it('displays performer name', () => {
258
+ render(AboutShow, { props: { performers: [validPerformer] } });
259
+ expect(screen.getByText('Bob Builder')).toBeInTheDocument();
260
+ });
261
+
262
+ it('uses stage name when useStageName is true', () => {
263
+ const performerWithStageName = {
264
+ ...validPerformer,
265
+ RosterPerformer: {
266
+ User: {
267
+ performerProfile: {
268
+ firstName: 'Bob',
269
+ lastName: 'Builder',
270
+ stageName: 'The Builder',
271
+ useStageName: true,
272
+ profileImage: 'bob.jpg'
273
+ }
274
+ }
275
+ }
276
+ };
277
+ render(AboutShow, { props: { performers: [performerWithStageName] } });
278
+ expect(screen.getByText('The Builder')).toBeInTheDocument();
279
+ expect(screen.queryByText('Bob Builder')).not.toBeInTheDocument();
280
+ });
281
+
282
+ it('uses first and last name when useStageName is false', () => {
283
+ const performerWithStageName = {
284
+ ...validPerformer,
285
+ RosterPerformer: {
286
+ User: {
287
+ performerProfile: {
288
+ firstName: 'Bob',
289
+ lastName: 'Builder',
290
+ stageName: 'The Builder',
291
+ useStageName: false,
292
+ profileImage: 'bob.jpg'
293
+ }
294
+ }
295
+ }
296
+ };
297
+ render(AboutShow, { props: { performers: [performerWithStageName] } });
298
+ expect(screen.getByText('Bob Builder')).toBeInTheDocument();
299
+ expect(screen.queryByText('The Builder')).not.toBeInTheDocument();
300
+ });
301
+
302
+ it('uses getImageUrl function for performer images', () => {
303
+ const mockGetImageUrl = vi.fn((url) => `https://cdn.example.com/${url}`);
304
+ render(AboutShow, {
305
+ props: {
306
+ performers: [validPerformer],
307
+ getImageUrl: mockGetImageUrl
308
+ }
309
+ });
310
+ expect(mockGetImageUrl).toHaveBeenCalledWith('bob.jpg');
311
+ });
312
+
313
+ it('handles performer without profileImage', () => {
314
+ const performerNoImage = {
315
+ ...validPerformer,
316
+ RosterPerformer: {
317
+ User: {
318
+ performerProfile: {
319
+ firstName: 'Charlie',
320
+ lastName: 'Brown'
321
+ }
322
+ }
323
+ }
324
+ };
325
+ const { container } = render(AboutShow, {
326
+ props: { performers: [performerNoImage] }
327
+ });
328
+ const img = screen.getByAltText('Charlie Brown');
329
+ expect(img).toHaveAttribute('src', '');
330
+ expect(img.className).toContain('bg-gray-50');
331
+ });
332
+
333
+ it('renders multiple performers', () => {
334
+ const performers = [
335
+ validPerformer,
336
+ {
337
+ ID: 2,
338
+ acceptedState: 2,
339
+ shouldBeHidden: false,
340
+ RosterPerformer: {
341
+ User: {
342
+ performerProfile: {
343
+ firstName: 'Alice',
344
+ lastName: 'Wonder',
345
+ profileImage: 'alice.jpg'
346
+ }
347
+ }
348
+ }
349
+ }
350
+ ];
351
+ render(AboutShow, { props: { performers } });
352
+ expect(screen.getByText('Bob Builder')).toBeInTheDocument();
353
+ expect(screen.getByText('Alice Wonder')).toBeInTheDocument();
354
+ });
355
+ });
356
+
357
+ describe('performer interaction', () => {
358
+ const validPerformer = {
359
+ ID: 1,
360
+ acceptedState: 2,
361
+ shouldBeHidden: false,
362
+ RosterPerformer: {
363
+ User: {
364
+ performerProfile: {
365
+ firstName: 'Bob',
366
+ lastName: 'Builder',
367
+ biography: 'Bob is a builder who builds things.',
368
+ instagram: 'https://instagram.com/bob',
369
+ twitter: 'https://twitter.com/bob',
370
+ profileImage: 'bob.jpg'
371
+ }
372
+ }
373
+ }
374
+ };
375
+
376
+ it('shows performer biography when clicked', async () => {
377
+ render(AboutShow, { props: { performers: [validPerformer] } });
378
+
379
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
380
+ await fireEvent.click(performerCard);
381
+
382
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
383
+ });
384
+
385
+ it('hides performer biography when clicked again', async () => {
386
+ render(AboutShow, { props: { performers: [validPerformer] } });
387
+
388
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
389
+ await fireEvent.click(performerCard);
390
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
391
+
392
+ await fireEvent.click(performerCard);
393
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
394
+ });
395
+
396
+ it('closes performer popup when close button is clicked', async () => {
397
+ render(AboutShow, { props: { performers: [validPerformer] } });
398
+
399
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
400
+ await fireEvent.click(performerCard);
401
+
402
+ const closeButton = screen.getByLabelText('Close');
403
+ await fireEvent.click(closeButton);
404
+
405
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
406
+ });
407
+
408
+ it('closes performer popup when backdrop is clicked', async () => {
409
+ const { container } = render(AboutShow, { props: { performers: [validPerformer] } });
410
+
411
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
412
+ await fireEvent.click(performerCard);
413
+
414
+ const backdrop = container.querySelector('.fixed.inset-0.z-40');
415
+ await fireEvent.click(backdrop);
416
+
417
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
418
+ });
419
+
420
+ it('stops propagation when clicking inside popup', async () => {
421
+ const { container } = render(AboutShow, { props: { performers: [validPerformer] } });
422
+
423
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
424
+ await fireEvent.click(performerCard);
425
+
426
+ const popup = screen.getByText('Bob is a builder who builds things.').closest('.absolute');
427
+ await fireEvent.click(popup);
428
+
429
+ // Popup should still be visible
430
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
431
+ });
432
+
433
+ it('highlights active performer card', async () => {
434
+ render(AboutShow, { props: { performers: [validPerformer] } });
435
+
436
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
437
+ expect(performerCard.className).toContain('border-gray-200');
438
+
439
+ await fireEvent.click(performerCard);
440
+ // Check for the active state border (not the hover state)
441
+ const activeClassPattern = /border-blue-700(?!\s*dark:hover)/;
442
+ expect(performerCard.className).toMatch(activeClassPattern);
443
+ });
444
+
445
+ it('closes other performer when new one is opened', async () => {
446
+ const performers = [
447
+ validPerformer,
448
+ {
449
+ ID: 2,
450
+ acceptedState: 2,
451
+ shouldBeHidden: false,
452
+ RosterPerformer: {
453
+ User: {
454
+ performerProfile: {
455
+ firstName: 'Alice',
456
+ lastName: 'Wonder',
457
+ biography: 'Alice wonders about things.',
458
+ profileImage: 'alice.jpg'
459
+ }
460
+ }
461
+ }
462
+ }
463
+ ];
464
+ render(AboutShow, { props: { performers } });
465
+
466
+ const bobCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
467
+ const aliceCard = screen.getByText('Alice Wonder').closest('.cursor-pointer');
468
+
469
+ await fireEvent.click(bobCard);
470
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
471
+
472
+ await fireEvent.click(aliceCard);
473
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
474
+ expect(screen.getByText('Alice wonders about things.')).toBeInTheDocument();
475
+ });
476
+ });
477
+
478
+ describe('social media links', () => {
479
+ const performerWithSocials = {
480
+ ID: 1,
481
+ acceptedState: 2,
482
+ shouldBeHidden: false,
483
+ RosterPerformer: {
484
+ User: {
485
+ performerProfile: {
486
+ firstName: 'Bob',
487
+ lastName: 'Builder',
488
+ biography: 'Bob is a builder.',
489
+ instagram: 'https://instagram.com/bob',
490
+ twitter: 'https://twitter.com/bob',
491
+ profileImage: 'bob.jpg'
492
+ }
493
+ }
494
+ }
495
+ };
496
+
497
+ it('displays instagram link when available', async () => {
498
+ render(AboutShow, { props: { performers: [performerWithSocials] } });
499
+
500
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
501
+ await fireEvent.click(performerCard);
502
+
503
+ const instagramLink = screen.getByLabelText('Instagram profile');
504
+ expect(instagramLink).toBeInTheDocument();
505
+ expect(instagramLink).toHaveAttribute('href', 'https://instagram.com/bob');
506
+ expect(instagramLink).toHaveAttribute('target', '_blank');
507
+ expect(instagramLink).toHaveAttribute('rel', 'noopener noreferrer');
508
+ });
509
+
510
+ it('displays twitter link when available', async () => {
511
+ render(AboutShow, { props: { performers: [performerWithSocials] } });
512
+
513
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
514
+ await fireEvent.click(performerCard);
515
+
516
+ const twitterLink = screen.getByLabelText('Twitter profile');
517
+ expect(twitterLink).toBeInTheDocument();
518
+ expect(twitterLink).toHaveAttribute('href', 'https://twitter.com/bob');
519
+ expect(twitterLink).toHaveAttribute('target', '_blank');
520
+ expect(twitterLink).toHaveAttribute('rel', 'noopener noreferrer');
521
+ });
522
+
523
+ it('does not display social section when no socials available', async () => {
524
+ const performerNoSocials = {
525
+ ...performerWithSocials,
526
+ RosterPerformer: {
527
+ User: {
528
+ performerProfile: {
529
+ firstName: 'Bob',
530
+ lastName: 'Builder',
531
+ biography: 'Bob is a builder.',
532
+ profileImage: 'bob.jpg'
533
+ }
534
+ }
535
+ }
536
+ };
537
+ render(AboutShow, { props: { performers: [performerNoSocials] } });
538
+
539
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
540
+ await fireEvent.click(performerCard);
541
+
542
+ expect(screen.queryByText(/Follow/)).not.toBeInTheDocument();
543
+ });
544
+
545
+ it('displays only instagram when twitter not available', async () => {
546
+ const performerInstagramOnly = {
547
+ ...performerWithSocials,
548
+ RosterPerformer: {
549
+ User: {
550
+ performerProfile: {
551
+ firstName: 'Bob',
552
+ lastName: 'Builder',
553
+ biography: 'Bob is a builder.',
554
+ instagram: 'https://instagram.com/bob',
555
+ profileImage: 'bob.jpg'
556
+ }
557
+ }
558
+ }
559
+ };
560
+ render(AboutShow, { props: { performers: [performerInstagramOnly] } });
561
+
562
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
563
+ await fireEvent.click(performerCard);
564
+
565
+ expect(screen.getByLabelText('Instagram profile')).toBeInTheDocument();
566
+ expect(screen.queryByLabelText('Twitter profile')).not.toBeInTheDocument();
567
+ });
568
+
569
+ it('displays only twitter when instagram not available', async () => {
570
+ const performerTwitterOnly = {
571
+ ...performerWithSocials,
572
+ RosterPerformer: {
573
+ User: {
574
+ performerProfile: {
575
+ firstName: 'Bob',
576
+ lastName: 'Builder',
577
+ biography: 'Bob is a builder.',
578
+ twitter: 'https://twitter.com/bob',
579
+ profileImage: 'bob.jpg'
580
+ }
581
+ }
582
+ }
583
+ };
584
+ render(AboutShow, { props: { performers: [performerTwitterOnly] } });
585
+
586
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
587
+ await fireEvent.click(performerCard);
588
+
589
+ expect(screen.getByLabelText('Twitter profile')).toBeInTheDocument();
590
+ expect(screen.queryByLabelText('Instagram profile')).not.toBeInTheDocument();
591
+ });
592
+
593
+ it('displays follow text with performer first name', async () => {
594
+ render(AboutShow, { props: { performers: [performerWithSocials] } });
595
+
596
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
597
+ await fireEvent.click(performerCard);
598
+
599
+ expect(screen.getByText('Follow Bob:')).toBeInTheDocument();
600
+ });
601
+ });
602
+
603
+ describe('popup positioning', () => {
604
+ const performers = [
605
+ {
606
+ ID: 1,
607
+ acceptedState: 2,
608
+ shouldBeHidden: false,
609
+ RosterPerformer: {
610
+ User: {
611
+ performerProfile: {
612
+ firstName: 'First',
613
+ lastName: 'Performer',
614
+ biography: 'First performer bio.',
615
+ profileImage: 'first.jpg'
616
+ }
617
+ }
618
+ }
619
+ },
620
+ {
621
+ ID: 2,
622
+ acceptedState: 2,
623
+ shouldBeHidden: false,
624
+ RosterPerformer: {
625
+ User: {
626
+ performerProfile: {
627
+ firstName: 'Second',
628
+ lastName: 'Performer',
629
+ biography: 'Second performer bio.',
630
+ profileImage: 'second.jpg'
631
+ }
632
+ }
633
+ }
634
+ }
635
+ ];
636
+
637
+ it('positions first performer popup differently', async () => {
638
+ const { container } = render(AboutShow, { props: { performers } });
639
+
640
+ const firstCard = screen.getByText('First Performer').closest('.cursor-pointer');
641
+ await fireEvent.click(firstCard);
642
+
643
+ const popup = screen.getByText('First performer bio.').closest('.absolute');
644
+ expect(popup.className).toContain('left-[190%]');
645
+ });
646
+
647
+ it('positions non-first performer popup centered', async () => {
648
+ const { container } = render(AboutShow, { props: { performers } });
649
+
650
+ const secondCard = screen.getByText('Second Performer').closest('.cursor-pointer');
651
+ await fireEvent.click(secondCard);
652
+
653
+ const popup = screen.getByText('Second performer bio.').closest('.absolute');
654
+ expect(popup.className).toContain('left-1/2');
655
+ expect(popup.className).toContain('-translate-x-1/2');
656
+ });
657
+ });
658
+
659
+ describe('dark mode styling', () => {
660
+ it('has dark mode classes for title', () => {
661
+ const { container } = render(AboutShow);
662
+ const title = screen.getByText('About the Show');
663
+ expect(title.className).toContain('dark:text-white');
664
+ });
665
+
666
+ it('has dark mode classes for show image background', () => {
667
+ render(AboutShow, {
668
+ props: {
669
+ ShowImage: 'https://example.com/image.jpg',
670
+ description: 'Test description'
671
+ }
672
+ });
673
+ const img = screen.getByAltText('');
674
+ expect(img.className).toContain('dark:bg-gray-800');
675
+ });
676
+
677
+ it('has dark mode classes for description', () => {
678
+ const { container } = render(AboutShow, {
679
+ props: { description: 'Test description' }
680
+ });
681
+ const paragraph = screen.getByText('Test description');
682
+ expect(paragraph.className).toContain('dark:text-white');
683
+ });
684
+
685
+ it('has dark mode classes for read more button', () => {
686
+ const longDescription = 'a'.repeat(1600);
687
+ render(AboutShow, { props: { description: longDescription } });
688
+ const button = screen.getByText('Show more');
689
+ expect(button.className).toContain('dark:text-blue-500');
690
+ });
691
+
692
+ it('has dark mode classes for performer card', () => {
693
+ const performer = {
694
+ ID: 1,
695
+ acceptedState: 2,
696
+ shouldBeHidden: false,
697
+ RosterPerformer: {
698
+ User: {
699
+ performerProfile: {
700
+ firstName: 'Bob',
701
+ lastName: 'Builder',
702
+ profileImage: 'bob.jpg'
703
+ }
704
+ }
705
+ }
706
+ };
707
+ render(AboutShow, { props: { performers: [performer] } });
708
+ const card = screen.getByText('Bob Builder').closest('.cursor-pointer');
709
+ expect(card.className).toContain('dark:bg-gray-800');
710
+ expect(card.className).toContain('dark:border-gray-600');
711
+ expect(card.className).toContain('dark:hover:border-blue-500');
712
+ });
713
+ });
714
+
715
+ describe('accessibility', () => {
716
+ it('uses semantic heading for title', () => {
717
+ render(AboutShow);
718
+ expect(screen.getByRole('heading', { name: 'About the Show' })).toBeInTheDocument();
719
+ });
720
+
721
+ it('has proper alt text for performer images', () => {
722
+ const performer = {
723
+ ID: 1,
724
+ acceptedState: 2,
725
+ shouldBeHidden: false,
726
+ RosterPerformer: {
727
+ User: {
728
+ performerProfile: {
729
+ firstName: 'Bob',
730
+ lastName: 'Builder',
731
+ profileImage: 'bob.jpg'
732
+ }
733
+ }
734
+ }
735
+ };
736
+ render(AboutShow, { props: { performers: [performer] } });
737
+ expect(screen.getByAltText('Bob Builder')).toBeInTheDocument();
738
+ });
739
+
740
+ it('has aria-label for close button', async () => {
741
+ const performer = {
742
+ ID: 1,
743
+ acceptedState: 2,
744
+ shouldBeHidden: false,
745
+ RosterPerformer: {
746
+ User: {
747
+ performerProfile: {
748
+ firstName: 'Bob',
749
+ lastName: 'Builder',
750
+ biography: 'Bio',
751
+ profileImage: 'bob.jpg'
752
+ }
753
+ }
754
+ }
755
+ };
756
+ render(AboutShow, { props: { performers: [performer] } });
757
+
758
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
759
+ await fireEvent.click(performerCard);
760
+
761
+ expect(screen.getByLabelText('Close')).toBeInTheDocument();
762
+ });
763
+
764
+ it('has aria-label for social media links', async () => {
765
+ const performer = {
766
+ ID: 1,
767
+ acceptedState: 2,
768
+ shouldBeHidden: false,
769
+ RosterPerformer: {
770
+ User: {
771
+ performerProfile: {
772
+ firstName: 'Bob',
773
+ lastName: 'Builder',
774
+ biography: 'Bio',
775
+ instagram: 'https://instagram.com/bob',
776
+ twitter: 'https://twitter.com/bob',
777
+ profileImage: 'bob.jpg'
778
+ }
779
+ }
780
+ }
781
+ };
782
+ render(AboutShow, { props: { performers: [performer] } });
783
+
784
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
785
+ await fireEvent.click(performerCard);
786
+
787
+ expect(screen.getByLabelText('Instagram profile')).toBeInTheDocument();
788
+ expect(screen.getByLabelText('Twitter profile')).toBeInTheDocument();
789
+ });
790
+ });
791
+ });