@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.2
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/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +2 -1
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/sagas/__tests__/assetPolling.test.js +74 -3
- package/sagas/assetPolling.js +8 -1
- package/services/api.js +10 -5
- package/services/tests/api.test.js +18 -0
- package/translations/en.json +0 -1
- package/utils/common.js +5 -0
- package/utils/commonUtils.js +14 -1
- package/utils/tests/commonUtil.test.js +224 -0
- package/utils/transformTemplateConfig.js +0 -10
- package/utils/transformerUtils.js +0 -42
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapImageUpload/constants.js +0 -2
- package/v2Components/CapImageUpload/index.js +14 -54
- package/v2Components/CapImageUpload/index.scss +1 -4
- package/v2Components/CapImageUpload/messages.js +0 -4
- package/v2Components/CapTagList/index.js +6 -1
- package/v2Components/CapTagListWithInput/index.js +5 -1
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
- package/v2Components/ErrorInfoNote/index.js +412 -72
- package/v2Components/ErrorInfoNote/messages.js +22 -0
- package/v2Components/ErrorInfoNote/style.scss +279 -2
- package/v2Components/HtmlEditor/HTMLEditor.js +217 -90
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
- package/v2Components/HtmlEditor/_htmlEditor.scss +15 -23
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -0
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +1 -0
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +87 -62
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
- package/v2Components/HtmlEditor/constants.js +29 -20
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +95 -85
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
- package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
- package/v2Components/MobilePushPreviewV2/index.js +32 -7
- package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
- package/v2Components/TemplatePreview/index.js +47 -32
- package/v2Components/TemplatePreview/messages.js +4 -0
- package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
- package/v2Containers/App/constants.js +0 -5
- package/v2Containers/BeeEditor/index.js +82 -80
- package/v2Containers/BeePopupEditor/constants.js +10 -0
- package/v2Containers/BeePopupEditor/index.js +193 -0
- package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
- package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +1 -2
- package/v2Containers/CreativesContainer/index.js +173 -193
- package/v2Containers/CreativesContainer/messages.js +4 -4
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
- package/v2Containers/Email/actions.js +7 -0
- package/v2Containers/Email/constants.js +5 -1
- package/v2Containers/Email/index.js +13 -0
- package/v2Containers/Email/messages.js +32 -0
- package/v2Containers/Email/reducer.js +12 -1
- package/v2Containers/Email/sagas.js +41 -6
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1046 -0
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
- package/v2Containers/EmailWrapper/constants.js +2 -0
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
- package/v2Containers/EmailWrapper/index.js +99 -23
- package/v2Containers/EmailWrapper/messages.js +61 -1
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +26 -1
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
- package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
- package/v2Containers/InApp/actions.js +7 -0
- package/v2Containers/InApp/constants.js +20 -4
- package/v2Containers/InApp/index.js +800 -357
- package/v2Containers/InApp/index.scss +4 -3
- package/v2Containers/InApp/messages.js +7 -3
- package/v2Containers/InApp/reducer.js +21 -3
- package/v2Containers/InApp/sagas.js +29 -9
- package/v2Containers/InApp/selectors.js +25 -5
- package/v2Containers/InApp/tests/index.test.js +154 -50
- package/v2Containers/InApp/tests/reducer.test.js +34 -0
- package/v2Containers/InApp/tests/sagas.test.js +61 -9
- package/v2Containers/InApp/tests/selectors.test.js +612 -0
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
- package/v2Containers/InAppWrapper/constants.js +16 -0
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
- package/v2Containers/InAppWrapper/index.js +148 -0
- package/v2Containers/InAppWrapper/messages.js +49 -0
- package/v2Containers/InappAdvance/index.js +1099 -0
- package/v2Containers/InappAdvance/index.scss +10 -0
- package/v2Containers/InappAdvance/tests/index.test.js +448 -0
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
- package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
- package/v2Containers/TagList/index.js +67 -1
- package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
- package/v2Containers/Templates/_templates.scss +56 -200
- package/v2Containers/Templates/actions.js +1 -2
- package/v2Containers/Templates/constants.js +0 -1
- package/v2Containers/Templates/index.js +124 -277
- package/v2Containers/Templates/messages.js +4 -24
- package/v2Containers/Templates/reducer.js +0 -2
- package/v2Containers/Templates/tests/index.test.js +0 -10
- package/v2Containers/TemplatesV2/index.js +2 -3
- package/v2Containers/TemplatesV2/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
- package/v2Components/CapImageUrlUpload/constants.js +0 -19
- package/v2Components/CapImageUrlUpload/index.js +0 -455
- package/v2Components/CapImageUrlUpload/index.scss +0 -35
- package/v2Components/CapImageUrlUpload/messages.js +0 -47
- package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
- package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
- package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
- package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
- package/v2Containers/WebPush/Create/index.js +0 -1755
- package/v2Containers/WebPush/Create/index.scss +0 -123
- package/v2Containers/WebPush/Create/messages.js +0 -199
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
- package/v2Containers/WebPush/Create/preview/constants.js +0 -162
- package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
- package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
- package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
- package/v2Containers/WebPush/actions.js +0 -60
- package/v2Containers/WebPush/constants.js +0 -108
- package/v2Containers/WebPush/index.js +0 -2
- package/v2Containers/WebPush/reducer.js +0 -104
- package/v2Containers/WebPush/sagas.js +0 -119
- package/v2Containers/WebPush/selectors.js +0 -65
- package/v2Containers/WebPush/tests/reducer.test.js +0 -863
- package/v2Containers/WebPush/tests/sagas.test.js +0 -566
- package/v2Containers/WebPush/tests/selectors.test.js +0 -960
|
@@ -1,909 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { act } from 'react-dom/test-utils';
|
|
3
|
-
import { mountWithIntl, shallowWithIntl } from '../../../../../helpers/intl-enzym-test-helpers';
|
|
4
|
-
import DevicePreviewContent from '../DevicePreviewContent';
|
|
5
|
-
import PreviewControls from '../PreviewControls';
|
|
6
|
-
import NotificationContainer from '../NotificationContainer';
|
|
7
|
-
import {
|
|
8
|
-
OS_MACOS,
|
|
9
|
-
OS_IOS,
|
|
10
|
-
OS_IPADOS,
|
|
11
|
-
OS_WINDOWS,
|
|
12
|
-
OS_ANDROID_MOBILE,
|
|
13
|
-
OS_ANDROID_TABLET,
|
|
14
|
-
BROWSER_CHROME,
|
|
15
|
-
BROWSER_FIREFOX,
|
|
16
|
-
BROWSER_EDGE,
|
|
17
|
-
BROWSER_SAFARI,
|
|
18
|
-
BROWSER_OPERA,
|
|
19
|
-
NOTIFICATION_STATE_COLLAPSED,
|
|
20
|
-
NOTIFICATION_STATE_EXPANDED,
|
|
21
|
-
DEFAULT_OS,
|
|
22
|
-
DEFAULT_BROWSER,
|
|
23
|
-
DEFAULT_STATE,
|
|
24
|
-
} from '../constants';
|
|
25
|
-
import {
|
|
26
|
-
getBrowserOptionsForOS,
|
|
27
|
-
getResolvedVariant,
|
|
28
|
-
coerceStateForVariant,
|
|
29
|
-
getSupportedStates,
|
|
30
|
-
} from '../config/notificationMappings';
|
|
31
|
-
|
|
32
|
-
// Mock PreviewControls to avoid complex CapSelect interactions
|
|
33
|
-
jest.mock('../PreviewControls', () => {
|
|
34
|
-
const React = require('react');
|
|
35
|
-
return function MockPreviewControls({
|
|
36
|
-
selectedOS,
|
|
37
|
-
selectedBrowser,
|
|
38
|
-
selectedState,
|
|
39
|
-
onOSChange,
|
|
40
|
-
onBrowserChange,
|
|
41
|
-
onStateChange,
|
|
42
|
-
}) {
|
|
43
|
-
return (
|
|
44
|
-
<div className="mock-preview-controls">
|
|
45
|
-
<button
|
|
46
|
-
className="mock-os-change"
|
|
47
|
-
onClick={() => onOSChange && onOSChange('Windows')}
|
|
48
|
-
data-testid="mock-os-change"
|
|
49
|
-
>
|
|
50
|
-
Change OS
|
|
51
|
-
</button>
|
|
52
|
-
<button
|
|
53
|
-
className="mock-browser-change"
|
|
54
|
-
onClick={() => onBrowserChange && onBrowserChange('Firefox')}
|
|
55
|
-
data-testid="mock-browser-change"
|
|
56
|
-
>
|
|
57
|
-
Change Browser
|
|
58
|
-
</button>
|
|
59
|
-
<button
|
|
60
|
-
className="mock-state-change"
|
|
61
|
-
onClick={() => onStateChange && onStateChange('Expanded')}
|
|
62
|
-
data-testid="mock-state-change"
|
|
63
|
-
>
|
|
64
|
-
Change State
|
|
65
|
-
</button>
|
|
66
|
-
<div data-testid="selected-os">{selectedOS}</div>
|
|
67
|
-
<div data-testid="selected-browser">{selectedBrowser}</div>
|
|
68
|
-
<div data-testid="selected-state">{selectedState}</div>
|
|
69
|
-
</div>
|
|
70
|
-
);
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// Mock NotificationContainer to focus on DevicePreviewContent logic
|
|
75
|
-
jest.mock('../NotificationContainer', () => {
|
|
76
|
-
const React = require('react');
|
|
77
|
-
return function MockNotificationContainer({ notificationTitle, notificationBody }) {
|
|
78
|
-
return (
|
|
79
|
-
<div className="mock-notification-container">
|
|
80
|
-
<div className="notification-title">{notificationTitle}</div>
|
|
81
|
-
<div className="notification-body">{notificationBody}</div>
|
|
82
|
-
</div>
|
|
83
|
-
);
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
describe('DevicePreviewContent', () => {
|
|
88
|
-
const defaultProps = {
|
|
89
|
-
notificationTitle: 'Test Notification Title',
|
|
90
|
-
notificationBody: 'Test notification body text',
|
|
91
|
-
url: 'https://www.example.com',
|
|
92
|
-
imageSrc: 'https://example.com/image.jpg',
|
|
93
|
-
brandIconSrc: 'https://example.com/icon.png',
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
beforeEach(() => {
|
|
97
|
-
jest.clearAllMocks();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe('Basic Rendering', () => {
|
|
101
|
-
it('should render correctly with default props', () => {
|
|
102
|
-
const wrapper = shallowWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
103
|
-
expect(wrapper).toMatchSnapshot();
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('should render with minimal props', () => {
|
|
107
|
-
const wrapper = mountWithIntl(<DevicePreviewContent />);
|
|
108
|
-
expect(wrapper.exists()).toBe(true);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('should render PreviewControls with correct props', () => {
|
|
112
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
113
|
-
const previewControls = wrapper.find(PreviewControls);
|
|
114
|
-
expect(previewControls.exists()).toBe(true);
|
|
115
|
-
expect(previewControls.prop('selectedOS')).toBe(DEFAULT_OS);
|
|
116
|
-
expect(previewControls.prop('selectedBrowser')).toBe(DEFAULT_BROWSER);
|
|
117
|
-
expect(previewControls.prop('selectedState')).toBe(DEFAULT_STATE);
|
|
118
|
-
expect(previewControls.prop('layoutMode')).toBe('compact');
|
|
119
|
-
expect(previewControls.prop('showStateDropdown')).toBe(true);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('should render device frame container', () => {
|
|
123
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
124
|
-
const container = wrapper.find('.device-preview-container');
|
|
125
|
-
expect(container.exists()).toBe(true);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('should render device frame wrapper', () => {
|
|
129
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
130
|
-
const frameWrapper = wrapper.find('.device-frame-wrapper');
|
|
131
|
-
expect(frameWrapper.exists()).toBe(true);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it('should render device frame image', () => {
|
|
135
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
136
|
-
const frameImage = wrapper.find('.device-frame');
|
|
137
|
-
expect(frameImage.exists()).toBe(true);
|
|
138
|
-
expect(frameImage.prop('alt')).toContain(DEFAULT_OS);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
describe('Initial State', () => {
|
|
143
|
-
it('should initialize with default OS, browser, and state', () => {
|
|
144
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
145
|
-
const controls = wrapper.find(PreviewControls);
|
|
146
|
-
expect(controls.prop('selectedOS')).toBe(DEFAULT_OS);
|
|
147
|
-
expect(controls.prop('selectedBrowser')).toBe(DEFAULT_BROWSER);
|
|
148
|
-
expect(controls.prop('selectedState')).toBe(DEFAULT_STATE);
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
describe('OS Selection and Browser Options', () => {
|
|
153
|
-
it('should update OS when handleOSChange is called', () => {
|
|
154
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
155
|
-
const controls = wrapper.find(PreviewControls);
|
|
156
|
-
|
|
157
|
-
// Simulate OS change
|
|
158
|
-
act(() => {
|
|
159
|
-
controls.prop('onOSChange')(OS_WINDOWS);
|
|
160
|
-
});
|
|
161
|
-
wrapper.update();
|
|
162
|
-
|
|
163
|
-
const updatedControls = wrapper.find(PreviewControls);
|
|
164
|
-
expect(updatedControls.prop('selectedOS')).toBe(OS_WINDOWS);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('should filter browser options based on selected OS', () => {
|
|
168
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
169
|
-
|
|
170
|
-
// macOS should have all browsers including Safari
|
|
171
|
-
act(() => {
|
|
172
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
173
|
-
});
|
|
174
|
-
wrapper.update();
|
|
175
|
-
let browserOptions = wrapper.find(PreviewControls).prop('browserOptions');
|
|
176
|
-
expect(browserOptions.some(opt => opt.value === BROWSER_SAFARI)).toBe(true);
|
|
177
|
-
|
|
178
|
-
// Windows should not have Safari
|
|
179
|
-
act(() => {
|
|
180
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_WINDOWS);
|
|
181
|
-
});
|
|
182
|
-
wrapper.update();
|
|
183
|
-
browserOptions = wrapper.find(PreviewControls).prop('browserOptions');
|
|
184
|
-
expect(browserOptions.some(opt => opt.value === BROWSER_SAFARI)).toBe(false);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('should coerce browser when OS changes to unsupported browser', () => {
|
|
188
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
189
|
-
|
|
190
|
-
// Start with macOS and Safari
|
|
191
|
-
act(() => {
|
|
192
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
193
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_SAFARI);
|
|
194
|
-
});
|
|
195
|
-
wrapper.update();
|
|
196
|
-
expect(wrapper.find(PreviewControls).prop('selectedBrowser')).toBe(BROWSER_SAFARI);
|
|
197
|
-
|
|
198
|
-
// Change to Windows (Safari not supported)
|
|
199
|
-
act(() => {
|
|
200
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_WINDOWS);
|
|
201
|
-
});
|
|
202
|
-
wrapper.update();
|
|
203
|
-
|
|
204
|
-
// Browser should be coerced to first available option (Chrome)
|
|
205
|
-
const browserOptions = getBrowserOptionsForOS(OS_WINDOWS);
|
|
206
|
-
expect(wrapper.find(PreviewControls).prop('selectedBrowser')).toBe(browserOptions[0].value);
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it('should handle OS change for iOS', () => {
|
|
210
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
211
|
-
act(() => {
|
|
212
|
-
|
|
213
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IOS);
|
|
214
|
-
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
wrapper.update();
|
|
218
|
-
expect(wrapper.find(PreviewControls).prop('selectedOS')).toBe(OS_IOS);
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
it('should handle OS change for iPadOS', () => {
|
|
222
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
223
|
-
act(() => {
|
|
224
|
-
|
|
225
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IPADOS);
|
|
226
|
-
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
wrapper.update();
|
|
230
|
-
expect(wrapper.find(PreviewControls).prop('selectedOS')).toBe(OS_IPADOS);
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
it('should handle OS change for Android Mobile', () => {
|
|
234
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
235
|
-
act(() => {
|
|
236
|
-
|
|
237
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_ANDROID_MOBILE);
|
|
238
|
-
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
wrapper.update();
|
|
242
|
-
expect(wrapper.find(PreviewControls).prop('selectedOS')).toBe(OS_ANDROID_MOBILE);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
it('should handle OS change for Android Tablet', () => {
|
|
246
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
247
|
-
act(() => {
|
|
248
|
-
|
|
249
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_ANDROID_TABLET);
|
|
250
|
-
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
wrapper.update();
|
|
254
|
-
expect(wrapper.find(PreviewControls).prop('selectedOS')).toBe(OS_ANDROID_TABLET);
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
describe('Browser Selection', () => {
|
|
259
|
-
it('should update browser when handleBrowserChange is called', () => {
|
|
260
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
261
|
-
const controls = wrapper.find(PreviewControls);
|
|
262
|
-
|
|
263
|
-
act(() => {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
controls.prop('onBrowserChange')(BROWSER_FIREFOX);
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
wrapper.update();
|
|
273
|
-
|
|
274
|
-
const updatedControls = wrapper.find(PreviewControls);
|
|
275
|
-
expect(updatedControls.prop('selectedBrowser')).toBe(BROWSER_FIREFOX);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
it('should handle browser change for Chrome', () => {
|
|
279
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
280
|
-
act(() => {
|
|
281
|
-
|
|
282
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
283
|
-
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
wrapper.update();
|
|
287
|
-
expect(wrapper.find(PreviewControls).prop('selectedBrowser')).toBe(BROWSER_CHROME);
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
it('should handle browser change for Firefox', () => {
|
|
291
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
292
|
-
act(() => {
|
|
293
|
-
|
|
294
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_FIREFOX);
|
|
295
|
-
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
wrapper.update();
|
|
299
|
-
expect(wrapper.find(PreviewControls).prop('selectedBrowser')).toBe(BROWSER_FIREFOX);
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
it('should handle browser change for Edge', () => {
|
|
303
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
304
|
-
act(() => {
|
|
305
|
-
|
|
306
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_EDGE);
|
|
307
|
-
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
wrapper.update();
|
|
311
|
-
expect(wrapper.find(PreviewControls).prop('selectedBrowser')).toBe(BROWSER_EDGE);
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('should handle browser change for Opera', () => {
|
|
315
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
316
|
-
act(() => {
|
|
317
|
-
|
|
318
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_OPERA);
|
|
319
|
-
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
wrapper.update();
|
|
323
|
-
expect(wrapper.find(PreviewControls).prop('selectedBrowser')).toBe(BROWSER_OPERA);
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
describe('State Selection and Coercion', () => {
|
|
328
|
-
it('should update state when handleStateChange is called', () => {
|
|
329
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
330
|
-
const controls = wrapper.find(PreviewControls);
|
|
331
|
-
|
|
332
|
-
// Set up macOS Chrome which supports Expanded
|
|
333
|
-
act(() => {
|
|
334
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
335
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
336
|
-
});
|
|
337
|
-
wrapper.update();
|
|
338
|
-
|
|
339
|
-
act(() => {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
controls.prop('onStateChange')(NOTIFICATION_STATE_EXPANDED);
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
wrapper.update();
|
|
349
|
-
|
|
350
|
-
const updatedControls = wrapper.find(PreviewControls);
|
|
351
|
-
expect(updatedControls.prop('selectedState')).toBe(NOTIFICATION_STATE_EXPANDED);
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
it('should coerce state when OS/Browser combination does not support current state', () => {
|
|
355
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
356
|
-
|
|
357
|
-
// Set up macOS Chrome with Expanded state
|
|
358
|
-
act(() => {
|
|
359
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
360
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
361
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_EXPANDED);
|
|
362
|
-
});
|
|
363
|
-
wrapper.update();
|
|
364
|
-
expect(wrapper.find(PreviewControls).prop('selectedState')).toBe(NOTIFICATION_STATE_EXPANDED);
|
|
365
|
-
|
|
366
|
-
// Change to iOS Chrome which only supports Collapsed
|
|
367
|
-
act(() => {
|
|
368
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IOS);
|
|
369
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
370
|
-
});
|
|
371
|
-
wrapper.update();
|
|
372
|
-
|
|
373
|
-
// State should be coerced to Collapsed
|
|
374
|
-
expect(wrapper.find(PreviewControls).prop('selectedState')).toBe(NOTIFICATION_STATE_COLLAPSED);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
it('should filter state options based on OS/Browser combination', () => {
|
|
378
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
379
|
-
|
|
380
|
-
// macOS Chrome supports both Collapsed and Expanded
|
|
381
|
-
act(() => {
|
|
382
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
383
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
384
|
-
});
|
|
385
|
-
wrapper.update();
|
|
386
|
-
let stateOptions = wrapper.find(PreviewControls).prop('stateOptions');
|
|
387
|
-
expect(stateOptions.length).toBeGreaterThanOrEqual(1);
|
|
388
|
-
expect(stateOptions.some(opt => opt.value === NOTIFICATION_STATE_COLLAPSED)).toBe(true);
|
|
389
|
-
|
|
390
|
-
// iOS Chrome only supports Collapsed
|
|
391
|
-
act(() => {
|
|
392
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IOS);
|
|
393
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
394
|
-
});
|
|
395
|
-
wrapper.update();
|
|
396
|
-
stateOptions = wrapper.find(PreviewControls).prop('stateOptions');
|
|
397
|
-
expect(stateOptions.some(opt => opt.value === NOTIFICATION_STATE_COLLAPSED)).toBe(true);
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
describe('Device Frame Asset Selection', () => {
|
|
402
|
-
it('should use topSvg for macOS', () => {
|
|
403
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
404
|
-
act(() => {
|
|
405
|
-
|
|
406
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
407
|
-
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
wrapper.update();
|
|
411
|
-
|
|
412
|
-
const frameImage = wrapper.find('.device-frame');
|
|
413
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
414
|
-
expect(frameImage.prop('alt')).toContain(OS_MACOS);
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
it('should use topSvg for Windows', () => {
|
|
418
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
419
|
-
act(() => {
|
|
420
|
-
|
|
421
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_WINDOWS);
|
|
422
|
-
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
wrapper.update();
|
|
426
|
-
|
|
427
|
-
const frameImage = wrapper.find('.device-frame');
|
|
428
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
429
|
-
expect(frameImage.prop('alt')).toContain(OS_WINDOWS);
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
it('should use iosSvg for iOS', () => {
|
|
433
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
434
|
-
act(() => {
|
|
435
|
-
|
|
436
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IOS);
|
|
437
|
-
|
|
438
|
-
});
|
|
439
|
-
|
|
440
|
-
wrapper.update();
|
|
441
|
-
|
|
442
|
-
const frameImage = wrapper.find('.device-frame');
|
|
443
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
444
|
-
expect(frameImage.prop('alt')).toContain(OS_IOS);
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
it('should use iosSvg for Android Mobile', () => {
|
|
448
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
449
|
-
act(() => {
|
|
450
|
-
|
|
451
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_ANDROID_MOBILE);
|
|
452
|
-
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
wrapper.update();
|
|
456
|
-
|
|
457
|
-
const frameImage = wrapper.find('.device-frame');
|
|
458
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
459
|
-
expect(frameImage.prop('alt')).toContain(OS_ANDROID_MOBILE);
|
|
460
|
-
});
|
|
461
|
-
|
|
462
|
-
it('should use lightSvg for iPadOS', () => {
|
|
463
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
464
|
-
act(() => {
|
|
465
|
-
|
|
466
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IPADOS);
|
|
467
|
-
|
|
468
|
-
});
|
|
469
|
-
|
|
470
|
-
wrapper.update();
|
|
471
|
-
|
|
472
|
-
const frameImage = wrapper.find('.device-frame');
|
|
473
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
474
|
-
expect(frameImage.prop('alt')).toContain(OS_IPADOS);
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
it('should use lightSvg for Android Tablet', () => {
|
|
478
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
479
|
-
act(() => {
|
|
480
|
-
|
|
481
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_ANDROID_TABLET);
|
|
482
|
-
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
wrapper.update();
|
|
486
|
-
|
|
487
|
-
const frameImage = wrapper.find('.device-frame');
|
|
488
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
489
|
-
expect(frameImage.prop('alt')).toContain(OS_ANDROID_TABLET);
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
it('should fallback to topSvg for unknown OS', () => {
|
|
493
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
494
|
-
// Force an unknown OS by directly calling the handler with invalid value
|
|
495
|
-
// This tests the fallback in DEVICE_ASSET_MAP
|
|
496
|
-
const frameImage = wrapper.find('.device-frame');
|
|
497
|
-
expect(frameImage.prop('src')).toBeDefined();
|
|
498
|
-
});
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
describe('Notification Position Calculation', () => {
|
|
502
|
-
it('should calculate position from variant configuration for macOS Chrome Collapsed', () => {
|
|
503
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
504
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
505
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
506
|
-
act(() => {
|
|
507
|
-
|
|
508
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_COLLAPSED);
|
|
509
|
-
|
|
510
|
-
});
|
|
511
|
-
|
|
512
|
-
wrapper.update();
|
|
513
|
-
|
|
514
|
-
const resolvedVariant = getResolvedVariant(OS_MACOS, BROWSER_CHROME, NOTIFICATION_STATE_COLLAPSED);
|
|
515
|
-
const expectedPosition = resolvedVariant?.stateConfig?.position?.custom || { x: 0, y: 0 };
|
|
516
|
-
|
|
517
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
518
|
-
const style = notificationWrapper.prop('style');
|
|
519
|
-
expect(style.left).toBe(`${expectedPosition.x}px`);
|
|
520
|
-
expect(style.top).toBe(`${expectedPosition.y}px`);
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
it('should calculate position from variant configuration for macOS Chrome Expanded', () => {
|
|
524
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
525
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
526
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
527
|
-
act(() => {
|
|
528
|
-
|
|
529
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_EXPANDED);
|
|
530
|
-
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
wrapper.update();
|
|
534
|
-
|
|
535
|
-
const resolvedVariant = getResolvedVariant(OS_MACOS, BROWSER_CHROME, NOTIFICATION_STATE_EXPANDED);
|
|
536
|
-
const expectedPosition = resolvedVariant?.stateConfig?.position?.custom || { x: 0, y: 0 };
|
|
537
|
-
|
|
538
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
539
|
-
const style = notificationWrapper.prop('style');
|
|
540
|
-
expect(style.left).toBe(`${expectedPosition.x}px`);
|
|
541
|
-
expect(style.top).toBe(`${expectedPosition.y}px`);
|
|
542
|
-
});
|
|
543
|
-
|
|
544
|
-
it('should calculate position with bottom property for Windows Chrome', () => {
|
|
545
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
546
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_WINDOWS);
|
|
547
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
548
|
-
act(() => {
|
|
549
|
-
|
|
550
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_COLLAPSED);
|
|
551
|
-
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
wrapper.update();
|
|
555
|
-
|
|
556
|
-
const resolvedVariant = getResolvedVariant(OS_WINDOWS, BROWSER_CHROME, NOTIFICATION_STATE_COLLAPSED);
|
|
557
|
-
const expectedPosition = resolvedVariant?.stateConfig?.position?.custom || { x: 0, y: 0 };
|
|
558
|
-
|
|
559
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
560
|
-
const style = notificationWrapper.prop('style');
|
|
561
|
-
expect(style.left).toBe(`${expectedPosition.x}px`);
|
|
562
|
-
if (expectedPosition.bottom !== undefined) {
|
|
563
|
-
expect(style.bottom).toBe(`${expectedPosition.bottom}px`);
|
|
564
|
-
expect(style.top).toBeUndefined();
|
|
565
|
-
} else {
|
|
566
|
-
expect(style.top).toBe(`${expectedPosition.y || 0}px`);
|
|
567
|
-
}
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
it('should use fallback position (0, 0) when variant has no position config', () => {
|
|
571
|
-
// This tests the fallback when position.custom is not defined
|
|
572
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
573
|
-
|
|
574
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
575
|
-
const style = notificationWrapper.prop('style');
|
|
576
|
-
expect(style.left).toBeDefined();
|
|
577
|
-
expect(style.top !== undefined || style.bottom !== undefined).toBe(true);
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
it('should update position when OS changes', () => {
|
|
581
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
582
|
-
|
|
583
|
-
// macOS Chrome position
|
|
584
|
-
act(() => {
|
|
585
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
586
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
587
|
-
});
|
|
588
|
-
wrapper.update();
|
|
589
|
-
const position1 = wrapper.find('.device-notification-wrapper').prop('style');
|
|
590
|
-
|
|
591
|
-
// Windows Chrome position (uses bottom instead of top)
|
|
592
|
-
act(() => {
|
|
593
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_WINDOWS);
|
|
594
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
595
|
-
});
|
|
596
|
-
wrapper.update();
|
|
597
|
-
const position2 = wrapper.find('.device-notification-wrapper').prop('style');
|
|
598
|
-
|
|
599
|
-
// Both should have valid positions calculated
|
|
600
|
-
expect(position1.left).toBeDefined();
|
|
601
|
-
expect(position2.left).toBeDefined();
|
|
602
|
-
// Windows uses bottom positioning, macOS uses top - verify the difference
|
|
603
|
-
expect(position1.top !== undefined || position1.bottom !== undefined).toBe(true);
|
|
604
|
-
expect(position2.top !== undefined || position2.bottom !== undefined).toBe(true);
|
|
605
|
-
// macOS should use top, Windows should use bottom
|
|
606
|
-
const resolvedVariant1 = getResolvedVariant(OS_MACOS, BROWSER_CHROME, NOTIFICATION_STATE_COLLAPSED);
|
|
607
|
-
const resolvedVariant2 = getResolvedVariant(OS_WINDOWS, BROWSER_CHROME, NOTIFICATION_STATE_COLLAPSED);
|
|
608
|
-
if (resolvedVariant1?.stateConfig?.position?.custom?.bottom === undefined &&
|
|
609
|
-
resolvedVariant2?.stateConfig?.position?.custom?.bottom !== undefined) {
|
|
610
|
-
// macOS uses top, Windows uses bottom
|
|
611
|
-
expect(position1.top).toBeDefined();
|
|
612
|
-
expect(position2.bottom).toBeDefined();
|
|
613
|
-
}
|
|
614
|
-
});
|
|
615
|
-
|
|
616
|
-
it('should update position when browser changes', () => {
|
|
617
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
618
|
-
|
|
619
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
620
|
-
act(() => {
|
|
621
|
-
|
|
622
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
623
|
-
|
|
624
|
-
});
|
|
625
|
-
|
|
626
|
-
wrapper.update();
|
|
627
|
-
const position1 = wrapper.find('.device-notification-wrapper').prop('style');
|
|
628
|
-
|
|
629
|
-
act(() => {
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_FIREFOX);
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
});
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
wrapper.update();
|
|
639
|
-
const position2 = wrapper.find('.device-notification-wrapper').prop('style');
|
|
640
|
-
|
|
641
|
-
// Both should have valid positions
|
|
642
|
-
expect(position1.left).toBeDefined();
|
|
643
|
-
expect(position2.left).toBeDefined();
|
|
644
|
-
});
|
|
645
|
-
|
|
646
|
-
it('should update position when state changes', () => {
|
|
647
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
648
|
-
|
|
649
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
650
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
651
|
-
act(() => {
|
|
652
|
-
|
|
653
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_COLLAPSED);
|
|
654
|
-
|
|
655
|
-
});
|
|
656
|
-
|
|
657
|
-
wrapper.update();
|
|
658
|
-
const position1 = wrapper.find('.device-notification-wrapper').prop('style');
|
|
659
|
-
|
|
660
|
-
act(() => {
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_EXPANDED);
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
});
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
wrapper.update();
|
|
670
|
-
const position2 = wrapper.find('.device-notification-wrapper').prop('style');
|
|
671
|
-
|
|
672
|
-
// Both should have valid positions
|
|
673
|
-
expect(position1.left).toBeDefined();
|
|
674
|
-
expect(position2.left).toBeDefined();
|
|
675
|
-
});
|
|
676
|
-
});
|
|
677
|
-
|
|
678
|
-
describe('NotificationContainer Rendering', () => {
|
|
679
|
-
it('should render NotificationContainer when variant is resolved', () => {
|
|
680
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
681
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
682
|
-
act(() => {
|
|
683
|
-
|
|
684
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
685
|
-
|
|
686
|
-
});
|
|
687
|
-
|
|
688
|
-
wrapper.update();
|
|
689
|
-
|
|
690
|
-
const notificationContainer = wrapper.find(NotificationContainer);
|
|
691
|
-
expect(notificationContainer.exists()).toBe(true);
|
|
692
|
-
});
|
|
693
|
-
|
|
694
|
-
it('should not render NotificationContainer when variant is not resolved', () => {
|
|
695
|
-
// Use an unsupported combination if any exists
|
|
696
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
697
|
-
|
|
698
|
-
// Check that NotificationContainer is rendered for default (macOS Chrome)
|
|
699
|
-
const notificationContainer = wrapper.find(NotificationContainer);
|
|
700
|
-
expect(notificationContainer.exists()).toBe(true);
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
it('should pass correct props to NotificationContainer', () => {
|
|
704
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
705
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
706
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
707
|
-
act(() => {
|
|
708
|
-
|
|
709
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_COLLAPSED);
|
|
710
|
-
|
|
711
|
-
});
|
|
712
|
-
|
|
713
|
-
wrapper.update();
|
|
714
|
-
|
|
715
|
-
const notificationContainer = wrapper.find(NotificationContainer);
|
|
716
|
-
expect(notificationContainer.prop('notificationTitle')).toBe(defaultProps.notificationTitle);
|
|
717
|
-
expect(notificationContainer.prop('notificationBody')).toBe(defaultProps.notificationBody);
|
|
718
|
-
expect(notificationContainer.prop('url')).toBe(defaultProps.url);
|
|
719
|
-
expect(notificationContainer.prop('selectedOS')).toBe(OS_MACOS);
|
|
720
|
-
expect(notificationContainer.prop('selectedBrowser')).toBe(BROWSER_CHROME);
|
|
721
|
-
expect(notificationContainer.prop('imageSrc')).toBe(defaultProps.imageSrc);
|
|
722
|
-
expect(notificationContainer.prop('brandIconSrc')).toBe(defaultProps.brandIconSrc);
|
|
723
|
-
});
|
|
724
|
-
|
|
725
|
-
it('should pass resolved variant state to NotificationContainer', () => {
|
|
726
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
727
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
728
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
729
|
-
act(() => {
|
|
730
|
-
|
|
731
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_COLLAPSED);
|
|
732
|
-
|
|
733
|
-
});
|
|
734
|
-
|
|
735
|
-
wrapper.update();
|
|
736
|
-
|
|
737
|
-
const resolvedVariant = getResolvedVariant(OS_MACOS, BROWSER_CHROME, NOTIFICATION_STATE_COLLAPSED);
|
|
738
|
-
const notificationContainer = wrapper.find(NotificationContainer);
|
|
739
|
-
|
|
740
|
-
expect(notificationContainer.prop('notificationState')).toBe(resolvedVariant.stateKey);
|
|
741
|
-
expect(notificationContainer.prop('icon')).toBe(resolvedVariant.variant.icon);
|
|
742
|
-
expect(notificationContainer.prop('supportsExpanded')).toBe(resolvedVariant.stateConfig.supportsExpanded);
|
|
743
|
-
expect(notificationContainer.prop('enableMedia')).toBe(resolvedVariant.stateConfig.showMedia);
|
|
744
|
-
expect(notificationContainer.prop('enableCtas')).toBe(false);
|
|
745
|
-
expect(notificationContainer.prop('className')).toBe(resolvedVariant.variant.notificationClassName);
|
|
746
|
-
});
|
|
747
|
-
});
|
|
748
|
-
|
|
749
|
-
describe('Combined OS/Browser/State Combinations', () => {
|
|
750
|
-
const testCombinations = [
|
|
751
|
-
{ os: OS_MACOS, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_COLLAPSED },
|
|
752
|
-
{ os: OS_MACOS, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_EXPANDED },
|
|
753
|
-
{ os: OS_MACOS, browser: BROWSER_FIREFOX, state: NOTIFICATION_STATE_COLLAPSED },
|
|
754
|
-
{ os: OS_MACOS, browser: BROWSER_SAFARI, state: NOTIFICATION_STATE_COLLAPSED },
|
|
755
|
-
{ os: OS_WINDOWS, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_COLLAPSED },
|
|
756
|
-
{ os: OS_WINDOWS, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_EXPANDED },
|
|
757
|
-
{ os: OS_IOS, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_COLLAPSED },
|
|
758
|
-
{ os: OS_IOS, browser: BROWSER_SAFARI, state: NOTIFICATION_STATE_COLLAPSED },
|
|
759
|
-
{ os: OS_ANDROID_MOBILE, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_COLLAPSED },
|
|
760
|
-
{ os: OS_ANDROID_MOBILE, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_EXPANDED },
|
|
761
|
-
{ os: OS_IPADOS, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_COLLAPSED },
|
|
762
|
-
{ os: OS_ANDROID_TABLET, browser: BROWSER_CHROME, state: NOTIFICATION_STATE_COLLAPSED },
|
|
763
|
-
];
|
|
764
|
-
|
|
765
|
-
testCombinations.forEach(({ os, browser, state }) => {
|
|
766
|
-
it(`should handle ${os} + ${browser} + ${state} combination`, () => {
|
|
767
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
768
|
-
|
|
769
|
-
wrapper.find(PreviewControls).prop('onOSChange')(os);
|
|
770
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(browser);
|
|
771
|
-
act(() => {
|
|
772
|
-
|
|
773
|
-
wrapper.find(PreviewControls).prop('onStateChange')(state);
|
|
774
|
-
|
|
775
|
-
});
|
|
776
|
-
|
|
777
|
-
wrapper.update();
|
|
778
|
-
|
|
779
|
-
const controls = wrapper.find(PreviewControls);
|
|
780
|
-
expect(controls.prop('selectedOS')).toBe(os);
|
|
781
|
-
expect(controls.prop('selectedBrowser')).toBe(browser);
|
|
782
|
-
|
|
783
|
-
// State might be coerced if not supported
|
|
784
|
-
const supportedStates = getSupportedStates(os, browser);
|
|
785
|
-
if (supportedStates.includes(state)) {
|
|
786
|
-
expect(controls.prop('selectedState')).toBe(state);
|
|
787
|
-
} else {
|
|
788
|
-
expect(supportedStates).toContain(controls.prop('selectedState'));
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
// Position should be calculated
|
|
792
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
793
|
-
expect(notificationWrapper.exists()).toBe(true);
|
|
794
|
-
const style = notificationWrapper.prop('style');
|
|
795
|
-
expect(style).toBeDefined();
|
|
796
|
-
expect(style.position).toBe('absolute');
|
|
797
|
-
expect(style.left).toBeDefined();
|
|
798
|
-
});
|
|
799
|
-
});
|
|
800
|
-
});
|
|
801
|
-
|
|
802
|
-
describe('CSS Classes and Styling', () => {
|
|
803
|
-
it('should apply preview-unavailable class when variant is not resolved', () => {
|
|
804
|
-
// This would require an unsupported combination
|
|
805
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
806
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
807
|
-
|
|
808
|
-
// For default macOS Chrome, variant should be resolved
|
|
809
|
-
const resolvedVariant = getResolvedVariant(DEFAULT_OS, DEFAULT_BROWSER, DEFAULT_STATE);
|
|
810
|
-
if (resolvedVariant) {
|
|
811
|
-
expect(notificationWrapper.hasClass('preview-unavailable')).toBe(false);
|
|
812
|
-
}
|
|
813
|
-
});
|
|
814
|
-
|
|
815
|
-
it('should apply correct z-index to notification wrapper', () => {
|
|
816
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
817
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
818
|
-
const style = notificationWrapper.prop('style');
|
|
819
|
-
expect(style.zIndex).toBe(10);
|
|
820
|
-
});
|
|
821
|
-
|
|
822
|
-
it('should apply absolute positioning to notification wrapper', () => {
|
|
823
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
824
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
825
|
-
const style = notificationWrapper.prop('style');
|
|
826
|
-
expect(style.position).toBe('absolute');
|
|
827
|
-
});
|
|
828
|
-
});
|
|
829
|
-
|
|
830
|
-
describe('Edge Cases', () => {
|
|
831
|
-
it('should handle empty notification title and body', () => {
|
|
832
|
-
const wrapper = mountWithIntl(
|
|
833
|
-
<DevicePreviewContent
|
|
834
|
-
notificationTitle=""
|
|
835
|
-
notificationBody=""
|
|
836
|
-
url=""
|
|
837
|
-
/>
|
|
838
|
-
);
|
|
839
|
-
expect(wrapper.exists()).toBe(true);
|
|
840
|
-
const notificationContainer = wrapper.find(NotificationContainer);
|
|
841
|
-
expect(notificationContainer.prop('notificationTitle')).toBe('');
|
|
842
|
-
expect(notificationContainer.prop('notificationBody')).toBe('');
|
|
843
|
-
});
|
|
844
|
-
|
|
845
|
-
it('should handle missing imageSrc and brandIconSrc', () => {
|
|
846
|
-
const wrapper = mountWithIntl(
|
|
847
|
-
<DevicePreviewContent
|
|
848
|
-
notificationTitle="Test"
|
|
849
|
-
notificationBody="Test"
|
|
850
|
-
url="https://example.com"
|
|
851
|
-
/>
|
|
852
|
-
);
|
|
853
|
-
const notificationContainer = wrapper.find(NotificationContainer);
|
|
854
|
-
expect(notificationContainer.prop('imageSrc')).toBe('');
|
|
855
|
-
expect(notificationContainer.prop('brandIconSrc')).toBe('');
|
|
856
|
-
});
|
|
857
|
-
|
|
858
|
-
it('should handle rapid OS/Browser/State changes', () => {
|
|
859
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
860
|
-
|
|
861
|
-
// Rapidly change combinations
|
|
862
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_MACOS);
|
|
863
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_CHROME);
|
|
864
|
-
act(() => {
|
|
865
|
-
|
|
866
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_EXPANDED);
|
|
867
|
-
|
|
868
|
-
});
|
|
869
|
-
|
|
870
|
-
wrapper.update();
|
|
871
|
-
|
|
872
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_WINDOWS);
|
|
873
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_FIREFOX);
|
|
874
|
-
act(() => {
|
|
875
|
-
|
|
876
|
-
wrapper.find(PreviewControls).prop('onStateChange')(NOTIFICATION_STATE_COLLAPSED);
|
|
877
|
-
|
|
878
|
-
});
|
|
879
|
-
|
|
880
|
-
wrapper.update();
|
|
881
|
-
|
|
882
|
-
wrapper.find(PreviewControls).prop('onOSChange')(OS_IOS);
|
|
883
|
-
act(() => {
|
|
884
|
-
|
|
885
|
-
wrapper.find(PreviewControls).prop('onBrowserChange')(BROWSER_SAFARI);
|
|
886
|
-
|
|
887
|
-
});
|
|
888
|
-
|
|
889
|
-
wrapper.update();
|
|
890
|
-
|
|
891
|
-
const controls = wrapper.find(PreviewControls);
|
|
892
|
-
expect(controls.prop('selectedOS')).toBe(OS_IOS);
|
|
893
|
-
expect(controls.prop('selectedBrowser')).toBe(BROWSER_SAFARI);
|
|
894
|
-
});
|
|
895
|
-
});
|
|
896
|
-
|
|
897
|
-
describe('Refs and DOM Elements', () => {
|
|
898
|
-
it('should create refs for device frame and notification', () => {
|
|
899
|
-
const wrapper = mountWithIntl(<DevicePreviewContent {...defaultProps} />);
|
|
900
|
-
|
|
901
|
-
const deviceFrame = wrapper.find('.device-frame');
|
|
902
|
-
expect(deviceFrame.exists()).toBe(true);
|
|
903
|
-
|
|
904
|
-
const notificationWrapper = wrapper.find('.device-notification-wrapper');
|
|
905
|
-
expect(notificationWrapper.exists()).toBe(true);
|
|
906
|
-
});
|
|
907
|
-
});
|
|
908
|
-
});
|
|
909
|
-
|