@imposium-hub/components 2.14.8 → 2.14.11
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.
- package/dist/cjs/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
- package/dist/cjs/components/anchor-field/AnchorField.d.ts +1 -1
- package/dist/cjs/components/assets/AssetsTableDateCell.d.ts +6 -1
- package/dist/cjs/components/assets/AssetsTableGlobalCell.d.ts +5 -1
- package/dist/cjs/components/assets/AssetsTablePreviewCell.d.ts +17 -1
- package/dist/cjs/components/assets/AssetsTableStatusCell.d.ts +5 -1
- package/dist/cjs/components/assets/AssetsTableTagsCell.d.ts +6 -1
- package/dist/cjs/components/assets/AssetsTableTypeCell.d.ts +5 -1
- package/dist/cjs/components/assets/AssetsTypeIcon.d.ts +5 -1
- package/dist/cjs/components/assets/FontAssetPreview.d.ts +1 -1
- package/dist/cjs/components/assets/StoryTableTotalRendersCell.d.ts +2 -1
- package/dist/cjs/components/button/Button.d.ts +1 -1
- package/dist/cjs/components/button/Button.stories.d.ts +6 -5
- package/dist/cjs/components/button-group-field/ButtonGroupField.d.ts +1 -1
- package/dist/cjs/components/button-group-field/ButtonGroupField.stories.d.ts +2 -1
- package/dist/cjs/components/button-menu/ButtonMenu.d.ts +2 -2
- package/dist/cjs/components/button-menu/ButtonMenu.stories.d.ts +2 -1
- package/dist/cjs/components/button-menu/ButtonMenuItem.d.ts +1 -1
- package/dist/cjs/components/card/Card.d.ts +4 -4
- package/dist/cjs/components/card/Card.stories.d.ts +2 -1
- package/dist/cjs/components/checkbox-field/CheckboxField.d.ts +1 -1
- package/dist/cjs/components/checkbox-field/CheckboxField.stories.d.ts +2 -1
- package/dist/cjs/components/color-field/ColorField.d.ts +1 -1
- package/dist/cjs/components/color-field/ColorFiled.stories.d.ts +2 -1
- package/dist/cjs/components/compositions/TextLayer.d.ts +1 -1
- package/dist/cjs/components/config-variable-button/ConfigVariableButton.d.ts +42 -1
- package/dist/cjs/components/confirm-modal/ConfirmModal.d.ts +2 -1
- package/dist/cjs/components/controlled-list/ControlledList.d.ts +2 -2
- package/dist/cjs/components/controlled-list/ControlledList.stories.d.ts +2 -1
- package/dist/cjs/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
- package/dist/cjs/components/determinate-loader/DeterminateLoader.stories.d.ts +4 -3
- package/dist/cjs/components/dropdown/Dropdown.d.ts +1 -1
- package/dist/cjs/components/dropdown/Dropdown.stories.d.ts +1 -1
- package/dist/cjs/components/field-wrapper/FieldWrapper.d.ts +2 -2
- package/dist/cjs/components/field-wrapper/FieldWrapper.stories.d.ts +2 -1
- package/dist/cjs/components/font-field/FontField.d.ts +2 -1
- package/dist/cjs/components/font-picker/FontPicker.d.ts +1 -1
- package/dist/cjs/components/h-rule/HRule.d.ts +2 -1
- package/dist/cjs/components/h-rule/HRule.stories.d.ts +3 -2
- package/dist/cjs/components/header/ProjectDropdown.d.ts +2 -1
- package/dist/cjs/components/list-field/ListField.d.ts +1 -1
- package/dist/cjs/components/list-field/ListField.stories.d.ts +2 -1
- package/dist/cjs/components/log-viewer/LogViewer.d.ts +1 -1
- package/dist/cjs/components/media-variable-field/MediaVariableField.d.ts +1 -1
- package/dist/cjs/components/modal/Modal.d.ts +1 -1
- package/dist/cjs/components/modal/Modal.stories.d.ts +2 -1
- package/dist/cjs/components/number-field/NumberField.d.ts +3 -3
- package/dist/cjs/components/number-field/NumberField.js +7 -4
- package/dist/cjs/components/number-field/NumberField.js.map +1 -1
- package/dist/cjs/components/number-field/NumberField.stories.d.ts +2 -1
- package/dist/cjs/components/players/AudioPlayer.d.ts +1 -1
- package/dist/cjs/components/players/AudioPreview.d.ts +1 -1
- package/dist/cjs/components/players/ImagePlayer.d.ts +1 -1
- package/dist/cjs/components/players/ImagePreview.d.ts +1 -1
- package/dist/cjs/components/players/ImageSequencePlayer.d.ts +1 -1
- package/dist/cjs/components/players/TemplatePlayer.d.ts +1 -1
- package/dist/cjs/components/players/VideoPlayer.d.ts +1 -1
- package/dist/cjs/components/players/VideoPreview.d.ts +1 -1
- package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +3 -3
- package/dist/cjs/components/publish-wizard/PublishWizard.js +4 -1
- package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
- package/dist/cjs/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
- package/dist/cjs/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
- package/dist/cjs/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
- package/dist/cjs/components/section/Section.d.ts +2 -1
- package/dist/cjs/components/section/Section.stories.d.ts +3 -2
- package/dist/cjs/components/select-field/SelectField.d.ts +1 -1
- package/dist/cjs/components/select-field/SelectField.stories.d.ts +2 -1
- package/dist/cjs/components/shortcut-menu/ShortcutMenu.stories.d.ts +2 -1
- package/dist/cjs/components/slider-field/SliderField.d.ts +1 -1
- package/dist/cjs/components/slider-field/SliderField.stories.d.ts +2 -1
- package/dist/cjs/components/smpte-field/SMPTEField.d.ts +1 -1
- package/dist/cjs/components/tabs/Tabs.stories.d.ts +3 -2
- package/dist/cjs/components/tag/Tag.d.ts +9 -1
- package/dist/cjs/components/text-area-autocomplete/TextAreaAutocomplete.d.ts +2 -1
- package/dist/cjs/components/text-area-field/TextAreaField.d.ts +1 -1
- package/dist/cjs/components/text-area-field/TextAreaField.stories.d.ts +2 -1
- package/dist/cjs/components/text-field/TextField.d.ts +1 -1
- package/dist/cjs/components/text-field/TextField.stories.d.ts +2 -1
- package/dist/cjs/constants/icons.d.ts +80 -79
- package/dist/esm/components/advanced-number-field/AdvancedNumberField.d.ts +1 -1
- package/dist/esm/components/anchor-field/AnchorField.d.ts +1 -1
- package/dist/esm/components/assets/AssetsTableDateCell.d.ts +6 -1
- package/dist/esm/components/assets/AssetsTableGlobalCell.d.ts +5 -1
- package/dist/esm/components/assets/AssetsTablePreviewCell.d.ts +17 -1
- package/dist/esm/components/assets/AssetsTableStatusCell.d.ts +5 -1
- package/dist/esm/components/assets/AssetsTableTagsCell.d.ts +6 -1
- package/dist/esm/components/assets/AssetsTableTypeCell.d.ts +5 -1
- package/dist/esm/components/assets/AssetsTypeIcon.d.ts +5 -1
- package/dist/esm/components/assets/FontAssetPreview.d.ts +1 -1
- package/dist/esm/components/assets/StoryTableTotalRendersCell.d.ts +2 -1
- package/dist/esm/components/button/Button.d.ts +1 -1
- package/dist/esm/components/button/Button.stories.d.ts +6 -5
- package/dist/esm/components/button-group-field/ButtonGroupField.d.ts +1 -1
- package/dist/esm/components/button-group-field/ButtonGroupField.stories.d.ts +2 -1
- package/dist/esm/components/button-menu/ButtonMenu.d.ts +2 -2
- package/dist/esm/components/button-menu/ButtonMenu.stories.d.ts +2 -1
- package/dist/esm/components/button-menu/ButtonMenuItem.d.ts +1 -1
- package/dist/esm/components/card/Card.d.ts +4 -4
- package/dist/esm/components/card/Card.stories.d.ts +2 -1
- package/dist/esm/components/checkbox-field/CheckboxField.d.ts +1 -1
- package/dist/esm/components/checkbox-field/CheckboxField.stories.d.ts +2 -1
- package/dist/esm/components/color-field/ColorField.d.ts +1 -1
- package/dist/esm/components/color-field/ColorFiled.stories.d.ts +2 -1
- package/dist/esm/components/compositions/TextLayer.d.ts +1 -1
- package/dist/esm/components/config-variable-button/ConfigVariableButton.d.ts +42 -1
- package/dist/esm/components/confirm-modal/ConfirmModal.d.ts +2 -1
- package/dist/esm/components/controlled-list/ControlledList.d.ts +2 -2
- package/dist/esm/components/controlled-list/ControlledList.stories.d.ts +2 -1
- package/dist/esm/components/copy-prop-id-button/CopyPropIdButton.d.ts +1 -1
- package/dist/esm/components/determinate-loader/DeterminateLoader.stories.d.ts +4 -3
- package/dist/esm/components/dropdown/Dropdown.d.ts +1 -1
- package/dist/esm/components/dropdown/Dropdown.stories.d.ts +1 -1
- package/dist/esm/components/field-wrapper/FieldWrapper.d.ts +2 -2
- package/dist/esm/components/field-wrapper/FieldWrapper.stories.d.ts +2 -1
- package/dist/esm/components/font-field/FontField.d.ts +2 -1
- package/dist/esm/components/font-picker/FontPicker.d.ts +1 -1
- package/dist/esm/components/h-rule/HRule.d.ts +2 -1
- package/dist/esm/components/h-rule/HRule.stories.d.ts +3 -2
- package/dist/esm/components/header/ProjectDropdown.d.ts +2 -1
- package/dist/esm/components/list-field/ListField.d.ts +1 -1
- package/dist/esm/components/list-field/ListField.stories.d.ts +2 -1
- package/dist/esm/components/log-viewer/LogViewer.d.ts +1 -1
- package/dist/esm/components/media-variable-field/MediaVariableField.d.ts +1 -1
- package/dist/esm/components/modal/Modal.d.ts +1 -1
- package/dist/esm/components/modal/Modal.stories.d.ts +2 -1
- package/dist/esm/components/number-field/NumberField.d.ts +3 -3
- package/dist/esm/components/number-field/NumberField.js +5 -4
- package/dist/esm/components/number-field/NumberField.js.map +1 -1
- package/dist/esm/components/number-field/NumberField.stories.d.ts +2 -1
- package/dist/esm/components/players/AudioPlayer.d.ts +1 -1
- package/dist/esm/components/players/AudioPreview.d.ts +1 -1
- package/dist/esm/components/players/ImagePlayer.d.ts +1 -1
- package/dist/esm/components/players/ImagePreview.d.ts +1 -1
- package/dist/esm/components/players/ImageSequencePlayer.d.ts +1 -1
- package/dist/esm/components/players/TemplatePlayer.d.ts +1 -1
- package/dist/esm/components/players/VideoPlayer.d.ts +1 -1
- package/dist/esm/components/players/VideoPreview.d.ts +1 -1
- package/dist/esm/components/publish-wizard/PublishWizard.d.ts +3 -3
- package/dist/esm/components/publish-wizard/PublishWizard.js +4 -1
- package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
- package/dist/esm/components/publish-wizard/publish/APIIntegration.d.ts +1 -1
- package/dist/esm/components/publish-wizard/publish/HubSpotFlow.d.ts +1 -1
- package/dist/esm/components/publish-wizard/publish/WebpageHosted.d.ts +2 -2
- package/dist/esm/components/section/Section.d.ts +2 -1
- package/dist/esm/components/section/Section.stories.d.ts +3 -2
- package/dist/esm/components/select-field/SelectField.d.ts +1 -1
- package/dist/esm/components/select-field/SelectField.stories.d.ts +2 -1
- package/dist/esm/components/shortcut-menu/ShortcutMenu.stories.d.ts +2 -1
- package/dist/esm/components/slider-field/SliderField.d.ts +1 -1
- package/dist/esm/components/slider-field/SliderField.stories.d.ts +2 -1
- package/dist/esm/components/smpte-field/SMPTEField.d.ts +1 -1
- package/dist/esm/components/tabs/Tabs.stories.d.ts +3 -2
- package/dist/esm/components/tag/Tag.d.ts +9 -1
- package/dist/esm/components/text-area-autocomplete/TextAreaAutocomplete.d.ts +2 -1
- package/dist/esm/components/text-area-field/TextAreaField.d.ts +1 -1
- package/dist/esm/components/text-area-field/TextAreaField.stories.d.ts +2 -1
- package/dist/esm/components/text-field/TextField.d.ts +1 -1
- package/dist/esm/components/text-field/TextField.stories.d.ts +2 -1
- package/dist/esm/constants/icons.d.ts +80 -79
- package/package.json +1 -1
- package/src/components/advanced-number-field/AdvancedNumberField.test.tsx +35 -15
- package/src/components/asset-details/AssetDetails.test.tsx +4 -4
- package/src/components/assets/AssetField.test.tsx +22 -12
- package/src/components/assets/AssetsTableAssetIdCell.test.tsx +18 -10
- package/src/components/assets/AssetsTableAssetIdFilter.test.tsx +2 -2
- package/src/components/assets/AssetsTableComplexTagCell.test.tsx +4 -2
- package/src/components/assets/AssetsTableDropzone.test.tsx +132 -0
- package/src/components/assets/AssetsTableDurationCell.test.tsx +119 -0
- package/src/components/assets/AssetsTableGlobalCell.test.tsx +46 -0
- package/src/components/assets/AssetsTableNameCell.test.tsx +166 -0
- package/{dist/esm/components/assets/AssetsTableAssetIdFilter.test.js → src/components/assets/AssetsTableNameFilter.test.tsx} +52 -20
- package/src/components/assets/AssetsTablePreviewCell.test.tsx +191 -0
- package/src/components/assets/AssetsTableRateCell.test.tsx +87 -0
- package/src/components/assets/AssetsTableSelectCell.test.tsx +156 -0
- package/src/components/assets/AssetsTableSelectFilter.test.tsx +119 -0
- package/src/components/assets/AssetsTableStatusCell.test.tsx +60 -0
- package/src/components/publish-wizard/PublishWizard.tsx +7 -1
- package/dist/cjs/components/advanced-number-field/AdvancedNumberField.test.d.ts +0 -1
- package/dist/cjs/components/advanced-number-field/AdvancedNumberField.test.js +0 -377
- package/dist/cjs/components/advanced-number-field/AdvancedNumberField.test.js.map +0 -1
- package/dist/cjs/components/anchor-field/AnchorField.test.d.ts +0 -1
- package/dist/cjs/components/anchor-field/AnchorField.test.js +0 -87
- package/dist/cjs/components/anchor-field/AnchorField.test.js.map +0 -1
- package/dist/cjs/components/asset-details/AssetDetails.test.d.ts +0 -1
- package/dist/cjs/components/asset-details/AssetDetails.test.js +0 -439
- package/dist/cjs/components/asset-details/AssetDetails.test.js.map +0 -1
- package/dist/cjs/components/assets/AssetField.test.d.ts +0 -1
- package/dist/cjs/components/assets/AssetField.test.js +0 -464
- package/dist/cjs/components/assets/AssetField.test.js.map +0 -1
- package/dist/cjs/components/assets/AssetsTableAssetIdCell.test.d.ts +0 -1
- package/dist/cjs/components/assets/AssetsTableAssetIdCell.test.js +0 -190
- package/dist/cjs/components/assets/AssetsTableAssetIdCell.test.js.map +0 -1
- package/dist/cjs/components/assets/AssetsTableAssetIdFilter.test.d.ts +0 -1
- package/dist/cjs/components/assets/AssetsTableAssetIdFilter.test.js +0 -82
- package/dist/cjs/components/assets/AssetsTableAssetIdFilter.test.js.map +0 -1
- package/dist/cjs/components/assets/AssetsTableComplexTagCell.test.d.ts +0 -1
- package/dist/cjs/components/assets/AssetsTableComplexTagCell.test.js +0 -125
- package/dist/cjs/components/assets/AssetsTableComplexTagCell.test.js.map +0 -1
- package/dist/cjs/components/assets/AssetsTableDateCell.test.d.ts +0 -1
- package/dist/cjs/components/assets/AssetsTableDateCell.test.js +0 -116
- package/dist/cjs/components/assets/AssetsTableDateCell.test.js.map +0 -1
- package/dist/cjs/components/number-field/NumberField.test.d.ts +0 -1
- package/dist/cjs/components/number-field/NumberField.test.js +0 -241
- package/dist/cjs/components/number-field/NumberField.test.js.map +0 -1
- package/dist/cjs/components/text-field/TextField.test.d.ts +0 -1
- package/dist/cjs/components/text-field/TextField.test.js +0 -540
- package/dist/cjs/components/text-field/TextField.test.js.map +0 -1
- package/dist/cjs/test/setup.d.ts +0 -1
- package/dist/cjs/test/setup.js +0 -97
- package/dist/cjs/test/setup.js.map +0 -1
- package/dist/cjs/test/utils.d.ts +0 -26
- package/dist/cjs/test/utils.js +0 -44
- package/dist/cjs/test/utils.js.map +0 -1
- package/dist/esm/components/advanced-number-field/AdvancedNumberField.test.d.ts +0 -1
- package/dist/esm/components/advanced-number-field/AdvancedNumberField.test.js +0 -361
- package/dist/esm/components/advanced-number-field/AdvancedNumberField.test.js.map +0 -1
- package/dist/esm/components/anchor-field/AnchorField.test.d.ts +0 -1
- package/dist/esm/components/anchor-field/AnchorField.test.js +0 -81
- package/dist/esm/components/anchor-field/AnchorField.test.js.map +0 -1
- package/dist/esm/components/asset-details/AssetDetails.test.d.ts +0 -1
- package/dist/esm/components/asset-details/AssetDetails.test.js +0 -367
- package/dist/esm/components/asset-details/AssetDetails.test.js.map +0 -1
- package/dist/esm/components/assets/AssetField.test.d.ts +0 -1
- package/dist/esm/components/assets/AssetField.test.js +0 -311
- package/dist/esm/components/assets/AssetField.test.js.map +0 -1
- package/dist/esm/components/assets/AssetsTableAssetIdCell.test.d.ts +0 -1
- package/dist/esm/components/assets/AssetsTableAssetIdCell.test.js +0 -105
- package/dist/esm/components/assets/AssetsTableAssetIdCell.test.js.map +0 -1
- package/dist/esm/components/assets/AssetsTableAssetIdFilter.test.d.ts +0 -1
- package/dist/esm/components/assets/AssetsTableAssetIdFilter.test.js.map +0 -1
- package/dist/esm/components/assets/AssetsTableComplexTagCell.test.d.ts +0 -1
- package/dist/esm/components/assets/AssetsTableComplexTagCell.test.js +0 -100
- package/dist/esm/components/assets/AssetsTableComplexTagCell.test.js.map +0 -1
- package/dist/esm/components/assets/AssetsTableDateCell.test.d.ts +0 -1
- package/dist/esm/components/assets/AssetsTableDateCell.test.js +0 -60
- package/dist/esm/components/assets/AssetsTableDateCell.test.js.map +0 -1
- package/dist/esm/components/number-field/NumberField.test.d.ts +0 -1
- package/dist/esm/components/number-field/NumberField.test.js +0 -192
- package/dist/esm/components/number-field/NumberField.test.js.map +0 -1
- package/dist/esm/components/text-field/TextField.test.d.ts +0 -1
- package/dist/esm/components/text-field/TextField.test.js +0 -469
- package/dist/esm/components/text-field/TextField.test.js.map +0 -1
- package/dist/esm/test/setup.d.ts +0 -1
- package/dist/esm/test/setup.js +0 -70
- package/dist/esm/test/setup.js.map +0 -1
- package/dist/esm/test/utils.d.ts +0 -26
- package/dist/esm/test/utils.js +0 -27
- package/dist/esm/test/utils.js.map +0 -1
|
@@ -239,11 +239,11 @@ describe('AssetDetails', () => {
|
|
|
239
239
|
const { container } = renderWithRedux(<AssetDetails {...props} />);
|
|
240
240
|
|
|
241
241
|
// Name field should be 100% width in single column
|
|
242
|
-
const nameField: HTMLElement = container.querySelector(
|
|
242
|
+
const nameField: HTMLElement | null = container.querySelector(
|
|
243
243
|
'[data-testid="textfield-Name"]'
|
|
244
244
|
);
|
|
245
245
|
expect(nameField).toBeTruthy();
|
|
246
|
-
expect(nameField
|
|
246
|
+
expect(nameField?.style.width).toBe('100%');
|
|
247
247
|
});
|
|
248
248
|
|
|
249
249
|
it('applies correct width for two column layout', () => {
|
|
@@ -251,11 +251,11 @@ describe('AssetDetails', () => {
|
|
|
251
251
|
const { container } = renderWithRedux(<AssetDetails {...props} />);
|
|
252
252
|
|
|
253
253
|
// Name field should be 50% width in two column
|
|
254
|
-
const nameField: HTMLElement = container.querySelector(
|
|
254
|
+
const nameField: HTMLElement | null = container.querySelector(
|
|
255
255
|
'[data-testid="textfield-Name"]'
|
|
256
256
|
);
|
|
257
257
|
expect(nameField).toBeTruthy();
|
|
258
|
-
expect(nameField
|
|
258
|
+
expect(nameField?.style.width).toBe('50%');
|
|
259
259
|
});
|
|
260
260
|
});
|
|
261
261
|
|
|
@@ -133,21 +133,27 @@ describe('AssetField', () => {
|
|
|
133
133
|
|
|
134
134
|
it('applies width style and error class', () => {
|
|
135
135
|
const { container } = renderWithStore({ width: 500 });
|
|
136
|
-
const assetFieldDiv: HTMLElement = container.querySelector('.asset-field');
|
|
137
|
-
|
|
138
|
-
|
|
136
|
+
const assetFieldDiv: HTMLElement | null = container.querySelector('.asset-field');
|
|
137
|
+
if (assetFieldDiv) {
|
|
138
|
+
expect(assetFieldDiv.style.width).toBe('500px');
|
|
139
|
+
expect(assetFieldDiv.classList.contains('error')).toBe(false);
|
|
140
|
+
}
|
|
139
141
|
});
|
|
140
142
|
|
|
141
143
|
it('defaults to 100% width when no width prop is provided', () => {
|
|
142
144
|
const { container } = renderWithStore({ width: undefined });
|
|
143
|
-
const assetFieldDiv: HTMLElement = container.querySelector('.asset-field');
|
|
144
|
-
|
|
145
|
+
const assetFieldDiv: HTMLElement | null = container.querySelector('.asset-field');
|
|
146
|
+
if (assetFieldDiv) {
|
|
147
|
+
expect(assetFieldDiv.style.width).toBe('100%');
|
|
148
|
+
}
|
|
145
149
|
});
|
|
146
150
|
|
|
147
151
|
it('shows drag prompt placeholder when no assetId', () => {
|
|
148
152
|
const { container } = renderWithStore({ assetId: null });
|
|
149
153
|
const input = container.querySelector('input');
|
|
150
|
-
|
|
154
|
+
if (input) {
|
|
155
|
+
expect(input.placeholder).toBe('Drag Asset Here');
|
|
156
|
+
}
|
|
151
157
|
});
|
|
152
158
|
|
|
153
159
|
it('calls api.getAssetItem on mount when assetId is present', () => {
|
|
@@ -168,17 +174,21 @@ describe('AssetField', () => {
|
|
|
168
174
|
|
|
169
175
|
await vi.waitFor(() => {
|
|
170
176
|
const input = container.querySelector('input');
|
|
171
|
-
|
|
177
|
+
if (input) {
|
|
178
|
+
expect(input.value).toBe('my-video.mp4');
|
|
179
|
+
}
|
|
172
180
|
});
|
|
173
181
|
});
|
|
174
182
|
|
|
175
183
|
it('displays error message after failed API load', async () => {
|
|
176
|
-
const mockApi = createMockApi(
|
|
184
|
+
const mockApi = createMockApi(undefined, true);
|
|
177
185
|
const { container } = renderWithStore({ api: mockApi });
|
|
178
186
|
|
|
179
187
|
await vi.waitFor(() => {
|
|
180
188
|
const input = container.querySelector('input');
|
|
181
|
-
|
|
189
|
+
if (input) {
|
|
190
|
+
expect(input.value).toContain('Could not find asset');
|
|
191
|
+
}
|
|
182
192
|
});
|
|
183
193
|
});
|
|
184
194
|
|
|
@@ -277,7 +287,7 @@ describe('AssetField', () => {
|
|
|
277
287
|
|
|
278
288
|
it('exercises setFilter with string accepts', () => {
|
|
279
289
|
const { container } = renderWithStore({ accepts: 'image' });
|
|
280
|
-
const filterBtn: HTMLElement = container.querySelector(
|
|
290
|
+
const filterBtn: HTMLElement | null = container.querySelector(
|
|
281
291
|
'[data-testid="btn-Filter assets to match Asset type"]'
|
|
282
292
|
);
|
|
283
293
|
expect(filterBtn).toBeTruthy();
|
|
@@ -295,7 +305,7 @@ describe('AssetField', () => {
|
|
|
295
305
|
it('exercises clearAsset button', async () => {
|
|
296
306
|
const onChangeMock = vi.fn();
|
|
297
307
|
const { container } = renderWithStore({ onChange: onChangeMock });
|
|
298
|
-
const clearBtn: HTMLElement = container.querySelector(
|
|
308
|
+
const clearBtn: HTMLElement | null = container.querySelector(
|
|
299
309
|
'[data-testid="btn-Clear the selected Asset"]'
|
|
300
310
|
);
|
|
301
311
|
expect(clearBtn).toBeTruthy();
|
|
@@ -311,7 +321,7 @@ describe('AssetField', () => {
|
|
|
311
321
|
const { container } = renderWithStore({ api: mockApi, accepts: 'image' });
|
|
312
322
|
|
|
313
323
|
await vi.waitFor(() => {
|
|
314
|
-
const filterNameBtn: HTMLElement = container.querySelector(
|
|
324
|
+
const filterNameBtn: HTMLElement | null = container.querySelector(
|
|
315
325
|
'[data-testid="btn-Filter assets to the selected Asset"]'
|
|
316
326
|
);
|
|
317
327
|
expect(filterNameBtn).toBeTruthy();
|
|
@@ -64,15 +64,17 @@ describe('AssetsTableAssetIdCell', () => {
|
|
|
64
64
|
const idCell = container.querySelector('.imposium-asset-id');
|
|
65
65
|
|
|
66
66
|
expect(idCell).toBeTruthy();
|
|
67
|
-
expect(idCell
|
|
67
|
+
expect(idCell?.textContent).toBe(MOCK_ASSET_ID);
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
it('calls onNotification after successful clipboard copy', async () => {
|
|
71
71
|
clipboardWriteTextMock.mockResolvedValueOnce(undefined);
|
|
72
72
|
const { container, props } = renderComponent();
|
|
73
73
|
|
|
74
|
-
const idCell: HTMLElement = container.querySelector('.imposium-asset-id');
|
|
75
|
-
|
|
74
|
+
const idCell: HTMLElement | null = container.querySelector('.imposium-asset-id');
|
|
75
|
+
if (idCell) {
|
|
76
|
+
fireEvent.click(idCell);
|
|
77
|
+
}
|
|
76
78
|
|
|
77
79
|
await vi.waitFor(() => {
|
|
78
80
|
expect(clipboardWriteTextMock).toHaveBeenCalledWith(MOCK_ASSET_ID);
|
|
@@ -84,8 +86,10 @@ describe('AssetsTableAssetIdCell', () => {
|
|
|
84
86
|
clipboardWriteTextMock.mockRejectedValueOnce(new Error('clipboard denied'));
|
|
85
87
|
const { container, props } = renderComponent();
|
|
86
88
|
|
|
87
|
-
const idCell: HTMLElement = container.querySelector('.imposium-asset-id');
|
|
88
|
-
|
|
89
|
+
const idCell: HTMLElement | null = container.querySelector('.imposium-asset-id');
|
|
90
|
+
if (idCell) {
|
|
91
|
+
fireEvent.click(idCell);
|
|
92
|
+
}
|
|
89
93
|
|
|
90
94
|
await vi.waitFor(() => {
|
|
91
95
|
expect(props.onError).toHaveBeenCalledWith(copying.error);
|
|
@@ -99,8 +103,10 @@ describe('AssetsTableAssetIdCell', () => {
|
|
|
99
103
|
onError: undefined
|
|
100
104
|
});
|
|
101
105
|
|
|
102
|
-
const idCell: HTMLElement = container.querySelector('.imposium-asset-id');
|
|
103
|
-
|
|
106
|
+
const idCell: HTMLElement | null = container.querySelector('.imposium-asset-id');
|
|
107
|
+
if (idCell) {
|
|
108
|
+
fireEvent.click(idCell);
|
|
109
|
+
}
|
|
104
110
|
|
|
105
111
|
await vi.waitFor(() => {
|
|
106
112
|
expect(clipboardWriteTextMock).toHaveBeenCalledWith(MOCK_ASSET_ID);
|
|
@@ -114,8 +120,10 @@ describe('AssetsTableAssetIdCell', () => {
|
|
|
114
120
|
onError: undefined
|
|
115
121
|
});
|
|
116
122
|
|
|
117
|
-
const idCell: HTMLElement = container.querySelector('.imposium-asset-id');
|
|
118
|
-
|
|
123
|
+
const idCell: HTMLElement | null = container.querySelector('.imposium-asset-id');
|
|
124
|
+
if (idCell) {
|
|
125
|
+
fireEvent.click(idCell);
|
|
126
|
+
}
|
|
119
127
|
|
|
120
128
|
await vi.waitFor(() => {
|
|
121
129
|
expect(clipboardWriteTextMock).toHaveBeenCalled();
|
|
@@ -129,6 +137,6 @@ describe('AssetsTableAssetIdCell', () => {
|
|
|
129
137
|
});
|
|
130
138
|
|
|
131
139
|
const idCell = container.querySelector('.imposium-asset-id');
|
|
132
|
-
expect(idCell
|
|
140
|
+
expect(idCell?.textContent).toBe(differentId);
|
|
133
141
|
});
|
|
134
142
|
});
|
|
@@ -33,7 +33,7 @@ const MOCK_ASSET_ID_FILTER = 'existing-filter-123';
|
|
|
33
33
|
|
|
34
34
|
const createMockStore = (assetIdFilter = '') => {
|
|
35
35
|
const initialState = { assetFilters: { id: assetIdFilter } };
|
|
36
|
-
return createStore((state = initialState, action: any) => {
|
|
36
|
+
return createStore((state: any = initialState, action: any) => {
|
|
37
37
|
if (action.type === 'assetFilters/UPDATE') {
|
|
38
38
|
return {
|
|
39
39
|
...state,
|
|
@@ -74,7 +74,7 @@ describe('AssetsTableAssetIdFilter', () => {
|
|
|
74
74
|
|
|
75
75
|
submitButton.click();
|
|
76
76
|
|
|
77
|
-
const storeState = store.getState()
|
|
77
|
+
const storeState = store.getState();
|
|
78
78
|
expect(storeState.assetFilters.id).toBe('new-filter-value');
|
|
79
79
|
});
|
|
80
80
|
|
|
@@ -120,8 +120,10 @@ describe('AssetsTableComplexTagCell', () => {
|
|
|
120
120
|
const textField = getByTestId('mock-text-field');
|
|
121
121
|
|
|
122
122
|
const suggestionsAttr = textField.getAttribute('data-suggestions');
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
if (suggestionsAttr) {
|
|
124
|
+
expect(suggestionsAttr).toBeTruthy();
|
|
125
|
+
expect(JSON.parse(suggestionsAttr)).toEqual(suggestions);
|
|
126
|
+
}
|
|
125
127
|
});
|
|
126
128
|
|
|
127
129
|
it('dispatches addAssetTag when submitting a new tag', () => {
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render } from '@testing-library/react';
|
|
4
|
+
|
|
5
|
+
let capturedDropConfig: any = {};
|
|
6
|
+
|
|
7
|
+
vi.mock('react-dnd', () => ({
|
|
8
|
+
useDrop: (configFn: () => any) => {
|
|
9
|
+
capturedDropConfig = typeof configFn === 'function' ? configFn() : configFn;
|
|
10
|
+
const refCallback = vi.fn();
|
|
11
|
+
return [{}, refCallback];
|
|
12
|
+
}
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
vi.mock('react-dnd-html5-backend', () => ({
|
|
16
|
+
NativeTypes: { FILE: '__NATIVE_FILE__' }
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
import AssetsTableDropzone from './AssetsTableDropzone';
|
|
20
|
+
|
|
21
|
+
describe('AssetsTableDropzone', () => {
|
|
22
|
+
it('renders children inside a div', () => {
|
|
23
|
+
const { getByText } = render(
|
|
24
|
+
<AssetsTableDropzone onDrop={vi.fn()}>
|
|
25
|
+
<span>Drop here</span>
|
|
26
|
+
</AssetsTableDropzone>
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
expect(getByText('Drop here')).toBeTruthy();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('applies the provided className', () => {
|
|
33
|
+
const { container } = render(
|
|
34
|
+
<AssetsTableDropzone
|
|
35
|
+
onDrop={vi.fn()}
|
|
36
|
+
className='custom-zone'>
|
|
37
|
+
<span>content</span>
|
|
38
|
+
</AssetsTableDropzone>
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
expect(container?.firstElementChild?.className).toBe('custom-zone');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('defaults to empty className when none is provided', () => {
|
|
45
|
+
const { container } = render(
|
|
46
|
+
<AssetsTableDropzone onDrop={vi.fn()}>
|
|
47
|
+
<span>content</span>
|
|
48
|
+
</AssetsTableDropzone>
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
expect(container?.firstElementChild?.className).toBe('');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('accepts NativeTypes.FILE in the drop config', () => {
|
|
55
|
+
render(
|
|
56
|
+
<AssetsTableDropzone onDrop={vi.fn()}>
|
|
57
|
+
<span>content</span>
|
|
58
|
+
</AssetsTableDropzone>
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(capturedDropConfig.accept).toContain('__NATIVE_FILE__');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('calls onDrop with props and monitor when an item is dropped', () => {
|
|
65
|
+
const onDrop = vi.fn();
|
|
66
|
+
render(
|
|
67
|
+
<AssetsTableDropzone onDrop={onDrop}>
|
|
68
|
+
<span>content</span>
|
|
69
|
+
</AssetsTableDropzone>
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const mockMonitor = { isOver: vi.fn(), canDrop: vi.fn() };
|
|
73
|
+
capturedDropConfig.drop({}, mockMonitor);
|
|
74
|
+
|
|
75
|
+
expect(onDrop).toHaveBeenCalledWith(expect.objectContaining({ onDrop }), mockMonitor);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('does not throw when onDrop is falsy', () => {
|
|
79
|
+
render(
|
|
80
|
+
<AssetsTableDropzone onDrop={undefined as any}>
|
|
81
|
+
<span>content</span>
|
|
82
|
+
</AssetsTableDropzone>
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const mockMonitor = { isOver: vi.fn(), canDrop: vi.fn() };
|
|
86
|
+
expect(() => capturedDropConfig.drop({}, mockMonitor)).not.toThrow();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('uses onExternalCollect when provided', () => {
|
|
90
|
+
const onExternalCollect = vi.fn(() => ({ custom: true }));
|
|
91
|
+
render(
|
|
92
|
+
<AssetsTableDropzone
|
|
93
|
+
onDrop={vi.fn()}
|
|
94
|
+
onExternalCollect={onExternalCollect}>
|
|
95
|
+
<span>content</span>
|
|
96
|
+
</AssetsTableDropzone>
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const mockMonitor = { isOver: vi.fn(), canDrop: vi.fn() };
|
|
100
|
+
const result = capturedDropConfig.collect(mockMonitor);
|
|
101
|
+
|
|
102
|
+
expect(onExternalCollect).toHaveBeenCalledWith(mockMonitor);
|
|
103
|
+
expect(result).toEqual({ custom: true });
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('uses default collect when onExternalCollect is not provided', () => {
|
|
107
|
+
render(
|
|
108
|
+
<AssetsTableDropzone onDrop={vi.fn()}>
|
|
109
|
+
<span>content</span>
|
|
110
|
+
</AssetsTableDropzone>
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const mockIsOver = vi.fn();
|
|
114
|
+
const mockCanDrop = vi.fn();
|
|
115
|
+
const mockMonitor = { isOver: mockIsOver, canDrop: mockCanDrop };
|
|
116
|
+
const result = capturedDropConfig.collect(mockMonitor);
|
|
117
|
+
|
|
118
|
+
expect(result).toEqual({ isOver: mockIsOver, canDrop: mockCanDrop });
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('does not attach dropRef when disable is true', () => {
|
|
122
|
+
const { container } = render(
|
|
123
|
+
<AssetsTableDropzone
|
|
124
|
+
onDrop={vi.fn()}
|
|
125
|
+
disable={true}>
|
|
126
|
+
<span>content</span>
|
|
127
|
+
</AssetsTableDropzone>
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
expect(container.firstElementChild).toBeTruthy();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render } from '@testing-library/react';
|
|
4
|
+
|
|
5
|
+
const MOCK_DURATION = '00:01:30:00';
|
|
6
|
+
const MOCK_AUDIO_DURATION = '00:02:15';
|
|
7
|
+
|
|
8
|
+
vi.mock('../../Util', async (importOriginal) => {
|
|
9
|
+
const actual = (await importOriginal()) as any;
|
|
10
|
+
return {
|
|
11
|
+
...actual,
|
|
12
|
+
getDuration: vi.fn(() => MOCK_DURATION),
|
|
13
|
+
formatAudioDuration: vi.fn(() => MOCK_AUDIO_DURATION)
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
import AssetsTableDurationCell, { secondsToTime } from './AssetsTableDurationCell';
|
|
18
|
+
import { getDuration, formatAudioDuration } from '../../Util';
|
|
19
|
+
import { ASSET_TYPES } from '../../constants/assets';
|
|
20
|
+
|
|
21
|
+
const buildCellProp = (overrides: Record<string, any> = {}) => ({
|
|
22
|
+
row: {
|
|
23
|
+
original: {
|
|
24
|
+
type: 'video',
|
|
25
|
+
data: '{}',
|
|
26
|
+
rate: 30,
|
|
27
|
+
frame_count: 2700,
|
|
28
|
+
duration: 0,
|
|
29
|
+
...overrides
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('AssetsTableDurationCell', () => {
|
|
35
|
+
it('renders duration using getDuration when rate and frame_count exist', () => {
|
|
36
|
+
const cell = buildCellProp({ type: 'video', rate: 30, frame_count: 2700 });
|
|
37
|
+
const { container } = render(<AssetsTableDurationCell cell={cell} />);
|
|
38
|
+
|
|
39
|
+
expect(getDuration).toHaveBeenCalledWith(2700, 30);
|
|
40
|
+
expect(container.querySelector('.asset-duration-cell')).toBeTruthy();
|
|
41
|
+
expect(container.textContent).toBe(MOCK_DURATION);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('renders empty duration when rate is missing', () => {
|
|
45
|
+
vi.mocked(getDuration).mockClear();
|
|
46
|
+
const cell = buildCellProp({ type: 'video', rate: null, frame_count: 100 });
|
|
47
|
+
const { container } = render(<AssetsTableDurationCell cell={cell} />);
|
|
48
|
+
|
|
49
|
+
expect(getDuration).not.toHaveBeenCalled();
|
|
50
|
+
expect(container.querySelector('.asset-duration-cell')).toBeTruthy();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('renders frame count for image_sequence type', () => {
|
|
54
|
+
const cell = buildCellProp({
|
|
55
|
+
type: ASSET_TYPES.IMAGE_SEQUENCE,
|
|
56
|
+
duration: 120,
|
|
57
|
+
rate: null,
|
|
58
|
+
frame_count: null
|
|
59
|
+
});
|
|
60
|
+
const { container } = render(<AssetsTableDurationCell cell={cell} />);
|
|
61
|
+
|
|
62
|
+
expect(container.textContent).toBe('120 frames');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('parses data JSON and renders duration for video_composition type', () => {
|
|
66
|
+
const compositionData = JSON.stringify({ frames: 900, rate: 24 });
|
|
67
|
+
const cell = buildCellProp({
|
|
68
|
+
type: ASSET_TYPES.VIDEO_COMPOSITION,
|
|
69
|
+
data: compositionData,
|
|
70
|
+
rate: null,
|
|
71
|
+
frame_count: null
|
|
72
|
+
});
|
|
73
|
+
const { container } = render(<AssetsTableDurationCell cell={cell} />);
|
|
74
|
+
|
|
75
|
+
expect(getDuration).toHaveBeenCalledWith(900, 24);
|
|
76
|
+
expect(container.textContent).toBe(MOCK_DURATION);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('renders formatted audio duration for audio type', () => {
|
|
80
|
+
const cell = buildCellProp({
|
|
81
|
+
type: ASSET_TYPES.AUDIO,
|
|
82
|
+
duration: 135,
|
|
83
|
+
rate: null,
|
|
84
|
+
frame_count: null
|
|
85
|
+
});
|
|
86
|
+
const { container } = render(<AssetsTableDurationCell cell={cell} />);
|
|
87
|
+
|
|
88
|
+
expect(formatAudioDuration).toHaveBeenCalledWith(135);
|
|
89
|
+
expect(container.textContent).toBe(MOCK_AUDIO_DURATION);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('renders empty div when duration is null', () => {
|
|
93
|
+
vi.mocked(getDuration).mockReturnValueOnce(null as any);
|
|
94
|
+
const cell = buildCellProp({ type: 'unknown', rate: 30, frame_count: 100 });
|
|
95
|
+
const { container } = render(<AssetsTableDurationCell cell={cell} />);
|
|
96
|
+
const durationCell = container.querySelector('.asset-duration-cell');
|
|
97
|
+
|
|
98
|
+
expect(durationCell).toBeTruthy();
|
|
99
|
+
expect(durationCell?.textContent).toBe('');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('secondsToTime', () => {
|
|
104
|
+
it('formats seconds into minutes:seconds', () => {
|
|
105
|
+
expect(secondsToTime(90)).toBe('1:30');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('pads single-digit seconds with a leading zero', () => {
|
|
109
|
+
expect(secondsToTime(65)).toBe('1:05');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('handles zero seconds', () => {
|
|
113
|
+
expect(secondsToTime(0)).toBe('0:00');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('handles large values', () => {
|
|
117
|
+
expect(secondsToTime(3661)).toBe('61:01');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render } from '@testing-library/react';
|
|
4
|
+
|
|
5
|
+
vi.mock('../../constants/icons', () => ({
|
|
6
|
+
ICON_GLOBE: <span data-testid='icon-globe'>globe</span>
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
import AssetsTableGlobalCellMemoized from './AssetsTableGlobalCell';
|
|
10
|
+
|
|
11
|
+
const buildCellProp = (storyId: any) => ({
|
|
12
|
+
row: { original: { story_id: storyId } }
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('AssetsTableGlobalCell', () => {
|
|
16
|
+
it('hides the globe icon when story_id is a truthy string', () => {
|
|
17
|
+
const { container, queryByTestId } = render(
|
|
18
|
+
<AssetsTableGlobalCellMemoized cell={buildCellProp('story-123')} />
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
expect(container.querySelector('.asset-global-cell')).toBeTruthy();
|
|
22
|
+
expect(queryByTestId('icon-globe')).toBeNull();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('hides the globe icon when story_id is undefined', () => {
|
|
26
|
+
const { queryByTestId } = render(
|
|
27
|
+
<AssetsTableGlobalCellMemoized cell={buildCellProp(undefined)} />
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
expect(queryByTestId('icon-globe')).toBeNull();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('shows the globe icon when story_id is null', () => {
|
|
34
|
+
const { getByTestId } = render(
|
|
35
|
+
<AssetsTableGlobalCellMemoized cell={buildCellProp(null)} />
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
expect(getByTestId('icon-globe')).toBeTruthy();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('shows the globe icon when story_id is an empty string', () => {
|
|
42
|
+
const { getByTestId } = render(<AssetsTableGlobalCellMemoized cell={buildCellProp('')} />);
|
|
43
|
+
|
|
44
|
+
expect(getByTestId('icon-globe')).toBeTruthy();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
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 { assets as copy } from '../../constants/copy';
|
|
7
|
+
|
|
8
|
+
let capturedTextFieldProps: any = {};
|
|
9
|
+
|
|
10
|
+
vi.mock('../text-field/TextField', () => ({
|
|
11
|
+
default: (props: any) => {
|
|
12
|
+
capturedTextFieldProps = props;
|
|
13
|
+
return (
|
|
14
|
+
<div
|
|
15
|
+
data-testid='mock-text-field'
|
|
16
|
+
data-value={props.value}
|
|
17
|
+
data-disabled={props.disabled}>
|
|
18
|
+
<input
|
|
19
|
+
value={props.value || ''}
|
|
20
|
+
onChange={(e) => props.onChange((e.target as HTMLInputElement).value)}
|
|
21
|
+
readOnly={props.disabled}
|
|
22
|
+
/>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
vi.mock('../determinate-loader/DeterminateLoader', () => ({
|
|
29
|
+
DeterminateLoader: ({ progress, text }: any) => (
|
|
30
|
+
<div
|
|
31
|
+
data-testid='determinate-loader'
|
|
32
|
+
data-progress={progress}>
|
|
33
|
+
{text}
|
|
34
|
+
</div>
|
|
35
|
+
)
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
vi.mock('../../redux/actions/asset-list', () => ({
|
|
39
|
+
updateAssetName: vi.fn((_api, _id, _name) => ({ type: 'MOCK_UPDATE_NAME' })),
|
|
40
|
+
default: {}
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
import AssetsTableNameCellConnected from './AssetsTableNameCell';
|
|
44
|
+
import { updateAssetName } from '../../redux/actions/asset-list';
|
|
45
|
+
|
|
46
|
+
const MOCK_ASSET_ID = 'asset-abc';
|
|
47
|
+
const MOCK_ASSET_NAME = 'my-video.mp4';
|
|
48
|
+
const MOCK_API = { updateAsset: vi.fn() };
|
|
49
|
+
|
|
50
|
+
const createMockStore = () => createStore((state = {}) => state);
|
|
51
|
+
|
|
52
|
+
const buildCellProp = (overrides: Record<string, any> = {}) => ({
|
|
53
|
+
row: {
|
|
54
|
+
original: {
|
|
55
|
+
name: MOCK_ASSET_NAME,
|
|
56
|
+
id: MOCK_ASSET_ID,
|
|
57
|
+
percent: undefined,
|
|
58
|
+
error: undefined,
|
|
59
|
+
...overrides
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const renderComponent = (cellOverrides: Record<string, any> = {}, disabled = false) => {
|
|
65
|
+
const store = createMockStore();
|
|
66
|
+
const cell = buildCellProp(cellOverrides);
|
|
67
|
+
|
|
68
|
+
const result = render(
|
|
69
|
+
<Provider store={store}>
|
|
70
|
+
<AssetsTableNameCellConnected
|
|
71
|
+
cell={cell}
|
|
72
|
+
api={MOCK_API}
|
|
73
|
+
disabled={disabled}
|
|
74
|
+
/>
|
|
75
|
+
</Provider>
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
describe('AssetsTableNameCell', () => {
|
|
82
|
+
beforeEach(() => {
|
|
83
|
+
vi.useFakeTimers();
|
|
84
|
+
vi.mocked(updateAssetName).mockClear();
|
|
85
|
+
capturedTextFieldProps = {};
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
afterEach(() => {
|
|
89
|
+
vi.useRealTimers();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('renders a TextField with the asset name when not uploading', () => {
|
|
93
|
+
const { getByTestId } = renderComponent();
|
|
94
|
+
const textField = getByTestId('mock-text-field');
|
|
95
|
+
|
|
96
|
+
expect(textField.getAttribute('data-value')).toBe(MOCK_ASSET_NAME);
|
|
97
|
+
expect(textField.getAttribute('data-disabled')).toBe('false');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('renders a TextField as disabled when disabled prop is true', () => {
|
|
101
|
+
const { getByTestId } = renderComponent({}, true);
|
|
102
|
+
const textField = getByTestId('mock-text-field');
|
|
103
|
+
|
|
104
|
+
expect(textField.getAttribute('data-disabled')).toBe('true');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('renders DeterminateLoader when upload progress is under 100', () => {
|
|
108
|
+
const { getByTestId } = renderComponent({ percent: 45 });
|
|
109
|
+
const loader = getByTestId('determinate-loader');
|
|
110
|
+
|
|
111
|
+
expect(loader.getAttribute('data-progress')).toBe('45');
|
|
112
|
+
expect(loader.textContent).toBe(MOCK_ASSET_NAME);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('renders prepare phase text when upload progress is 100 and no error', () => {
|
|
116
|
+
const { container } = renderComponent({ percent: 100 });
|
|
117
|
+
|
|
118
|
+
expect(container.textContent).toBe(copy.uploads.preparePhase);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('renders error message when upload progress is 100 and error exists', () => {
|
|
122
|
+
const errorMessage = 'Upload failed';
|
|
123
|
+
const { container } = renderComponent({ percent: 100, error: errorMessage });
|
|
124
|
+
|
|
125
|
+
expect(container.textContent).toBe(errorMessage);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('dispatches updateAssetName after debounce on text change', () => {
|
|
129
|
+
renderComponent();
|
|
130
|
+
|
|
131
|
+
act(() => {
|
|
132
|
+
capturedTextFieldProps.onChange('new-name');
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
expect(updateAssetName).not.toHaveBeenCalled();
|
|
136
|
+
|
|
137
|
+
act(() => {
|
|
138
|
+
vi.advanceTimersByTime(1000);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
expect(updateAssetName).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'new-name');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('resets debounce timer on rapid changes', () => {
|
|
145
|
+
renderComponent();
|
|
146
|
+
|
|
147
|
+
act(() => {
|
|
148
|
+
capturedTextFieldProps.onChange('first');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
act(() => {
|
|
152
|
+
vi.advanceTimersByTime(500);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
act(() => {
|
|
156
|
+
capturedTextFieldProps.onChange('second');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
act(() => {
|
|
160
|
+
vi.advanceTimersByTime(1000);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
expect(updateAssetName).toHaveBeenCalledTimes(1);
|
|
164
|
+
expect(updateAssetName).toHaveBeenCalledWith(MOCK_API, MOCK_ASSET_ID, 'second');
|
|
165
|
+
});
|
|
166
|
+
});
|