@imposium-hub/components 2.14.7-1 → 2.14.7

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 (229) hide show
  1. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  2. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.test.d.ts +1 -0
  3. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.test.js +377 -0
  4. package/dist/cjs/components/advanced-number-field/AdvancedNumberField.test.js.map +1 -0
  5. package/dist/cjs/components/anchor-field/AnchorField.d.ts +1 -1
  6. package/dist/cjs/components/anchor-field/AnchorField.test.d.ts +1 -0
  7. package/dist/cjs/components/anchor-field/AnchorField.test.js +87 -0
  8. package/dist/cjs/components/anchor-field/AnchorField.test.js.map +1 -0
  9. package/dist/cjs/components/asset-details/AssetDetails.test.d.ts +1 -0
  10. package/dist/cjs/components/asset-details/AssetDetails.test.js +439 -0
  11. package/dist/cjs/components/asset-details/AssetDetails.test.js.map +1 -0
  12. package/dist/cjs/components/assets/AssetField.test.d.ts +1 -0
  13. package/dist/cjs/components/assets/AssetField.test.js +464 -0
  14. package/dist/cjs/components/assets/AssetField.test.js.map +1 -0
  15. package/dist/cjs/components/assets/AssetsTableAssetIdCell.test.d.ts +1 -0
  16. package/dist/cjs/components/assets/AssetsTableAssetIdCell.test.js +190 -0
  17. package/dist/cjs/components/assets/AssetsTableAssetIdCell.test.js.map +1 -0
  18. package/dist/cjs/components/assets/AssetsTableAssetIdFilter.test.d.ts +1 -0
  19. package/dist/cjs/components/assets/AssetsTableAssetIdFilter.test.js +82 -0
  20. package/dist/cjs/components/assets/AssetsTableAssetIdFilter.test.js.map +1 -0
  21. package/dist/cjs/components/assets/AssetsTableComplexTagCell.test.d.ts +1 -0
  22. package/dist/cjs/components/assets/AssetsTableComplexTagCell.test.js +125 -0
  23. package/dist/cjs/components/assets/AssetsTableComplexTagCell.test.js.map +1 -0
  24. package/dist/cjs/components/assets/AssetsTableDateCell.d.ts +1 -6
  25. package/dist/cjs/components/assets/AssetsTableDateCell.test.d.ts +1 -0
  26. package/dist/cjs/components/assets/AssetsTableDateCell.test.js +116 -0
  27. package/dist/cjs/components/assets/AssetsTableDateCell.test.js.map +1 -0
  28. package/dist/cjs/components/assets/AssetsTableGlobalCell.d.ts +1 -5
  29. package/dist/cjs/components/assets/AssetsTablePreviewCell.d.ts +1 -17
  30. package/dist/cjs/components/assets/AssetsTableStatusCell.d.ts +1 -5
  31. package/dist/cjs/components/assets/AssetsTableTagsCell.d.ts +1 -6
  32. package/dist/cjs/components/assets/AssetsTableTypeCell.d.ts +1 -5
  33. package/dist/cjs/components/assets/AssetsTypeIcon.d.ts +1 -5
  34. package/dist/cjs/components/assets/FontAssetPreview.d.ts +1 -1
  35. package/dist/cjs/components/assets/StoryTableTotalRendersCell.d.ts +1 -2
  36. package/dist/cjs/components/button/Button.d.ts +1 -1
  37. package/dist/cjs/components/button/Button.stories.d.ts +5 -6
  38. package/dist/cjs/components/button-group-field/ButtonGroupField.d.ts +1 -1
  39. package/dist/cjs/components/button-group-field/ButtonGroupField.stories.d.ts +1 -2
  40. package/dist/cjs/components/button-menu/ButtonMenu.d.ts +2 -2
  41. package/dist/cjs/components/button-menu/ButtonMenu.stories.d.ts +1 -2
  42. package/dist/cjs/components/button-menu/ButtonMenuItem.d.ts +1 -1
  43. package/dist/cjs/components/card/Card.d.ts +4 -4
  44. package/dist/cjs/components/card/Card.stories.d.ts +1 -2
  45. package/dist/cjs/components/checkbox-field/CheckboxField.d.ts +1 -1
  46. package/dist/cjs/components/checkbox-field/CheckboxField.stories.d.ts +1 -2
  47. package/dist/cjs/components/color-field/ColorField.d.ts +1 -1
  48. package/dist/cjs/components/color-field/ColorFiled.stories.d.ts +1 -2
  49. package/dist/cjs/components/compositions/TextLayer.d.ts +1 -1
  50. package/dist/cjs/components/config-variable-button/ConfigVariableButton.d.ts +1 -42
  51. package/dist/cjs/components/confirm-modal/ConfirmModal.d.ts +1 -2
  52. package/dist/cjs/components/controlled-list/ControlledList.d.ts +2 -2
  53. package/dist/cjs/components/controlled-list/ControlledList.stories.d.ts +1 -2
  54. package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
  55. package/dist/cjs/components/determinate-loader/DeterminateLoader.stories.d.ts +3 -4
  56. package/dist/cjs/components/dropdown/Dropdown.d.ts +1 -1
  57. package/dist/cjs/components/dropdown/Dropdown.stories.d.ts +1 -1
  58. package/dist/cjs/components/field-wrapper/FieldWrapper.d.ts +2 -2
  59. package/dist/cjs/components/field-wrapper/FieldWrapper.stories.d.ts +1 -2
  60. package/dist/cjs/components/font-field/FontField.d.ts +1 -2
  61. package/dist/cjs/components/font-picker/FontPicker.d.ts +1 -1
  62. package/dist/cjs/components/h-rule/HRule.d.ts +1 -2
  63. package/dist/cjs/components/h-rule/HRule.stories.d.ts +2 -3
  64. package/dist/cjs/components/header/ProjectDropdown.d.ts +1 -2
  65. package/dist/cjs/components/list-field/ListField.d.ts +1 -1
  66. package/dist/cjs/components/list-field/ListField.stories.d.ts +1 -2
  67. package/dist/cjs/components/log-viewer/LogViewer.d.ts +1 -1
  68. package/dist/cjs/components/media-variable-field/MediaVariableField.d.ts +1 -1
  69. package/dist/cjs/components/modal/Modal.d.ts +1 -1
  70. package/dist/cjs/components/modal/Modal.stories.d.ts +1 -2
  71. package/dist/cjs/components/number-field/NumberField.d.ts +3 -3
  72. package/dist/cjs/components/number-field/NumberField.js +4 -7
  73. package/dist/cjs/components/number-field/NumberField.js.map +1 -1
  74. package/dist/cjs/components/number-field/NumberField.stories.d.ts +1 -2
  75. package/dist/cjs/components/number-field/NumberField.test.d.ts +1 -0
  76. package/dist/cjs/components/number-field/NumberField.test.js +241 -0
  77. package/dist/cjs/components/number-field/NumberField.test.js.map +1 -0
  78. package/dist/cjs/components/players/AudioPlayer.d.ts +1 -1
  79. package/dist/cjs/components/players/AudioPreview.d.ts +1 -1
  80. package/dist/cjs/components/players/ImagePlayer.d.ts +1 -1
  81. package/dist/cjs/components/players/ImagePreview.d.ts +1 -1
  82. package/dist/cjs/components/players/ImageSequencePlayer.d.ts +1 -1
  83. package/dist/cjs/components/players/TemplatePlayer.d.ts +1 -1
  84. package/dist/cjs/components/players/VideoPlayer.d.ts +1 -1
  85. package/dist/cjs/components/players/VideoPreview.d.ts +1 -1
  86. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +3 -3
  87. package/dist/cjs/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
  88. package/dist/cjs/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
  89. package/dist/cjs/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
  90. package/dist/cjs/components/section/Section.d.ts +1 -2
  91. package/dist/cjs/components/section/Section.stories.d.ts +2 -3
  92. package/dist/cjs/components/select-field/SelectField.d.ts +1 -1
  93. package/dist/cjs/components/select-field/SelectField.stories.d.ts +1 -2
  94. package/dist/cjs/components/shortcut-menu/ShortcutMenu.stories.d.ts +1 -2
  95. package/dist/cjs/components/slider-field/SliderField.d.ts +1 -1
  96. package/dist/cjs/components/slider-field/SliderField.stories.d.ts +1 -2
  97. package/dist/cjs/components/smpte-field/SMPTEField.d.ts +1 -1
  98. package/dist/cjs/components/tabs/Tabs.stories.d.ts +2 -3
  99. package/dist/cjs/components/tag/Tag.d.ts +1 -9
  100. package/dist/cjs/components/text-area-autocomplete/TextAreaAutocomplete.d.ts +1 -2
  101. package/dist/cjs/components/text-area-field/TextAreaField.d.ts +1 -1
  102. package/dist/cjs/components/text-area-field/TextAreaField.stories.d.ts +1 -2
  103. package/dist/cjs/components/text-field/TextField.d.ts +1 -1
  104. package/dist/cjs/components/text-field/TextField.stories.d.ts +1 -2
  105. package/dist/cjs/components/text-field/TextField.test.d.ts +1 -0
  106. package/dist/cjs/components/text-field/TextField.test.js +540 -0
  107. package/dist/cjs/components/text-field/TextField.test.js.map +1 -0
  108. package/dist/cjs/constants/icons.d.ts +79 -80
  109. package/dist/cjs/test/setup.d.ts +1 -0
  110. package/dist/cjs/test/setup.js +97 -0
  111. package/dist/cjs/test/setup.js.map +1 -0
  112. package/dist/cjs/test/utils.d.ts +26 -0
  113. package/dist/cjs/test/utils.js +44 -0
  114. package/dist/cjs/test/utils.js.map +1 -0
  115. package/dist/esm/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
  116. package/dist/esm/components/advanced-number-field/AdvancedNumberField.test.d.ts +1 -0
  117. package/dist/esm/components/advanced-number-field/AdvancedNumberField.test.js +361 -0
  118. package/dist/esm/components/advanced-number-field/AdvancedNumberField.test.js.map +1 -0
  119. package/dist/esm/components/anchor-field/AnchorField.d.ts +1 -1
  120. package/dist/esm/components/anchor-field/AnchorField.test.d.ts +1 -0
  121. package/dist/esm/components/anchor-field/AnchorField.test.js +81 -0
  122. package/dist/esm/components/anchor-field/AnchorField.test.js.map +1 -0
  123. package/dist/esm/components/asset-details/AssetDetails.test.d.ts +1 -0
  124. package/dist/esm/components/asset-details/AssetDetails.test.js +367 -0
  125. package/dist/esm/components/asset-details/AssetDetails.test.js.map +1 -0
  126. package/dist/esm/components/assets/AssetField.test.d.ts +1 -0
  127. package/dist/esm/components/assets/AssetField.test.js +311 -0
  128. package/dist/esm/components/assets/AssetField.test.js.map +1 -0
  129. package/dist/esm/components/assets/AssetsTableAssetIdCell.test.d.ts +1 -0
  130. package/dist/esm/components/assets/AssetsTableAssetIdCell.test.js +105 -0
  131. package/dist/esm/components/assets/AssetsTableAssetIdCell.test.js.map +1 -0
  132. package/dist/esm/components/assets/AssetsTableAssetIdFilter.test.d.ts +1 -0
  133. package/dist/esm/components/assets/AssetsTableAssetIdFilter.test.js +63 -0
  134. package/dist/esm/components/assets/AssetsTableAssetIdFilter.test.js.map +1 -0
  135. package/dist/esm/components/assets/AssetsTableComplexTagCell.test.d.ts +1 -0
  136. package/dist/esm/components/assets/AssetsTableComplexTagCell.test.js +100 -0
  137. package/dist/esm/components/assets/AssetsTableComplexTagCell.test.js.map +1 -0
  138. package/dist/esm/components/assets/AssetsTableDateCell.d.ts +1 -6
  139. package/dist/esm/components/assets/AssetsTableDateCell.test.d.ts +1 -0
  140. package/dist/esm/components/assets/AssetsTableDateCell.test.js +60 -0
  141. package/dist/esm/components/assets/AssetsTableDateCell.test.js.map +1 -0
  142. package/dist/esm/components/assets/AssetsTableGlobalCell.d.ts +1 -5
  143. package/dist/esm/components/assets/AssetsTablePreviewCell.d.ts +1 -17
  144. package/dist/esm/components/assets/AssetsTableStatusCell.d.ts +1 -5
  145. package/dist/esm/components/assets/AssetsTableTagsCell.d.ts +1 -6
  146. package/dist/esm/components/assets/AssetsTableTypeCell.d.ts +1 -5
  147. package/dist/esm/components/assets/AssetsTypeIcon.d.ts +1 -5
  148. package/dist/esm/components/assets/FontAssetPreview.d.ts +1 -1
  149. package/dist/esm/components/assets/StoryTableTotalRendersCell.d.ts +1 -2
  150. package/dist/esm/components/button/Button.d.ts +1 -1
  151. package/dist/esm/components/button/Button.stories.d.ts +5 -6
  152. package/dist/esm/components/button-group-field/ButtonGroupField.d.ts +1 -1
  153. package/dist/esm/components/button-group-field/ButtonGroupField.stories.d.ts +1 -2
  154. package/dist/esm/components/button-menu/ButtonMenu.d.ts +2 -2
  155. package/dist/esm/components/button-menu/ButtonMenu.stories.d.ts +1 -2
  156. package/dist/esm/components/button-menu/ButtonMenuItem.d.ts +1 -1
  157. package/dist/esm/components/card/Card.d.ts +4 -4
  158. package/dist/esm/components/card/Card.stories.d.ts +1 -2
  159. package/dist/esm/components/checkbox-field/CheckboxField.d.ts +1 -1
  160. package/dist/esm/components/checkbox-field/CheckboxField.stories.d.ts +1 -2
  161. package/dist/esm/components/color-field/ColorField.d.ts +1 -1
  162. package/dist/esm/components/color-field/ColorFiled.stories.d.ts +1 -2
  163. package/dist/esm/components/compositions/TextLayer.d.ts +1 -1
  164. package/dist/esm/components/config-variable-button/ConfigVariableButton.d.ts +1 -42
  165. package/dist/esm/components/confirm-modal/ConfirmModal.d.ts +1 -2
  166. package/dist/esm/components/controlled-list/ControlledList.d.ts +2 -2
  167. package/dist/esm/components/controlled-list/ControlledList.stories.d.ts +1 -2
  168. package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
  169. package/dist/esm/components/determinate-loader/DeterminateLoader.stories.d.ts +3 -4
  170. package/dist/esm/components/dropdown/Dropdown.d.ts +1 -1
  171. package/dist/esm/components/dropdown/Dropdown.stories.d.ts +1 -1
  172. package/dist/esm/components/field-wrapper/FieldWrapper.d.ts +2 -2
  173. package/dist/esm/components/field-wrapper/FieldWrapper.stories.d.ts +1 -2
  174. package/dist/esm/components/font-field/FontField.d.ts +1 -2
  175. package/dist/esm/components/font-picker/FontPicker.d.ts +1 -1
  176. package/dist/esm/components/h-rule/HRule.d.ts +1 -2
  177. package/dist/esm/components/h-rule/HRule.stories.d.ts +2 -3
  178. package/dist/esm/components/header/ProjectDropdown.d.ts +1 -2
  179. package/dist/esm/components/list-field/ListField.d.ts +1 -1
  180. package/dist/esm/components/list-field/ListField.stories.d.ts +1 -2
  181. package/dist/esm/components/log-viewer/LogViewer.d.ts +1 -1
  182. package/dist/esm/components/media-variable-field/MediaVariableField.d.ts +1 -1
  183. package/dist/esm/components/modal/Modal.d.ts +1 -1
  184. package/dist/esm/components/modal/Modal.stories.d.ts +1 -2
  185. package/dist/esm/components/number-field/NumberField.d.ts +3 -3
  186. package/dist/esm/components/number-field/NumberField.js +4 -5
  187. package/dist/esm/components/number-field/NumberField.js.map +1 -1
  188. package/dist/esm/components/number-field/NumberField.stories.d.ts +1 -2
  189. package/dist/esm/components/number-field/NumberField.test.d.ts +1 -0
  190. package/dist/esm/components/number-field/NumberField.test.js +192 -0
  191. package/dist/esm/components/number-field/NumberField.test.js.map +1 -0
  192. package/dist/esm/components/players/AudioPlayer.d.ts +1 -1
  193. package/dist/esm/components/players/AudioPreview.d.ts +1 -1
  194. package/dist/esm/components/players/ImagePlayer.d.ts +1 -1
  195. package/dist/esm/components/players/ImagePreview.d.ts +1 -1
  196. package/dist/esm/components/players/ImageSequencePlayer.d.ts +1 -1
  197. package/dist/esm/components/players/TemplatePlayer.d.ts +1 -1
  198. package/dist/esm/components/players/VideoPlayer.d.ts +1 -1
  199. package/dist/esm/components/players/VideoPreview.d.ts +1 -1
  200. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +3 -3
  201. package/dist/esm/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
  202. package/dist/esm/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
  203. package/dist/esm/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
  204. package/dist/esm/components/section/Section.d.ts +1 -2
  205. package/dist/esm/components/section/Section.stories.d.ts +2 -3
  206. package/dist/esm/components/select-field/SelectField.d.ts +1 -1
  207. package/dist/esm/components/select-field/SelectField.stories.d.ts +1 -2
  208. package/dist/esm/components/shortcut-menu/ShortcutMenu.stories.d.ts +1 -2
  209. package/dist/esm/components/slider-field/SliderField.d.ts +1 -1
  210. package/dist/esm/components/slider-field/SliderField.stories.d.ts +1 -2
  211. package/dist/esm/components/smpte-field/SMPTEField.d.ts +1 -1
  212. package/dist/esm/components/tabs/Tabs.stories.d.ts +2 -3
  213. package/dist/esm/components/tag/Tag.d.ts +1 -9
  214. package/dist/esm/components/text-area-autocomplete/TextAreaAutocomplete.d.ts +1 -2
  215. package/dist/esm/components/text-area-field/TextAreaField.d.ts +1 -1
  216. package/dist/esm/components/text-area-field/TextAreaField.stories.d.ts +1 -2
  217. package/dist/esm/components/text-field/TextField.d.ts +1 -1
  218. package/dist/esm/components/text-field/TextField.stories.d.ts +1 -2
  219. package/dist/esm/components/text-field/TextField.test.d.ts +1 -0
  220. package/dist/esm/components/text-field/TextField.test.js +469 -0
  221. package/dist/esm/components/text-field/TextField.test.js.map +1 -0
  222. package/dist/esm/constants/icons.d.ts +79 -80
  223. package/dist/esm/test/setup.d.ts +1 -0
  224. package/dist/esm/test/setup.js +70 -0
  225. package/dist/esm/test/setup.js.map +1 -0
  226. package/dist/esm/test/utils.d.ts +26 -0
  227. package/dist/esm/test/utils.js +27 -0
  228. package/dist/esm/test/utils.js.map +1 -0
  229. package/package.json +1 -1
