@applicaster/zapp-react-native-utils 16.0.0-alpha.2663208063 → 16.0.0-alpha.2710214351

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/actionUtils/index.ts +3 -1
  2. package/actionsExecutor/ActionExecutor.ts +10 -1
  3. package/actionsExecutor/ActionExecutorContext.tsx +29 -1
  4. package/actionsExecutor/__tests__/ActionExecutor.test.ts +71 -0
  5. package/actionsExecutor/__tests__/StorageActions.test.ts +98 -0
  6. package/actionsExecutor/__tests__/feedDecorator.test.ts +91 -0
  7. package/actionsExecutor/__tests__/screenToggleFlag.test.ts +90 -0
  8. package/actionsExecutor/actions/__tests__/dismissBottomSheet.test.ts +3 -0
  9. package/actionsExecutor/actions/__tests__/goBack.test.ts +62 -0
  10. package/actionsExecutor/actions/__tests__/goHome.test.ts +19 -0
  11. package/actionsExecutor/actions/__tests__/navigateToScreen.test.ts +267 -0
  12. package/actionsExecutor/actions/__tests__/openBottomSheet.customContent.test.ts +24 -0
  13. package/actionsExecutor/actions/__tests__/openBottomSheet.inlineItems.test.ts +273 -1
  14. package/actionsExecutor/actions/__tests__/presentScreen.test.ts +127 -0
  15. package/actionsExecutor/actions/__tests__/showAlert.test.ts +49 -0
  16. package/actionsExecutor/actions/__tests__/showToast.test.ts +2 -2
  17. package/actionsExecutor/actions/dismissBottomSheet.ts +2 -1
  18. package/actionsExecutor/actions/goBack.ts +60 -0
  19. package/actionsExecutor/actions/goHome.ts +31 -0
  20. package/actionsExecutor/actions/index.ts +8 -0
  21. package/actionsExecutor/actions/navigateToScreen.ts +43 -45
  22. package/actionsExecutor/actions/openBottomSheet.ts +36 -16
  23. package/actionsExecutor/actions/presentScreen.ts +78 -0
  24. package/actionsExecutor/actions/screenToggleFlag.ts +1 -3
  25. package/actionsExecutor/actions/showAlert.ts +51 -0
  26. package/actionsExecutor/actions/showToast.ts +2 -2
  27. package/actionsExecutor/consts.ts +4 -0
  28. package/actionsExecutor/feedDecorator.ts +12 -6
  29. package/appUtils/contextKeysManager/__tests__/getKey/failure.test.ts +1 -22
  30. package/appUtils/contextKeysManager/__tests__/getKey/success/fullSearch.test.ts +1 -25
  31. package/appUtils/contextKeysManager/__tests__/getKey/success/searchInSecure.test.ts +1 -7
  32. package/appUtils/contextKeysManager/__tests__/removeKey/failure.test.ts +0 -25
  33. package/appUtils/contextKeysManager/__tests__/removeKey/success.test.ts +0 -6
  34. package/appUtils/contextKeysManager/__tests__/setKey/failure/failedToSaveInStorage.test.ts +0 -40
  35. package/appUtils/contextKeysManager/__tests__/setKey/{success/saveItemAndReference.test.ts → success.test.ts} +2 -42
  36. package/appUtils/contextKeysManager/index.ts +28 -129
  37. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +4 -11
  38. package/appUtils/playerManager/OverlayObserver/__tests__/getUpcomingQueue.test.ts +67 -0
  39. package/appUtils/playerManager/OverlayObserver/__tests__/utils.test.ts +9 -2
  40. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.android.tv.ts +4 -1
  41. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ios.tv.ts +4 -1
  42. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.ts +21 -2
  43. package/appUtils/playerManager/OverlayObserver/getUpcomingQueue.web.ts +4 -1
  44. package/appUtils/playerManager/OverlayObserver/utils.ts +9 -7
  45. package/appUtils/playerManager/__tests__/playerDiagnostics.test.ts +62 -0
  46. package/appUtils/playerManager/__tests__/playerNative.test.ts +114 -0
  47. package/appUtils/playerManager/__tests__/playerNativeCommand.test.ts +62 -0
  48. package/appUtils/playerManager/__tests__/playerToolbox.test.ts +281 -0
  49. package/appUtils/playerManager/__tests__/usePlayerControllerSetup.test.tsx +62 -0
  50. package/appUtils/playerManager/const.ts +13 -0
  51. package/appUtils/playerManager/index.ts +7 -0
  52. package/appUtils/playerManager/player.ts +25 -0
  53. package/appUtils/playerManager/playerNative.ts +27 -3
  54. package/appUtils/playerManager/playerNativeCommand.ts +3 -6
  55. package/appUtils/playerManager/playerToolbox.ts +196 -0
  56. package/appUtils/playerManager/usePlayerControllerSetup.tsx +6 -0
  57. package/arrayUtils/__tests__/reorderByIds.test.ts +13 -0
  58. package/arrayUtils/index.ts +26 -43
  59. package/cellUtils/__tests__/getButtonsEnabled.test.ts +28 -0
  60. package/cellUtils/__tests__/getCellNavigationEnabled.test.ts +36 -0
  61. package/cellUtils/__tests__/getIsCellNavigationEnabled.test.ts +35 -0
  62. package/cellUtils/__tests__/isCellNavigationEnabled.test.ts +21 -0
  63. package/cellUtils/index.ts +70 -3
  64. package/configurationUtils/__tests__/manifestKeyParser.test.ts +21 -0
  65. package/configurationUtils/__tests__/modalBlocksParser.test.ts +297 -1
  66. package/configurationUtils/manifestKeyParser.ts +12 -1
  67. package/configurationUtils/modalBlocksParser.ts +78 -4
  68. package/entryActions/__tests__/buildEntryActions.test.ts +235 -0
  69. package/entryActions/aliasPresentation.ts +108 -0
  70. package/entryActions/buildEntryActions.ts +167 -0
  71. package/entryActions/index.ts +15 -0
  72. package/entryActions/types.ts +39 -0
  73. package/focusManager/FocusManager.ts +26 -0
  74. package/focusManager/__tests__/FocusManager.test.ts +9 -0
  75. package/localizationUtils/index.ts +12 -6
  76. package/logger/__tests__/xrayToolbox.test.ts +69 -0
  77. package/logger/xrayToolbox.ts +67 -0
  78. package/manifestUtils/_internals/index.js +8 -3
  79. package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
  80. package/manifestUtils/defaultManifestConfigurations/player.js +30 -1
  81. package/manifestUtils/keys.js +7 -2
  82. package/manifestUtils/mobileAction/container/__tests__/mobileActionButtonsContainer.test.js +21 -0
  83. package/manifestUtils/mobileAction/groups/__tests__/buildMobileActionButtonGroups.test.js +1 -1
  84. package/manifestUtils/mobileAction/groups/defaults.js +2 -1
  85. package/modalState/ModalOrchestrator.ts +23 -9
  86. package/modalState/RemoteEditableCollection.ts +9 -1
  87. package/modalState/__tests__/ModalOrchestrator.phase3.test.ts +39 -0
  88. package/modalState/__tests__/RemoteEditableCollection.test.ts +90 -1
  89. package/modalState/__tests__/index.test.ts +30 -1
  90. package/modalState/__tests__/useModalStoreState.test.ts +142 -0
  91. package/modalState/index.ts +8 -1
  92. package/modalState/store.ts +9 -2
  93. package/modalState/types.ts +42 -2
  94. package/modalState/useBottomSheetContent.ts +24 -17
  95. package/navigationUtils/xrayNavigator.ts +12 -0
  96. package/package.json +3 -2
  97. package/playerUtils/__tests__/resolvePlayerActions.test.ts +138 -0
  98. package/playerUtils/index.ts +17 -1
  99. package/playerUtils/resolvePlayerActions.ts +71 -0
  100. package/pluginUtils/__tests__/pluginUtils.test.js +32 -0
  101. package/pluginUtils/index.ts +29 -0
  102. package/quickBrickAssets/__tests__/index.test.ts +18 -0
  103. package/quickBrickAssets/index.ts +35 -0
  104. package/reactHooks/__tests__/getPluginConfiguration.test.ts +82 -0
  105. package/reactHooks/actions/index.ts +74 -3
  106. package/reactHooks/cell-click/__tests__/index.test.js +64 -0
  107. package/reactHooks/cell-click/index.ts +21 -14
  108. package/reactHooks/connection/index.tsx +8 -5
  109. package/reactHooks/feed/__tests__/feedInvalidation.test.tsx +338 -0
  110. package/reactHooks/feed/__tests__/useBatchLoading.test.tsx +8 -2
  111. package/reactHooks/feed/__tests__/useMarkPipesDataStale.test.tsx +243 -0
  112. package/reactHooks/feed/useFeedLoader.tsx +28 -1
  113. package/reactHooks/feed/useLoadPipesDataDispatch.ts +12 -11
  114. package/reactHooks/feed/useMarkPipesDataStale.ts +68 -23
  115. package/reactHooks/navigation/__tests__/index.test.tsx +176 -1
  116. package/reactHooks/navigation/__tests__/usePresentScreen.test.ts +154 -0
  117. package/reactHooks/navigation/index.ts +2 -0
  118. package/reactHooks/navigation/usePresentScreen.ts +157 -0
  119. package/reactHooks/navigation/useRoute.ts +22 -5
  120. package/reactHooks/usePluginConfiguration.ts +84 -46
  121. package/riverComponetsMeasurementProvider/index.tsx +3 -1
  122. package/uiActionsRegistrator/__tests__/resolveActionIdentifiers.test.ts +93 -0
  123. package/uiActionsRegistrator/__tests__/subscribe.test.ts +133 -0
  124. package/uiActionsRegistrator/__tests__/usableActionItems.test.ts +52 -0
  125. package/uiActionsRegistrator/index.ts +25 -203
  126. package/uiActionsRegistrator/registry.ts +351 -0
  127. package/uiActionsRegistrator/resolveActionIdentifiers.ts +100 -0
  128. package/uiActionsRegistrator/usableActionItems.ts +66 -0
  129. package/appUtils/contextKeysManager/__tests__/getKey/success/byReference.test.ts +0 -56
  130. package/appUtils/contextKeysManager/__tests__/getKeyByReference/failure.test.ts +0 -265
  131. package/appUtils/contextKeysManager/__tests__/getKeyByReference/success.test.ts +0 -303
  132. package/appUtils/contextKeysManager/__tests__/removeReferenceForKey/failure.test.ts +0 -82
  133. package/appUtils/contextKeysManager/__tests__/removeReferenceForKey/success.test.ts +0 -41
  134. package/appUtils/contextKeysManager/__tests__/setKey/success/saveItemButNotReference.test.ts +0 -208
  135. package/appUtils/contextKeysManager/__tests__/setReferenceForKey/failure.test.ts +0 -93
  136. package/appUtils/contextKeysManager/__tests__/setReferenceForKey/success.test.ts +0 -45
  137. package/playerUtils/__tests__/getPlayerActionButtons.test.ts +0 -54
  138. package/playerUtils/getPlayerActionButtons.ts +0 -17
@@ -0,0 +1,66 @@
1
+ import { createLogger } from "../logger";
2
+
3
+ import { RegisteredAction } from "./registry";
4
+
5
+ const { log_warning } = createLogger({
6
+ subsystem: "UIActionsRegistry",
7
+ category: "ActionRegistration",
8
+ });
9
+
10
+ /**
11
+ * Identifiers already reported as unusable. This runs on every render of the
12
+ * player overlay, so the warning is emitted once per identifier and forgotten
13
+ * again as soon as that action becomes invokable.
14
+ */
15
+ const reportedUnusable = new Set<string>();
16
+
17
+ function isInvokableAction(
18
+ item: RegisteredAction | undefined
19
+ ): item is RegisteredAction {
20
+ return typeof item?.action?.invokeAction === "function";
21
+ }
22
+
23
+ /**
24
+ * Narrows a resolved action list to what can actually be shown and invoked:
25
+ * anything without a usable `invokeAction` is dropped, and a repeated
26
+ * identifier keeps only its first occurrence. Order is preserved.
27
+ *
28
+ * Both the player overflow and the bottom sheet plugin build their list this
29
+ * way, and the player resolver applies it to `player_action_buttons` too - a
30
+ * hand-typed config string can name the same action twice.
31
+ */
32
+ export function usableActionItems(
33
+ items: RegisteredAction[]
34
+ ): RegisteredAction[] {
35
+ const seen = new Set<string>();
36
+ const result: RegisteredAction[] = [];
37
+
38
+ for (const item of items ?? []) {
39
+ const identifier = item?.identifier;
40
+
41
+ // A duplicate is expected - a config string may name the same action twice
42
+ // - and an action with no identifier cannot be named in a log anyway.
43
+ if (!identifier || seen.has(identifier)) {
44
+ continue;
45
+ }
46
+
47
+ if (!isInvokableAction(item)) {
48
+ if (!reportedUnusable.has(identifier)) {
49
+ reportedUnusable.add(identifier);
50
+
51
+ log_warning(
52
+ `usableActionItems: dropping action "${identifier}" - its provider returned no invokeAction, so it cannot be shown`,
53
+ { identifier }
54
+ );
55
+ }
56
+
57
+ continue;
58
+ }
59
+
60
+ reportedUnusable.delete(identifier);
61
+ seen.add(identifier);
62
+ result.push(item);
63
+ }
64
+
65
+ return result;
66
+ }
@@ -1,56 +0,0 @@
1
- import { ContextKeysManager } from "../../..";
2
-
3
- describe("Context Keys Manager - getKey", () => {
4
- it("returns value if found by reference", async () => {
5
- // setup
6
- const key = "namespace.key";
7
- const value = "value";
8
-
9
- const mockedLogger = {
10
- warn: jest.fn(),
11
- };
12
-
13
- const mockedSessionStorage = {
14
- getItem: jest.fn(),
15
- setItem: jest.fn(),
16
- removeItem: jest.fn(),
17
- };
18
-
19
- const mockedLocalStorage = {
20
- getItem: jest.fn(),
21
- setItem: jest.fn(),
22
- removeItem: jest.fn(),
23
- };
24
-
25
- const mockedSecureStorage = {
26
- getItem: jest.fn(),
27
- setItem: jest.fn(),
28
- removeItem: jest.fn(),
29
- };
30
-
31
- const contextManager = new ContextKeysManager({
32
- logger: mockedLogger,
33
- sessionStorage: mockedSessionStorage,
34
- localStorage: mockedLocalStorage,
35
- secureStorage: mockedSecureStorage,
36
- });
37
-
38
- const getKeyByReference = jest
39
- .spyOn(contextManager, "getKeyByReference")
40
- .mockResolvedValueOnce(value);
41
-
42
- // run
43
- const result = await contextManager.getKey(key);
44
-
45
- // verify
46
- expect(result).toEqual(value);
47
-
48
- expect(mockedLogger.warn).not.toHaveBeenCalled();
49
-
50
- expect(getKeyByReference).toHaveBeenCalledWith("key", "namespace");
51
-
52
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
53
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
54
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
55
- });
56
- });
@@ -1,265 +0,0 @@
1
- import { ContextKeysManager, REFERENCE_NAMESPACE, NOTHING } from "../..";
2
- import { buildNamespaceKey } from "../../utils";
3
- import { StorageType } from "../../consts";
4
-
5
- describe("Context Keys Manager - getKeyByReference", () => {
6
- it("returns null if reference-storage failed", async () => {
7
- // setup
8
- const key = "key";
9
- const namespace = "namespace";
10
- const error = Error("oops");
11
-
12
- const mockedLogger = {
13
- warn: jest.fn(),
14
- };
15
-
16
- const mockedSessionStorage = {
17
- getItem: jest.fn(),
18
- setItem: jest.fn(),
19
- removeItem: jest.fn(),
20
- };
21
-
22
- const mockedLocalStorage = {
23
- getItem: jest.fn(),
24
- setItem: jest.fn(),
25
- removeItem: jest.fn(),
26
- };
27
-
28
- const mockedSecureStorage = {
29
- getItem: jest.fn(),
30
- setItem: jest.fn(),
31
- removeItem: jest.fn(),
32
- };
33
-
34
- const mockedReferenceStorage = {
35
- getItem: jest.fn().mockRejectedValueOnce(error),
36
- setItem: jest.fn(),
37
- removeItem: jest.fn(),
38
- };
39
-
40
- const contextManager = new ContextKeysManager({
41
- logger: mockedLogger,
42
- sessionStorage: mockedSessionStorage,
43
- localStorage: mockedLocalStorage,
44
- secureStorage: mockedSecureStorage,
45
- referenceStorage: mockedReferenceStorage,
46
- });
47
-
48
- // run
49
- const result = await contextManager.getKeyByReference(key, namespace);
50
-
51
- // verify
52
- expect(result).toEqual(NOTHING);
53
-
54
- expect(mockedLogger.warn).toHaveBeenCalledTimes(1);
55
-
56
- expect(mockedLogger.warn).toHaveBeenCalledWith({
57
- message: error.message,
58
- data: { key, namespace },
59
- });
60
-
61
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
62
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
63
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
64
-
65
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
66
- buildNamespaceKey(key, namespace),
67
- REFERENCE_NAMESPACE
68
- );
69
- });
70
-
71
- it("returns null if from session-storage failed", async () => {
72
- // setup
73
- const key = "key";
74
- const namespace = "namespace";
75
- const error = Error("oops");
76
-
77
- const mockedLogger = {
78
- warn: jest.fn(),
79
- };
80
-
81
- const mockedSessionStorage = {
82
- getItem: jest.fn().mockRejectedValueOnce(error),
83
- setItem: jest.fn(),
84
- removeItem: jest.fn(),
85
- };
86
-
87
- const mockedLocalStorage = {
88
- getItem: jest.fn(),
89
- setItem: jest.fn(),
90
- removeItem: jest.fn(),
91
- };
92
-
93
- const mockedSecureStorage = {
94
- getItem: jest.fn(),
95
- setItem: jest.fn(),
96
- removeItem: jest.fn(),
97
- };
98
-
99
- const mockedReferenceStorage = {
100
- getItem: jest.fn().mockResolvedValueOnce(StorageType.session),
101
- setItem: jest.fn(),
102
- removeItem: jest.fn(),
103
- };
104
-
105
- const contextManager = new ContextKeysManager({
106
- logger: mockedLogger,
107
- sessionStorage: mockedSessionStorage,
108
- localStorage: mockedLocalStorage,
109
- secureStorage: mockedSecureStorage,
110
- referenceStorage: mockedReferenceStorage,
111
- });
112
-
113
- // run
114
- const result = await contextManager.getKeyByReference(key, namespace);
115
-
116
- // verify
117
- expect(result).toEqual(NOTHING);
118
-
119
- expect(mockedLogger.warn).toHaveBeenCalledTimes(1);
120
-
121
- expect(mockedLogger.warn).toHaveBeenCalledWith({
122
- message: error.message,
123
- data: { key, namespace },
124
- });
125
-
126
- expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(key, namespace);
127
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
128
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
129
-
130
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
131
- buildNamespaceKey(key, namespace),
132
- REFERENCE_NAMESPACE
133
- );
134
- });
135
-
136
- it("returns null if from local-storage failed", async () => {
137
- // setup
138
- const key = "key";
139
- const namespace = "namespace";
140
- const error = Error("oops");
141
-
142
- const mockedLogger = {
143
- warn: jest.fn(),
144
- };
145
-
146
- const mockedSessionStorage = {
147
- getItem: jest.fn(),
148
- setItem: jest.fn(),
149
- removeItem: jest.fn(),
150
- };
151
-
152
- const mockedLocalStorage = {
153
- getItem: jest.fn().mockRejectedValueOnce(error),
154
- setItem: jest.fn(),
155
- removeItem: jest.fn(),
156
- };
157
-
158
- const mockedSecureStorage = {
159
- getItem: jest.fn(),
160
- setItem: jest.fn(),
161
- removeItem: jest.fn(),
162
- };
163
-
164
- const mockedReferenceStorage = {
165
- getItem: jest.fn().mockResolvedValueOnce(StorageType.local),
166
- setItem: jest.fn(),
167
- removeItem: jest.fn(),
168
- };
169
-
170
- const contextManager = new ContextKeysManager({
171
- logger: mockedLogger,
172
- sessionStorage: mockedSessionStorage,
173
- localStorage: mockedLocalStorage,
174
- secureStorage: mockedSecureStorage,
175
- referenceStorage: mockedReferenceStorage,
176
- });
177
-
178
- // run
179
- const result = await contextManager.getKeyByReference(key, namespace);
180
-
181
- // verify
182
- expect(result).toEqual(NOTHING);
183
-
184
- expect(mockedLogger.warn).toHaveBeenCalledTimes(1);
185
-
186
- expect(mockedLogger.warn).toHaveBeenCalledWith({
187
- message: error.message,
188
- data: { key, namespace },
189
- });
190
-
191
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
192
- expect(mockedLocalStorage.getItem).toHaveBeenCalledWith(key, namespace);
193
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
194
-
195
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
196
- buildNamespaceKey(key, namespace),
197
- REFERENCE_NAMESPACE
198
- );
199
- });
200
-
201
- it("returns null if from secure-storage failed", async () => {
202
- // setup
203
- const key = "key";
204
- const namespace = "namespace";
205
- const error = Error("oops");
206
-
207
- const mockedLogger = {
208
- warn: jest.fn(),
209
- };
210
-
211
- const mockedSessionStorage = {
212
- getItem: jest.fn(),
213
- setItem: jest.fn(),
214
- removeItem: jest.fn(),
215
- };
216
-
217
- const mockedLocalStorage = {
218
- getItem: jest.fn(),
219
- setItem: jest.fn(),
220
- removeItem: jest.fn(),
221
- };
222
-
223
- const mockedSecureStorage = {
224
- getItem: jest.fn().mockRejectedValueOnce(error),
225
- setItem: jest.fn(),
226
- removeItem: jest.fn(),
227
- };
228
-
229
- const mockedReferenceStorage = {
230
- getItem: jest.fn().mockResolvedValueOnce(StorageType.secure),
231
- setItem: jest.fn(),
232
- removeItem: jest.fn(),
233
- };
234
-
235
- const contextManager = new ContextKeysManager({
236
- logger: mockedLogger,
237
- sessionStorage: mockedSessionStorage,
238
- localStorage: mockedLocalStorage,
239
- secureStorage: mockedSecureStorage,
240
- referenceStorage: mockedReferenceStorage,
241
- });
242
-
243
- // run
244
- const result = await contextManager.getKeyByReference(key, namespace);
245
-
246
- // verify
247
- expect(result).toEqual(NOTHING);
248
-
249
- expect(mockedLogger.warn).toHaveBeenCalledTimes(1);
250
-
251
- expect(mockedLogger.warn).toHaveBeenCalledWith({
252
- message: error.message,
253
- data: { key, namespace },
254
- });
255
-
256
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
257
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
258
- expect(mockedSecureStorage.getItem).toHaveBeenCalledWith(key, namespace);
259
-
260
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
261
- buildNamespaceKey(key, namespace),
262
- REFERENCE_NAMESPACE
263
- );
264
- });
265
- });
@@ -1,303 +0,0 @@
1
- import { ContextKeysManager, REFERENCE_NAMESPACE, NOTHING } from "../..";
2
- import { buildNamespaceKey } from "../../utils";
3
- import { StorageType } from "../../consts";
4
-
5
- describe("Context Keys Manager - getKeyByReference", () => {
6
- it("returns null if storage is not found", async () => {
7
- // setup
8
- const key = "key";
9
- const namespace = "namespace";
10
-
11
- const mockedLogger = {
12
- warn: jest.fn(),
13
- };
14
-
15
- const mockedSessionStorage = {
16
- getItem: jest.fn(),
17
- setItem: jest.fn(),
18
- removeItem: jest.fn(),
19
- };
20
-
21
- const mockedLocalStorage = {
22
- getItem: jest.fn(),
23
- setItem: jest.fn(),
24
- removeItem: jest.fn(),
25
- };
26
-
27
- const mockedSecureStorage = {
28
- getItem: jest.fn(),
29
- setItem: jest.fn(),
30
- removeItem: jest.fn(),
31
- };
32
-
33
- const mockedReferenceStorage = {
34
- getItem: jest.fn().mockResolvedValueOnce(undefined),
35
- setItem: jest.fn(),
36
- removeItem: jest.fn(),
37
- };
38
-
39
- const contextManager = new ContextKeysManager({
40
- logger: mockedLogger,
41
- sessionStorage: mockedSessionStorage,
42
- localStorage: mockedLocalStorage,
43
- secureStorage: mockedSecureStorage,
44
- referenceStorage: mockedReferenceStorage,
45
- });
46
-
47
- // run
48
- const result = await contextManager.getKeyByReference(key, namespace);
49
-
50
- // verify
51
- expect(result).toEqual(NOTHING);
52
-
53
- expect(mockedLogger.warn).not.toHaveBeenCalled();
54
-
55
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
56
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
57
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
58
-
59
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
60
- buildNamespaceKey(key, namespace),
61
- REFERENCE_NAMESPACE
62
- );
63
- });
64
-
65
- it("returns null if storage is unknown", async () => {
66
- // setup
67
- const key = "key";
68
- const namespace = "namespace";
69
-
70
- const mockedLogger = {
71
- warn: jest.fn(),
72
- };
73
-
74
- const mockedSessionStorage = {
75
- getItem: jest.fn(),
76
- setItem: jest.fn(),
77
- removeItem: jest.fn(),
78
- };
79
-
80
- const mockedLocalStorage = {
81
- getItem: jest.fn(),
82
- setItem: jest.fn(),
83
- removeItem: jest.fn(),
84
- };
85
-
86
- const mockedSecureStorage = {
87
- getItem: jest.fn(),
88
- setItem: jest.fn(),
89
- removeItem: jest.fn(),
90
- };
91
-
92
- const mockedReferenceStorage = {
93
- getItem: jest.fn().mockResolvedValueOnce("unknown"),
94
- setItem: jest.fn(),
95
- removeItem: jest.fn(),
96
- };
97
-
98
- const contextManager = new ContextKeysManager({
99
- logger: mockedLogger,
100
- sessionStorage: mockedSessionStorage,
101
- localStorage: mockedLocalStorage,
102
- secureStorage: mockedSecureStorage,
103
- referenceStorage: mockedReferenceStorage,
104
- });
105
-
106
- // run
107
- const result = await contextManager.getKeyByReference(key, namespace);
108
-
109
- // verify
110
- expect(result).toEqual(NOTHING);
111
-
112
- expect(mockedLogger.warn).not.toHaveBeenCalled();
113
-
114
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
115
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
116
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
117
-
118
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
119
- buildNamespaceKey(key, namespace),
120
- REFERENCE_NAMESPACE
121
- );
122
- });
123
-
124
- it("returns value from session storage", async () => {
125
- // setup
126
- const key = "key";
127
- const namespace = "namespace";
128
- const value = "value";
129
-
130
- const mockedLogger = {
131
- warn: jest.fn(),
132
- };
133
-
134
- const mockedSessionStorage = {
135
- getItem: jest.fn().mockResolvedValueOnce(value),
136
- setItem: jest.fn(),
137
- removeItem: jest.fn(),
138
- };
139
-
140
- const mockedLocalStorage = {
141
- getItem: jest.fn(),
142
- setItem: jest.fn(),
143
- removeItem: jest.fn(),
144
- };
145
-
146
- const mockedSecureStorage = {
147
- getItem: jest.fn(),
148
- setItem: jest.fn(),
149
- removeItem: jest.fn(),
150
- };
151
-
152
- const mockedReferenceStorage = {
153
- getItem: jest.fn().mockResolvedValueOnce(StorageType.session),
154
- setItem: jest.fn(),
155
- removeItem: jest.fn(),
156
- };
157
-
158
- const contextManager = new ContextKeysManager({
159
- logger: mockedLogger,
160
- sessionStorage: mockedSessionStorage,
161
- localStorage: mockedLocalStorage,
162
- secureStorage: mockedSecureStorage,
163
- referenceStorage: mockedReferenceStorage,
164
- });
165
-
166
- // run
167
- const result = await contextManager.getKeyByReference(key, namespace);
168
-
169
- // verify
170
- expect(result).toEqual(value);
171
-
172
- expect(mockedLogger.warn).not.toHaveBeenCalled();
173
-
174
- expect(mockedSessionStorage.getItem).toHaveBeenCalledWith(key, namespace);
175
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
176
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
177
-
178
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
179
- buildNamespaceKey(key, namespace),
180
- REFERENCE_NAMESPACE
181
- );
182
- });
183
-
184
- it("returns value from local storage", async () => {
185
- // setup
186
- const key = "key";
187
- const namespace = "namespace";
188
- const value = "value";
189
-
190
- const mockedLogger = {
191
- warn: jest.fn(),
192
- };
193
-
194
- const mockedSessionStorage = {
195
- getItem: jest.fn(),
196
- setItem: jest.fn(),
197
- removeItem: jest.fn(),
198
- };
199
-
200
- const mockedLocalStorage = {
201
- getItem: jest.fn().mockResolvedValueOnce(value),
202
- setItem: jest.fn(),
203
- removeItem: jest.fn(),
204
- };
205
-
206
- const mockedSecureStorage = {
207
- getItem: jest.fn(),
208
- setItem: jest.fn(),
209
- removeItem: jest.fn(),
210
- };
211
-
212
- const mockedReferenceStorage = {
213
- getItem: jest.fn().mockResolvedValueOnce(StorageType.local),
214
- setItem: jest.fn(),
215
- removeItem: jest.fn(),
216
- };
217
-
218
- const contextManager = new ContextKeysManager({
219
- logger: mockedLogger,
220
- sessionStorage: mockedSessionStorage,
221
- localStorage: mockedLocalStorage,
222
- secureStorage: mockedSecureStorage,
223
- referenceStorage: mockedReferenceStorage,
224
- });
225
-
226
- // run
227
- const result = await contextManager.getKeyByReference(key, namespace);
228
-
229
- // verify
230
- expect(result).toEqual(value);
231
-
232
- expect(mockedLogger.warn).not.toHaveBeenCalled();
233
-
234
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
235
- expect(mockedLocalStorage.getItem).toHaveBeenCalledWith(key, namespace);
236
- expect(mockedSecureStorage.getItem).not.toHaveBeenCalled();
237
-
238
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
239
- buildNamespaceKey(key, namespace),
240
- REFERENCE_NAMESPACE
241
- );
242
- });
243
-
244
- it("returns value from secure storage", async () => {
245
- // setup
246
- const key = "key";
247
- const namespace = "namespace";
248
- const value = "value";
249
-
250
- const mockedLogger = {
251
- warn: jest.fn(),
252
- };
253
-
254
- const mockedSessionStorage = {
255
- getItem: jest.fn(),
256
- setItem: jest.fn(),
257
- removeItem: jest.fn(),
258
- };
259
-
260
- const mockedLocalStorage = {
261
- getItem: jest.fn(),
262
- setItem: jest.fn(),
263
- removeItem: jest.fn(),
264
- };
265
-
266
- const mockedSecureStorage = {
267
- getItem: jest.fn().mockResolvedValueOnce(value),
268
- setItem: jest.fn(),
269
- removeItem: jest.fn(),
270
- };
271
-
272
- const mockedReferenceStorage = {
273
- getItem: jest.fn().mockResolvedValueOnce(StorageType.secure),
274
- setItem: jest.fn(),
275
- removeItem: jest.fn(),
276
- };
277
-
278
- const contextManager = new ContextKeysManager({
279
- logger: mockedLogger,
280
- sessionStorage: mockedSessionStorage,
281
- localStorage: mockedLocalStorage,
282
- secureStorage: mockedSecureStorage,
283
- referenceStorage: mockedReferenceStorage,
284
- });
285
-
286
- // run
287
- const result = await contextManager.getKeyByReference(key, namespace);
288
-
289
- // verify
290
- expect(result).toEqual(value);
291
-
292
- expect(mockedLogger.warn).not.toHaveBeenCalled();
293
-
294
- expect(mockedSessionStorage.getItem).not.toHaveBeenCalled();
295
- expect(mockedLocalStorage.getItem).not.toHaveBeenCalled();
296
- expect(mockedSecureStorage.getItem).toHaveBeenCalledWith(key, namespace);
297
-
298
- expect(mockedReferenceStorage.getItem).toHaveBeenCalledWith(
299
- buildNamespaceKey(key, namespace),
300
- REFERENCE_NAMESPACE
301
- );
302
- });
303
- });