@@ -0,0 +1,311 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import React from 'react';
3
+ import { render, act } from '@testing-library/react';
4
+ import { Provider } from 'react-redux';
5
+ import { legacy_createStore as createStore } from 'redux';
6
+ import { ASSET_TYPES } from '../../constants/assets';
7
+ vi.mock('../../Util', async (importOriginal) => {
8
+ const actual = (await importOriginal());
9
+ return {
10
+ ...actual,
11
+ mimetypeConformsToOverlay: vi.fn(() => true)
12
+ };
13
+ });
14
+ vi.mock('../text-field/TextField', () => ({
15
+ default: ({ value, label, readOnly, placeholder, loading, buttons, ...props }) => (React.createElement("div", { "data-testid": `textfield-${label || 'unlabeled'}` },
16
+ React.createElement("label", null, label),
17
+ React.createElement("input", { value: value || '', readOnly: readOnly, placeholder: placeholder || '' }),
18
+ loading && React.createElement("span", { "data-testid": 'loading-indicator' }, "Loading..."),
19
+ buttons && React.createElement("div", { "data-testid": 'buttons-container' }, buttons)))
20
+ }));
21
+ vi.mock('../button/Button', () => ({
22
+ default: ({ children, onClick, tooltip, ...props }) => (React.createElement("button", { "data-testid": `btn-${tooltip || 'unknown'}`, onClick: onClick }, children))
23
+ }));
24
+ vi.mock('./AssetsTableDropzone', () => ({
25
+ default: ({ children, onDrop, disable }) => (React.createElement("div", { "data-testid": 'dropzone', "data-disabled": disable }, children))
26
+ }));
27
+ vi.mock('./DroppableAssetRenderer', () => ({
28
+ default: ({ children, onDrop }) => React.createElement("div", { "data-testid": 'droppable-renderer' }, children)
29
+ }));
30
+ vi.mock('../../constants/icons', () => ({
31
+ ICON_FILTER: '<svg data-testid="icon-filter" />',
32
+ ICON_TIMES: '<svg data-testid="icon-times" />'
33
+ }));
34
+ vi.mock('../../redux/actions/asset-filters', () => ({
35
+ updateFilters: vi.fn((filters) => ({ type: 'UPDATE_FILTERS', payload: filters }))
36
+ }));
37
+ vi.mock('../../redux/actions/asset-uploads', () => ({
38
+ uploadAssets: vi.fn(() => ({ type: 'UPLOAD_ASSETS' }))
39
+ }));
40
+ const createMockStore = (overrides = {}) => {
41
+ const defaultState = {
42
+ assetList: {
43
+ loading: false,
44
+ page: 1,
45
+ total_pages: 1,
46
+ asset_count: 0,
47
+ assets: []
48
+ },
49
+ ...overrides
50
+ };
51
+ return createStore((state = defaultState) => state);
52
+ };
53
+ const createMockApi = (assetResponse = { name: 'test-asset.png' }, shouldReject = false) => ({
54
+ getAssetItem: vi.fn(() => shouldReject ? Promise.reject(new Error('Not found')) : Promise.resolve(assetResponse))
55
+ });
56
+ describe('AssetField', () => {
57
+ let AssetFieldConnected;
58
+ beforeEach(async () => {
59
+ vi.clearAllMocks();
60
+ vi.useFakeTimers();
61
+ const module = await import('./AssetField');
62
+ AssetFieldConnected = module.default;
63
+ });
64
+ afterEach(() => {
65
+ vi.useRealTimers();
66
+ });
67
+ const defaultProps = {
68
+ api: createMockApi(),
69
+ storyId: 'story-123',
70
+ assetId: 'asset-456',
71
+ label: 'Background',
72
+ width: 300,
73
+ tooltip: 'Select an asset',
74
+ onChange: vi.fn(),
75
+ accepts: ASSET_TYPES.IMAGE
76
+ };
77
+ const renderWithStore = (props = {}, storeOverrides = {}) => {
78
+ const store = createMockStore(storeOverrides);
79
+ return render(React.createElement(Provider, { store: store },
80
+ React.createElement(AssetFieldConnected, { ...defaultProps, ...props })));
81
+ };
82
+ it('renders with all wrapper components', () => {
83
+ const { container } = renderWithStore();
84
+ expect(container.querySelector('[data-testid="dropzone"]')).toBeTruthy();
85
+ expect(container.querySelector('[data-testid="droppable-renderer"]')).toBeTruthy();
86
+ expect(container.querySelector('[data-testid="textfield-Background"]')).toBeTruthy();
87
+ });
88
+ it('applies width style and error class', () => {
89
+ const { container } = renderWithStore({ width: 500 });
90
+ const assetFieldDiv = container.querySelector('.asset-field');
91
+ expect(assetFieldDiv.style.width).toBe('500px');
92
+ expect(assetFieldDiv.classList.contains('error')).toBe(false);
93
+ });
94
+ it('defaults to 100% width when no width prop is provided', () => {
95
+ const { container } = renderWithStore({ width: undefined });
96
+ const assetFieldDiv = container.querySelector('.asset-field');
97
+ expect(assetFieldDiv.style.width).toBe('100%');
98
+ });
99
+ it('shows drag prompt placeholder when no assetId', () => {
100
+ const { container } = renderWithStore({ assetId: null });
101
+ const input = container.querySelector('input');
102
+ expect(input.placeholder).toBe('Drag Asset Here');
103
+ });
104
+ it('calls api.getAssetItem on mount when assetId is present', () => {
105
+ const mockApi = createMockApi();
106
+ renderWithStore({ api: mockApi });
107
+ expect(mockApi.getAssetItem).toHaveBeenCalledWith('asset-456');
108
+ });
109
+ it('does not call api.getAssetItem on mount when assetId is absent', () => {
110
+ const mockApi = createMockApi();
111
+ renderWithStore({ api: mockApi, assetId: null });
112
+ expect(mockApi.getAssetItem).not.toHaveBeenCalled();
113
+ });
114
+ it('displays asset name after successful API load', async () => {
115
+ const mockApi = createMockApi({ name: 'my-video.mp4' });
116
+ const { container } = renderWithStore({ api: mockApi });
117
+ await vi.waitFor(() => {
118
+ const input = container.querySelector('input');
119
+ expect(input.value).toBe('my-video.mp4');
120
+ });
121
+ });
122
+ it('displays error message after failed API load', async () => {
123
+ const mockApi = createMockApi(null, true);
124
+ const { container } = renderWithStore({ api: mockApi });
125
+ await vi.waitFor(() => {
126
+ const input = container.querySelector('input');
127
+ expect(input.value).toContain('Could not find asset');
128
+ });
129
+ });
130
+ it('shows filter buttons when accepts is a string and assetName is set', async () => {
131
+ const mockApi = createMockApi({ name: 'loaded-asset.png' });
132
+ const { container } = renderWithStore({ api: mockApi, accepts: 'image' });
133
+ await vi.waitFor(() => {
134
+ const buttonsContainer = container.querySelector('[data-testid="buttons-container"]');
135
+ expect(buttonsContainer).toBeTruthy();
136
+ const filterTypeBtn = container.querySelector('[data-testid="btn-Filter assets to match Asset type"]');
137
+ expect(filterTypeBtn).toBeTruthy();
138
+ const filterNameBtn = container.querySelector('[data-testid="btn-Filter assets to the selected Asset"]');
139
+ expect(filterNameBtn).toBeTruthy();
140
+ });
141
+ });
142
+ it('shows clear button when assetId is present', () => {
143
+ const { container } = renderWithStore();
144
+ const clearBtn = container.querySelector('[data-testid="btn-Clear the selected Asset"]');
145
+ expect(clearBtn).toBeTruthy();
146
+ });
147
+ it('does not show filter buttons when accepts is an array', async () => {
148
+ const mockApi = createMockApi({ name: 'loaded.png' });
149
+ const { container } = renderWithStore({ api: mockApi, accepts: ['image', 'video'] });
150
+ await vi.waitFor(() => {
151
+ const filterTypeBtn = container.querySelector('[data-testid="btn-Filter assets to match Asset type"]');
152
+ expect(filterTypeBtn).toBeFalsy();
153
+ });
154
+ });
155
+ it('reloads asset when assetList changes via dispatch', () => {
156
+ const mockApi = createMockApi({ name: 'initial.png' });
157
+ const reducer = (state = {
158
+ assetList: { loading: false, page: 1, total_pages: 1, asset_count: 0, assets: [] }
159
+ }, action) => {
160
+ if (action.type === 'UPDATE_ASSET_LIST') {
161
+ return { ...state, assetList: action.payload };
162
+ }
163
+ return state;
164
+ };
165
+ const store = createStore(reducer);
166
+ render(React.createElement(Provider, { store: store },
167
+ React.createElement(AssetFieldConnected, { ...defaultProps, api: mockApi })));
168
+ mockApi.getAssetItem.mockClear();
169
+ act(() => {
170
+ store.dispatch({
171
+ type: 'UPDATE_ASSET_LIST',
172
+ payload: {
173
+ loading: false,
174
+ page: 2,
175
+ total_pages: 2,
176
+ asset_count: 10,
177
+ assets: [{ id: '1' }]
178
+ }
179
+ });
180
+ });
181
+ act(() => {
182
+ vi.advanceTimersByTime(350);
183
+ });
184
+ expect(mockApi.getAssetItem).toHaveBeenCalled();
185
+ });
186
+ it('clears timeout on unmount', () => {
187
+ const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout');
188
+ const { unmount } = renderWithStore();
189
+ unmount();
190
+ expect(clearTimeoutSpy).toHaveBeenCalled();
191
+ clearTimeoutSpy.mockRestore();
192
+ });
193
+ it('exercises setFilter with string accepts', () => {
194
+ const { container } = renderWithStore({ accepts: 'image' });
195
+ const filterBtn = container.querySelector('[data-testid="btn-Filter assets to match Asset type"]');
196
+ expect(filterBtn).toBeTruthy();
197
+ filterBtn?.click();
198
+ });
199
+ it('exercises setFilter with no accepts', () => {
200
+ const { container } = renderWithStore({ accepts: undefined });
201
+ const filterBtn = container.querySelector('[data-testid="btn-Filter assets to match Asset type"]');
202
+ expect(filterBtn).toBeFalsy();
203
+ });
204
+ it('exercises clearAsset button', async () => {
205
+ const onChangeMock = vi.fn();
206
+ const { container } = renderWithStore({ onChange: onChangeMock });
207
+ const clearBtn = container.querySelector('[data-testid="btn-Clear the selected Asset"]');
208
+ expect(clearBtn).toBeTruthy();
209
+ clearBtn?.click();
210
+ await vi.waitFor(() => {
211
+ expect(onChangeMock).toHaveBeenCalledWith(null);
212
+ });
213
+ });
214
+ it('exercises setFilterToAsset button', async () => {
215
+ const mockApi = createMockApi({ name: 'my-asset.png' });
216
+ const { container } = renderWithStore({ api: mockApi, accepts: 'image' });
217
+ await vi.waitFor(() => {
218
+ const filterNameBtn = container.querySelector('[data-testid="btn-Filter assets to the selected Asset"]');
219
+ expect(filterNameBtn).toBeTruthy();
220
+ filterNameBtn?.click();
221
+ });
222
+ });
223
+ it('exercises onAssetDrop with matching type', () => {
224
+ const onChangeMock = vi.fn();
225
+ const WrappedComponent = AssetFieldConnected.WrappedComponent;
226
+ const instance = new WrappedComponent({
227
+ ...defaultProps,
228
+ onChange: onChangeMock,
229
+ accepts: 'image',
230
+ updateFilters: vi.fn(),
231
+ uploadAssets: vi.fn(),
232
+ assetList: { loading: false, page: 1, total_pages: 1, asset_count: 0, assets: [] }
233
+ });
234
+ instance.setState = vi.fn((stateOrFn, callback) => {
235
+ if (typeof stateOrFn === 'object') {
236
+ instance.state = { ...instance.state, ...stateOrFn };
237
+ }
238
+ if (callback)
239
+ callback();
240
+ });
241
+ instance.onAssetDrop({ rowData: { name: 'dropped.png', type: 'image', id: 'asset-789' } }, null);
242
+ expect(instance.setState).toHaveBeenCalled();
243
+ expect(onChangeMock).toHaveBeenCalledWith({
244
+ name: 'dropped.png',
245
+ type: 'image',
246
+ id: 'asset-789'
247
+ });
248
+ });
249
+ it('exercises onAssetDrop with mismatched type and onError', () => {
250
+ const onErrorMock = vi.fn();
251
+ const WrappedComponent = AssetFieldConnected.WrappedComponent;
252
+ const instance = new WrappedComponent({
253
+ ...defaultProps,
254
+ onError: onErrorMock,
255
+ accepts: 'image',
256
+ updateFilters: vi.fn(),
257
+ uploadAssets: vi.fn(),
258
+ assetList: { loading: false, page: 1, total_pages: 1, asset_count: 0, assets: [] }
259
+ });
260
+ instance.setState = vi.fn();
261
+ instance.onAssetDrop({ rowData: { name: 'dropped.mp4', type: 'video', id: 'asset-999' } }, null);
262
+ expect(onErrorMock).toHaveBeenCalled();
263
+ });
264
+ it('exercises onAssetDrop with array accepts and mismatched type', () => {
265
+ const onErrorMock = vi.fn();
266
+ const WrappedComponent = AssetFieldConnected.WrappedComponent;
267
+ const instance = new WrappedComponent({
268
+ ...defaultProps,
269
+ onError: onErrorMock,
270
+ accepts: ['image', 'audio'],
271
+ updateFilters: vi.fn(),
272
+ uploadAssets: vi.fn(),
273
+ assetList: { loading: false, page: 1, total_pages: 1, asset_count: 0, assets: [] }
274
+ });
275
+ instance.setState = vi.fn();
276
+ instance.onAssetDrop({ rowData: { name: 'dropped.mp4', type: 'video', id: 'asset-999' } }, null);
277
+ expect(onErrorMock).toHaveBeenCalledWith(expect.stringContaining('image or audio'));
278
+ });
279
+ it('exercises onFileDrop with monitor', () => {
280
+ const WrappedComponent = AssetFieldConnected.WrappedComponent;
281
+ const uploadAssetsMock = vi.fn();
282
+ const instance = new WrappedComponent({
283
+ ...defaultProps,
284
+ accepts: 'image',
285
+ updateFilters: vi.fn(),
286
+ uploadAssets: uploadAssetsMock,
287
+ assetList: { loading: false, page: 1, total_pages: 1, asset_count: 0, assets: [] }
288
+ });
289
+ instance.setState = vi.fn();
290
+ const mockMonitor = {
291
+ getItem: () => ({
292
+ files: [new File(['content'], 'test.png', { type: 'image/png' })]
293
+ })
294
+ };
295
+ instance.onFileDrop(null, mockMonitor);
296
+ expect(uploadAssetsMock).toHaveBeenCalled();
297
+ });
298
+ it('exercises onFileDrop without monitor', () => {
299
+ const WrappedComponent = AssetFieldConnected.WrappedComponent;
300
+ const instance = new WrappedComponent({
301
+ ...defaultProps,
302
+ updateFilters: vi.fn(),
303
+ uploadAssets: vi.fn(),
304
+ assetList: { loading: false, page: 1, total_pages: 1, asset_count: 0, assets: [] }
305
+ });
306
+ instance.setState = vi.fn();
307
+ instance.onFileDrop(null, null);
308
+ expect(instance.setState).not.toHaveBeenCalled();
309
+ });
310
+ });
311
+ //# sourceMappingURL=AssetField.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetField.test.js","sourceRoot":"","sources":["../../../../src/components/assets/AssetField.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import React from 'react';
3
+ import { render, fireEvent } from '@testing-library/react';
4
+ import { Provider } from 'react-redux';
5
+ import { legacy_createStore as createStore } from 'redux';
6
+ import { copying } from '../../constants/copy';
7
+ vi.mock('../../redux/actions/asset-filters', () => ({
8
+ updateFilters: vi.fn(() => ({ type: 'MOCK_UPDATE_FILTERS' })),
9
+ default: { UPDATE: 'assetFilters/UPDATE', RESET: 'footageFilters/RESET' }
10
+ }));
11
+ import AssetsTableAssetIdCellMemoized from './AssetsTableAssetIdCell';
12
+ const MOCK_ASSET_ID = 'asset-abc-123';
13
+ const createMockStore = (overrides = {}) => {
14
+ const defaultState = {
15
+ assetFilters: {},
16
+ ...overrides
17
+ };
18
+ return createStore((state = defaultState) => state);
19
+ };
20
+ const buildCellProp = (assetId) => ({
21
+ row: {
22
+ original: { id: assetId }
23
+ }
24
+ });
25
+ const renderComponent = (propOverrides = {}) => {
26
+ const defaultProps = {
27
+ cell: buildCellProp(MOCK_ASSET_ID),
28
+ onNotification: vi.fn(),
29
+ onError: vi.fn(),
30
+ ...propOverrides
31
+ };
32
+ const store = createMockStore();
33
+ const result = render(React.createElement(Provider, { store: store },
34
+ React.createElement(AssetsTableAssetIdCellMemoized, { ...defaultProps })));
35
+ return { ...result, props: defaultProps };
36
+ };
37
+ describe('AssetsTableAssetIdCell', () => {
38
+ let clipboardWriteTextMock;
39
+ beforeEach(() => {
40
+ clipboardWriteTextMock = vi.fn();
41
+ Object.assign(navigator, {
42
+ clipboard: {
43
+ writeText: clipboardWriteTextMock
44
+ }
45
+ });
46
+ });
47
+ it('renders the asset id in a div with the correct class', () => {
48
+ const { container } = renderComponent();
49
+ const idCell = container.querySelector('.imposium-asset-id');
50
+ expect(idCell).toBeTruthy();
51
+ expect(idCell.textContent).toBe(MOCK_ASSET_ID);
52
+ });
53
+ it('calls onNotification after successful clipboard copy', async () => {
54
+ clipboardWriteTextMock.mockResolvedValueOnce(undefined);
55
+ const { container, props } = renderComponent();
56
+ const idCell = container.querySelector('.imposium-asset-id');
57
+ fireEvent.click(idCell);
58
+ await vi.waitFor(() => {
59
+ expect(clipboardWriteTextMock).toHaveBeenCalledWith(MOCK_ASSET_ID);
60
+ expect(props.onNotification).toHaveBeenCalledWith(copying.copied);
61
+ });
62
+ });
63
+ it('calls onError after failed clipboard copy', async () => {
64
+ clipboardWriteTextMock.mockRejectedValueOnce(new Error('clipboard denied'));
65
+ const { container, props } = renderComponent();
66
+ const idCell = container.querySelector('.imposium-asset-id');
67
+ fireEvent.click(idCell);
68
+ await vi.waitFor(() => {
69
+ expect(props.onError).toHaveBeenCalledWith(copying.error);
70
+ });
71
+ });
72
+ it('does not throw when onNotification is not provided', async () => {
73
+ clipboardWriteTextMock.mockResolvedValueOnce(undefined);
74
+ const { container } = renderComponent({
75
+ onNotification: undefined,
76
+ onError: undefined
77
+ });
78
+ const idCell = container.querySelector('.imposium-asset-id');
79
+ fireEvent.click(idCell);
80
+ await vi.waitFor(() => {
81
+ expect(clipboardWriteTextMock).toHaveBeenCalledWith(MOCK_ASSET_ID);
82
+ });
83
+ });
84
+ it('does not throw when onError is not provided', async () => {
85
+ clipboardWriteTextMock.mockRejectedValueOnce(new Error('denied'));
86
+ const { container } = renderComponent({
87
+ onNotification: undefined,
88
+ onError: undefined
89
+ });
90
+ const idCell = container.querySelector('.imposium-asset-id');
91
+ fireEvent.click(idCell);
92
+ await vi.waitFor(() => {
93
+ expect(clipboardWriteTextMock).toHaveBeenCalled();
94
+ });
95
+ });
96
+ it('renders with a different asset id', () => {
97
+ const differentId = 'other-asset-456';
98
+ const { container } = renderComponent({
99
+ cell: buildCellProp(differentId)
100
+ });
101
+ const idCell = container.querySelector('.imposium-asset-id');
102
+ expect(idCell.textContent).toBe(differentId);
103
+ });
104
+ });
105
+ //# sourceMappingURL=AssetsTableAssetIdCell.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsTableAssetIdCell.test.js","sourceRoot":"","sources":["../../../../src/components/assets/AssetsTableAssetIdCell.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import React from 'react';
3
+ import { render } from '@testing-library/react';
4
+ import { Provider } from 'react-redux';
5
+ import { legacy_createStore as createStore } from 'redux';
6
+ vi.mock('../text-field/TextField', () => ({
7
+ default: ({ className, submittable, submittableType, value, doSubmit, header }) => (React.createElement("div", { "data-testid": 'mock-text-field', "data-classname": className, "data-submittable": submittable, "data-submittable-type": submittableType, "data-value": value || '', "data-header": header },
8
+ React.createElement("button", { "data-testid": 'submit-trigger', onClick: () => doSubmit('new-filter-value') }, "Submit")))
9
+ }));
10
+ vi.mock('../../redux/actions/asset-filters', () => ({
11
+ updateFilters: vi.fn((filters) => ({ type: 'assetFilters/UPDATE', newFilters: filters })),
12
+ default: { UPDATE: 'assetFilters/UPDATE', RESET: 'footageFilters/RESET' }
13
+ }));
14
+ import AssetsTableAssetIdFilterMemoized from './AssetsTableAssetIdFilter';
15
+ const MOCK_ASSET_ID_FILTER = 'existing-filter-123';
16
+ const createMockStore = (assetIdFilter = '') => {
17
+ const initialState = { assetFilters: { id: assetIdFilter } };
18
+ return createStore((state = initialState, action) => {
19
+ if (action.type === 'assetFilters/UPDATE') {
20
+ return {
21
+ ...state,
22
+ assetFilters: { ...state.assetFilters, ...action.newFilters }
23
+ };
24
+ }
25
+ return state;
26
+ });
27
+ };
28
+ const renderComponent = (assetIdFilter = '') => {
29
+ const store = createMockStore(assetIdFilter);
30
+ const result = render(React.createElement(Provider, { store: store },
31
+ React.createElement(AssetsTableAssetIdFilterMemoized, null)));
32
+ return { ...result, store };
33
+ };
34
+ describe('AssetsTableAssetIdFilter', () => {
35
+ it('renders the TextField with correct props', () => {
36
+ const { getByTestId } = renderComponent(MOCK_ASSET_ID_FILTER);
37
+ const textField = getByTestId('mock-text-field');
38
+ expect(textField.getAttribute('data-classname')).toBe('asset-id');
39
+ expect(textField.getAttribute('data-submittable')).toBe('true');
40
+ expect(textField.getAttribute('data-submittable-type')).toBe('search');
41
+ expect(textField.getAttribute('data-value')).toBe(MOCK_ASSET_ID_FILTER);
42
+ expect(textField.getAttribute('data-header')).toBe('true');
43
+ });
44
+ it('dispatches updateFilters with the submitted value', () => {
45
+ const { getByTestId, store } = renderComponent();
46
+ const submitButton = getByTestId('submit-trigger');
47
+ submitButton.click();
48
+ const storeState = store.getState();
49
+ expect(storeState.assetFilters.id).toBe('new-filter-value');
50
+ });
51
+ it('renders with an empty filter value when no id is set', () => {
52
+ const { getByTestId } = renderComponent();
53
+ const textField = getByTestId('mock-text-field');
54
+ expect(textField.getAttribute('data-value')).toBe('');
55
+ });
56
+ it('passes the current filter value from the redux store', () => {
57
+ const filterValue = 'search-term-abc';
58
+ const { getByTestId } = renderComponent(filterValue);
59
+ const textField = getByTestId('mock-text-field');
60
+ expect(textField.getAttribute('data-value')).toBe(filterValue);
61
+ });
62
+ });
63
+ //# sourceMappingURL=AssetsTableAssetIdFilter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsTableAssetIdFilter.test.js","sourceRoot":"","sources":["../../../../src/components/assets/AssetsTableAssetIdFilter.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import React from 'react';
3
+ import { render } from '@testing-library/react';
4
+ import { Provider } from 'react-redux';
5
+ import { legacy_createStore as createStore } from 'redux';
6
+ let capturedDoSubmit;
7
+ let capturedRemoveHandlers = {};
8
+ vi.mock('../tag/Tag', () => ({
9
+ default: ({ copy, removeHandler }) => {
10
+ capturedRemoveHandlers[copy] = removeHandler;
11
+ return (React.createElement("div", { "data-testid": `tag-${copy}`, className: 'mock-tag' },
12
+ React.createElement("span", null, copy),
13
+ React.createElement("button", { "data-testid": `remove-${copy}`, onClick: removeHandler }, "x")));
14
+ }
15
+ }));
16
+ vi.mock('../text-field/TextField', () => ({
17
+ default: ({ submittable, submittableType, placeholder, value, doSubmit, suggestions }) => {
18
+ capturedDoSubmit = doSubmit;
19
+ return (React.createElement("div", { "data-testid": 'mock-text-field', "data-submittable": submittable, "data-submittable-type": submittableType, "data-placeholder": placeholder, "data-value": value, "data-suggestions": JSON.stringify(suggestions || []) },
20
+ React.createElement("button", { "data-testid": 'submit-trigger', onClick: () => doSubmit('new-tag') }, "Add")));
21
+ }
22
+ }));
23
+ vi.mock('../../redux/actions/asset-list', () => ({
24
+ addAssetTag: vi.fn((_api, _id, _tags) => ({ type: 'MOCK_ADD_TAG' })),
25
+ deleteAssetTag: vi.fn((_api, _id, _tag) => ({ type: 'MOCK_DELETE_TAG' })),
26
+ default: {}
27
+ }));
28
+ import AssetsTableComplexTagCellMemoized from './AssetsTableComplexTagCell';
29
+ import { addAssetTag, deleteAssetTag } from '../../redux/actions/asset-list';
30
+ const MOCK_ASSET_ID = 'asset-999';
31
+ const MOCK_API = { addAssetTag: vi.fn(), deleteAssetTag: vi.fn() };
32
+ const MOCK_SUGGESTIONS = ['alpha', 'beta', 'gamma'];
33
+ const createMockStore = (assetTags = MOCK_SUGGESTIONS) => {
34
+ const initialState = { assetTags };
35
+ return createStore((state = initialState) => state);
36
+ };
37
+ const buildCellProp = (tags = ['tag-a', 'tag-b']) => ({
38
+ row: {
39
+ original: { id: MOCK_ASSET_ID, tags }
40
+ }
41
+ });
42
+ const renderComponent = (tagOverrides, storeOverrides) => {
43
+ capturedRemoveHandlers = {};
44
+ const store = createMockStore(storeOverrides);
45
+ const cell = buildCellProp(tagOverrides);
46
+ const result = render(React.createElement(Provider, { store: store },
47
+ React.createElement(AssetsTableComplexTagCellMemoized, { cell: cell, api: MOCK_API })));
48
+ return { ...result, store };
49
+ };
50
+ describe('AssetsTableComplexTagCell', () => {
51
+ it('renders existing tags as Tag components', () => {
52
+ const tags = ['tag-a', 'tag-b', 'tag-c'];
53
+ const { getByTestId } = renderComponent(tags);
54
+ tags.forEach((tag) => {
55
+ expect(getByTestId(`tag-${tag}`)).toBeTruthy();
56
+ });
57
+ });
58
+ it('deduplicates tags before rendering', () => {
59
+ const { container } = renderComponent(['dup', 'dup', 'unique']);
60
+ const renderedTags = container.querySelectorAll('.mock-tag');
61
+ expect(renderedTags).toHaveLength(2);
62
+ });
63
+ it('renders the TextField with correct props', () => {
64
+ const { getByTestId } = renderComponent();
65
+ const textField = getByTestId('mock-text-field');
66
+ expect(textField.getAttribute('data-submittable')).toBe('true');
67
+ expect(textField.getAttribute('data-submittable-type')).toBe('add');
68
+ expect(textField.getAttribute('data-placeholder')).toBe('+');
69
+ expect(textField.getAttribute('data-value')).toBe('');
70
+ });
71
+ it('passes assetTags from store as suggestions', () => {
72
+ const suggestions = ['x', 'y', 'z'];
73
+ const { getByTestId } = renderComponent([], suggestions);
74
+ const textField = getByTestId('mock-text-field');
75
+ expect(JSON.parse(textField.getAttribute('data-suggestions'))).toEqual(suggestions);
76
+ });
77
+ it('dispatches addAssetTag when submitting a new tag', () => {
78
+ renderComponent(['existing']);
79
+ capturedDoSubmit('brand-new');
80
+ expect(addAssetTag).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'brand-new');
81
+ });
82
+ it('does not dispatch addAssetTag when submitting a duplicate tag', () => {
83
+ vi.mocked(addAssetTag).mockClear();
84
+ renderComponent(['already-here']);
85
+ capturedDoSubmit('already-here');
86
+ expect(addAssetTag).not.toHaveBeenCalled();
87
+ });
88
+ it('dispatches deleteAssetTag when removing a tag', () => {
89
+ renderComponent(['removable']);
90
+ capturedRemoveHandlers['removable']();
91
+ expect(deleteAssetTag).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'removable');
92
+ });
93
+ it('renders with no tags', () => {
94
+ const { container, getByTestId } = renderComponent([]);
95
+ const renderedTags = container.querySelectorAll('.mock-tag');
96
+ expect(renderedTags).toHaveLength(0);
97
+ expect(getByTestId('mock-text-field')).toBeTruthy();
98
+ });
99
+ });
100
+ //# sourceMappingURL=AssetsTableComplexTagCell.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetsTableComplexTagCell.test.js","sourceRoot":"","sources":["../../../../src/components/assets/AssetsTableComplexTagCell.test.tsx"],"names":[],"mappings":"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"}