@egen-civitas/esm-platform 0.0.0-stage → 1.2.0
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/CHANGELOG.md +29 -0
- package/README.md +117 -2
- package/dist/adapters/web/camera.d.ts +10 -0
- package/dist/adapters/web/camera.js +31 -0
- package/dist/adapters/web/file-registry.d.ts +7 -0
- package/dist/adapters/web/file-registry.js +26 -0
- package/dist/adapters/web/files.d.ts +7 -0
- package/dist/adapters/web/files.js +22 -0
- package/dist/adapters/web/index.d.ts +9 -0
- package/dist/adapters/web/index.js +9 -0
- package/dist/adapters/web/lifecycle.d.ts +3 -0
- package/dist/adapters/web/lifecycle.js +20 -0
- package/dist/adapters/web/open-external.d.ts +8 -0
- package/dist/adapters/web/open-external.js +32 -0
- package/dist/adapters/web/permissions.d.ts +12 -0
- package/dist/adapters/web/permissions.js +48 -0
- package/dist/adapters/web/pick-files.d.ts +17 -0
- package/dist/adapters/web/pick-files.js +49 -0
- package/dist/adapters/web/session.d.ts +12 -0
- package/dist/adapters/web/session.js +19 -0
- package/dist/adapters/web/web-adapter.test.js +1233 -0
- package/dist/bridge/client.d.ts +48 -0
- package/dist/bridge/client.js +212 -0
- package/dist/bridge/client.test.js +1264 -0
- package/dist/bridge/index.d.ts +4 -0
- package/dist/bridge/index.js +2 -0
- package/dist/bridge/protocol.d.ts +72 -0
- package/dist/bridge/protocol.js +66 -0
- package/dist/bridge/protocol.test.js +215 -0
- package/dist/capabilities.d.ts +34 -0
- package/dist/capabilities.js +48 -0
- package/dist/detect.d.ts +25 -0
- package/dist/detect.js +38 -0
- package/dist/detect.test.js +23 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.js +27 -0
- package/dist/errors.test.js +31 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +14 -0
- package/dist/native-platform.test.js +329 -0
- package/dist/native.d.ts +24 -0
- package/dist/native.js +46 -0
- package/dist/platform.d.ts +24 -0
- package/dist/platform.js +56 -0
- package/dist/platform.test.js +696 -0
- package/dist/register-capabilities.test.js +188 -0
- package/dist/registry.d.ts +52 -0
- package/dist/registry.js +101 -0
- package/dist/registry.test.js +681 -0
- package/dist/testing/index.d.ts +23 -0
- package/dist/testing/index.js +14 -0
- package/dist/testing/mock-host.d.ts +49 -0
- package/dist/testing/mock-host.js +86 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.js +1 -0
- package/package.json +57 -3
|
@@ -0,0 +1,696 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function _array_without_holes(arr) {
|
|
10
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
11
|
+
}
|
|
12
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
13
|
+
try {
|
|
14
|
+
var info = gen[key](arg);
|
|
15
|
+
var value = info.value;
|
|
16
|
+
} catch (error) {
|
|
17
|
+
reject(error);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (info.done) {
|
|
21
|
+
resolve(value);
|
|
22
|
+
} else {
|
|
23
|
+
Promise.resolve(value).then(_next, _throw);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function _async_to_generator(fn) {
|
|
27
|
+
return function() {
|
|
28
|
+
var self = this, args = arguments;
|
|
29
|
+
return new Promise(function(resolve, reject) {
|
|
30
|
+
var gen = fn.apply(self, args);
|
|
31
|
+
function _next(value) {
|
|
32
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
33
|
+
}
|
|
34
|
+
function _throw(err) {
|
|
35
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
36
|
+
}
|
|
37
|
+
_next(undefined);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function _iterable_to_array(iter) {
|
|
42
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
43
|
+
}
|
|
44
|
+
function _iterable_to_array_limit(arr, i) {
|
|
45
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
46
|
+
if (_i == null) return;
|
|
47
|
+
var _arr = [];
|
|
48
|
+
var _n = true;
|
|
49
|
+
var _d = false;
|
|
50
|
+
var _s, _e;
|
|
51
|
+
try {
|
|
52
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
53
|
+
_arr.push(_s.value);
|
|
54
|
+
if (i && _arr.length === i) break;
|
|
55
|
+
}
|
|
56
|
+
} catch (err) {
|
|
57
|
+
_d = true;
|
|
58
|
+
_e = err;
|
|
59
|
+
} finally{
|
|
60
|
+
try {
|
|
61
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
62
|
+
} finally{
|
|
63
|
+
if (_d) throw _e;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return _arr;
|
|
67
|
+
}
|
|
68
|
+
function _non_iterable_rest() {
|
|
69
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
70
|
+
}
|
|
71
|
+
function _non_iterable_spread() {
|
|
72
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
73
|
+
}
|
|
74
|
+
function _sliced_to_array(arr, i) {
|
|
75
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
76
|
+
}
|
|
77
|
+
function _to_consumable_array(arr) {
|
|
78
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
79
|
+
}
|
|
80
|
+
function _type_of(obj) {
|
|
81
|
+
"@swc/helpers - typeof";
|
|
82
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
83
|
+
}
|
|
84
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
85
|
+
if (!o) return;
|
|
86
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
87
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
88
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
89
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
90
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
91
|
+
}
|
|
92
|
+
function _ts_generator(thisArg, body) {
|
|
93
|
+
var f, y, t, _ = {
|
|
94
|
+
label: 0,
|
|
95
|
+
sent: function() {
|
|
96
|
+
if (t[0] & 1) throw t[1];
|
|
97
|
+
return t[1];
|
|
98
|
+
},
|
|
99
|
+
trys: [],
|
|
100
|
+
ops: []
|
|
101
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
102
|
+
return d(g, "next", {
|
|
103
|
+
value: verb(0)
|
|
104
|
+
}), d(g, "throw", {
|
|
105
|
+
value: verb(1)
|
|
106
|
+
}), d(g, "return", {
|
|
107
|
+
value: verb(2)
|
|
108
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
109
|
+
value: function() {
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
}), g;
|
|
113
|
+
function verb(n) {
|
|
114
|
+
return function(v) {
|
|
115
|
+
return step([
|
|
116
|
+
n,
|
|
117
|
+
v
|
|
118
|
+
]);
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function step(op) {
|
|
122
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
123
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
124
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
125
|
+
if (y = 0, t) op = [
|
|
126
|
+
op[0] & 2,
|
|
127
|
+
t.value
|
|
128
|
+
];
|
|
129
|
+
switch(op[0]){
|
|
130
|
+
case 0:
|
|
131
|
+
case 1:
|
|
132
|
+
t = op;
|
|
133
|
+
break;
|
|
134
|
+
case 4:
|
|
135
|
+
_.label++;
|
|
136
|
+
return {
|
|
137
|
+
value: op[1],
|
|
138
|
+
done: false
|
|
139
|
+
};
|
|
140
|
+
case 5:
|
|
141
|
+
_.label++;
|
|
142
|
+
y = op[1];
|
|
143
|
+
op = [
|
|
144
|
+
0
|
|
145
|
+
];
|
|
146
|
+
continue;
|
|
147
|
+
case 7:
|
|
148
|
+
op = _.ops.pop();
|
|
149
|
+
_.trys.pop();
|
|
150
|
+
continue;
|
|
151
|
+
default:
|
|
152
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
153
|
+
_ = 0;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
157
|
+
_.label = op[1];
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
161
|
+
_.label = t[1];
|
|
162
|
+
t = op;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
if (t && _.label < t[2]) {
|
|
166
|
+
_.label = t[2];
|
|
167
|
+
_.ops.push(op);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
if (t[2]) _.ops.pop();
|
|
171
|
+
_.trys.pop();
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
op = body.call(thisArg, _);
|
|
175
|
+
} catch (e) {
|
|
176
|
+
op = [
|
|
177
|
+
6,
|
|
178
|
+
e
|
|
179
|
+
];
|
|
180
|
+
y = 0;
|
|
181
|
+
} finally{
|
|
182
|
+
f = t = 0;
|
|
183
|
+
}
|
|
184
|
+
if (op[0] & 5) throw op[1];
|
|
185
|
+
return {
|
|
186
|
+
value: op[0] ? op[1] : void 0,
|
|
187
|
+
done: true
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
192
|
+
import { getPlatform, hasHostBridge, isPlatformError, PlatformError } from './index';
|
|
193
|
+
import { createMockHost, createMockPlatform } from './testing';
|
|
194
|
+
/** Toutes les capacités v1 avec leurs méthodes (annexe 2). Ajouter une capacité oblige à compléter ce tableau. */ var ASYNC_METHODS = [
|
|
195
|
+
[
|
|
196
|
+
'session',
|
|
197
|
+
'getAuthorization'
|
|
198
|
+
],
|
|
199
|
+
[
|
|
200
|
+
'session',
|
|
201
|
+
'setTokens'
|
|
202
|
+
],
|
|
203
|
+
[
|
|
204
|
+
'session',
|
|
205
|
+
'refresh'
|
|
206
|
+
],
|
|
207
|
+
[
|
|
208
|
+
'session',
|
|
209
|
+
'clear'
|
|
210
|
+
],
|
|
211
|
+
[
|
|
212
|
+
'secureStorage',
|
|
213
|
+
'get'
|
|
214
|
+
],
|
|
215
|
+
[
|
|
216
|
+
'secureStorage',
|
|
217
|
+
'set'
|
|
218
|
+
],
|
|
219
|
+
[
|
|
220
|
+
'secureStorage',
|
|
221
|
+
'remove'
|
|
222
|
+
],
|
|
223
|
+
[
|
|
224
|
+
'openExternal',
|
|
225
|
+
'open'
|
|
226
|
+
],
|
|
227
|
+
[
|
|
228
|
+
'permissions',
|
|
229
|
+
'check'
|
|
230
|
+
],
|
|
231
|
+
[
|
|
232
|
+
'permissions',
|
|
233
|
+
'request'
|
|
234
|
+
],
|
|
235
|
+
[
|
|
236
|
+
'files',
|
|
237
|
+
'select'
|
|
238
|
+
],
|
|
239
|
+
[
|
|
240
|
+
'files',
|
|
241
|
+
'download'
|
|
242
|
+
],
|
|
243
|
+
[
|
|
244
|
+
'camera',
|
|
245
|
+
'capture'
|
|
246
|
+
],
|
|
247
|
+
[
|
|
248
|
+
'push',
|
|
249
|
+
'register'
|
|
250
|
+
],
|
|
251
|
+
[
|
|
252
|
+
'biometric',
|
|
253
|
+
'isAvailable'
|
|
254
|
+
],
|
|
255
|
+
[
|
|
256
|
+
'biometric',
|
|
257
|
+
'authenticate'
|
|
258
|
+
]
|
|
259
|
+
];
|
|
260
|
+
/** Abonnements : leur signature n'est pas une Promise, ils ne peuvent donc pas « rejeter » : ils lèvent. */ var SYNC_METHODS = [
|
|
261
|
+
[
|
|
262
|
+
'lifecycle',
|
|
263
|
+
'onResume'
|
|
264
|
+
],
|
|
265
|
+
[
|
|
266
|
+
'lifecycle',
|
|
267
|
+
'onPause'
|
|
268
|
+
],
|
|
269
|
+
[
|
|
270
|
+
'push',
|
|
271
|
+
'onMessage'
|
|
272
|
+
]
|
|
273
|
+
];
|
|
274
|
+
var CAPABILITIES = [
|
|
275
|
+
'session',
|
|
276
|
+
'secureStorage',
|
|
277
|
+
'openExternal',
|
|
278
|
+
'lifecycle',
|
|
279
|
+
'permissions',
|
|
280
|
+
'files',
|
|
281
|
+
'camera',
|
|
282
|
+
'push',
|
|
283
|
+
'biometric'
|
|
284
|
+
];
|
|
285
|
+
var call = function call(platform, capability, method) {
|
|
286
|
+
return platform[capability][method]('x', 'y');
|
|
287
|
+
};
|
|
288
|
+
afterEach(function() {
|
|
289
|
+
var w = window;
|
|
290
|
+
delete w.egenTarget;
|
|
291
|
+
delete w.egenHostBridge;
|
|
292
|
+
delete w.Capacitor;
|
|
293
|
+
});
|
|
294
|
+
/**
|
|
295
|
+
* Le mock est testé contre LES MÊMES tests de contrat que l'implémentation (règle C9) : il ne peut pas diverger.
|
|
296
|
+
*/ describe.each([
|
|
297
|
+
[
|
|
298
|
+
'getPlatform() (natif sans adaptateur)',
|
|
299
|
+
function() {
|
|
300
|
+
window.egenTarget = 'android';
|
|
301
|
+
return getPlatform();
|
|
302
|
+
}
|
|
303
|
+
],
|
|
304
|
+
[
|
|
305
|
+
'createMockPlatform()',
|
|
306
|
+
function() {
|
|
307
|
+
return createMockPlatform();
|
|
308
|
+
}
|
|
309
|
+
]
|
|
310
|
+
])('contrat de capacités indisponibles — %s', function(_label, make) {
|
|
311
|
+
it('expose exactement les capacités v1 comme objets, et aucune autre', function() {
|
|
312
|
+
var platform = make();
|
|
313
|
+
var exposed = Object.keys(platform).filter(function(key) {
|
|
314
|
+
return ![
|
|
315
|
+
'environment',
|
|
316
|
+
'ready',
|
|
317
|
+
'has'
|
|
318
|
+
].includes(key);
|
|
319
|
+
});
|
|
320
|
+
expect(exposed.sort()).toEqual(_to_consumable_array(CAPABILITIES).sort());
|
|
321
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
322
|
+
try {
|
|
323
|
+
for(var _iterator = CAPABILITIES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
324
|
+
var name = _step.value;
|
|
325
|
+
expect(_type_of(platform[name])).toBe('object');
|
|
326
|
+
}
|
|
327
|
+
} catch (err) {
|
|
328
|
+
_didIteratorError = true;
|
|
329
|
+
_iteratorError = err;
|
|
330
|
+
} finally{
|
|
331
|
+
try {
|
|
332
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
333
|
+
_iterator.return();
|
|
334
|
+
}
|
|
335
|
+
} finally{
|
|
336
|
+
if (_didIteratorError) {
|
|
337
|
+
throw _iteratorError;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
it('le tableau de méthodes couvre toutes les méthodes de chaque capacité', function() {
|
|
343
|
+
var platform = make();
|
|
344
|
+
var covered = _to_consumable_array(ASYNC_METHODS).concat(_to_consumable_array(SYNC_METHODS));
|
|
345
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
346
|
+
try {
|
|
347
|
+
var _loop = function() {
|
|
348
|
+
var name = _step.value;
|
|
349
|
+
var methods = Object.keys(platform[name]).sort();
|
|
350
|
+
expect(covered.filter(function(param) {
|
|
351
|
+
var _param = _sliced_to_array(param, 1), cap = _param[0];
|
|
352
|
+
return cap === name;
|
|
353
|
+
}).map(function(param) {
|
|
354
|
+
var _param = _sliced_to_array(param, 2), m = _param[1];
|
|
355
|
+
return m;
|
|
356
|
+
}).sort()).toEqual(methods);
|
|
357
|
+
};
|
|
358
|
+
for(var _iterator = CAPABILITIES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
|
|
359
|
+
} catch (err) {
|
|
360
|
+
_didIteratorError = true;
|
|
361
|
+
_iteratorError = err;
|
|
362
|
+
} finally{
|
|
363
|
+
try {
|
|
364
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
365
|
+
_iterator.return();
|
|
366
|
+
}
|
|
367
|
+
} finally{
|
|
368
|
+
if (_didIteratorError) {
|
|
369
|
+
throw _iteratorError;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
it.each(CAPABILITIES)('has("%s") est faux : rien n’est simulé', function(name) {
|
|
375
|
+
expect(make().has(name)).toBe(false);
|
|
376
|
+
});
|
|
377
|
+
it.each(ASYNC_METHODS)('%s.%s rejette PlatformError UNAVAILABLE (jamais null, jamais Error générique)', function(cap, method) {
|
|
378
|
+
return _async_to_generator(function() {
|
|
379
|
+
var promise, error;
|
|
380
|
+
return _ts_generator(this, function(_state) {
|
|
381
|
+
switch(_state.label){
|
|
382
|
+
case 0:
|
|
383
|
+
promise = call(make(), cap, method);
|
|
384
|
+
expect(promise).toBeInstanceOf(Promise);
|
|
385
|
+
return [
|
|
386
|
+
4,
|
|
387
|
+
promise.then(function() {
|
|
388
|
+
throw new Error('devait rejeter');
|
|
389
|
+
}, function(e) {
|
|
390
|
+
return e;
|
|
391
|
+
})
|
|
392
|
+
];
|
|
393
|
+
case 1:
|
|
394
|
+
error = _state.sent();
|
|
395
|
+
expect(isPlatformError(error)).toBe(true);
|
|
396
|
+
expect(error).toMatchObject({
|
|
397
|
+
name: 'PlatformError',
|
|
398
|
+
code: 'UNAVAILABLE',
|
|
399
|
+
capability: cap,
|
|
400
|
+
method: method,
|
|
401
|
+
retryable: false
|
|
402
|
+
});
|
|
403
|
+
return [
|
|
404
|
+
2
|
|
405
|
+
];
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
})();
|
|
409
|
+
});
|
|
410
|
+
it.each(SYNC_METHODS)('%s.%s (abonnement) lève PlatformError UNAVAILABLE', function(cap, method) {
|
|
411
|
+
var platform = make();
|
|
412
|
+
expect(function() {
|
|
413
|
+
return call(platform, cap, method);
|
|
414
|
+
}).toThrow(PlatformError);
|
|
415
|
+
try {
|
|
416
|
+
call(platform, cap, method);
|
|
417
|
+
} catch (error) {
|
|
418
|
+
expect(error).toMatchObject({
|
|
419
|
+
code: 'UNAVAILABLE',
|
|
420
|
+
capability: cap,
|
|
421
|
+
method: method
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
it('les messages d’erreur ne contiennent pas les arguments (aucune fuite de jeton ou de clé)', function() {
|
|
426
|
+
return _async_to_generator(function() {
|
|
427
|
+
var error;
|
|
428
|
+
return _ts_generator(this, function(_state) {
|
|
429
|
+
switch(_state.label){
|
|
430
|
+
case 0:
|
|
431
|
+
return [
|
|
432
|
+
4,
|
|
433
|
+
make().session.setTokens({
|
|
434
|
+
access: 'SECRET-TOKEN-123'
|
|
435
|
+
}).catch(function(e) {
|
|
436
|
+
return e;
|
|
437
|
+
})
|
|
438
|
+
];
|
|
439
|
+
case 1:
|
|
440
|
+
error = _state.sent();
|
|
441
|
+
expect(error.message).not.toContain('SECRET-TOKEN-123');
|
|
442
|
+
expect(String(error.stack)).not.toContain('SECRET-TOKEN-123');
|
|
443
|
+
return [
|
|
444
|
+
2
|
|
445
|
+
];
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
})();
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
describe('getPlatform() — environnement et handshake', function() {
|
|
452
|
+
it('web par défaut : ready se résout immédiatement', function() {
|
|
453
|
+
return _async_to_generator(function() {
|
|
454
|
+
var platform;
|
|
455
|
+
return _ts_generator(this, function(_state) {
|
|
456
|
+
switch(_state.label){
|
|
457
|
+
case 0:
|
|
458
|
+
platform = getPlatform();
|
|
459
|
+
expect(platform.environment).toBe('web');
|
|
460
|
+
return [
|
|
461
|
+
4,
|
|
462
|
+
expect(platform.ready).resolves.toBeUndefined()
|
|
463
|
+
];
|
|
464
|
+
case 1:
|
|
465
|
+
_state.sent();
|
|
466
|
+
return [
|
|
467
|
+
2
|
|
468
|
+
];
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
})();
|
|
472
|
+
});
|
|
473
|
+
it.each([
|
|
474
|
+
'android',
|
|
475
|
+
'ios'
|
|
476
|
+
])('%s sans Host : ready rejette INCOMPATIBLE « Host manquant »', function(target) {
|
|
477
|
+
return _async_to_generator(function() {
|
|
478
|
+
var platform, error;
|
|
479
|
+
return _ts_generator(this, function(_state) {
|
|
480
|
+
switch(_state.label){
|
|
481
|
+
case 0:
|
|
482
|
+
window.egenTarget = target;
|
|
483
|
+
platform = getPlatform();
|
|
484
|
+
expect(platform.environment).toBe(target);
|
|
485
|
+
return [
|
|
486
|
+
4,
|
|
487
|
+
platform.ready.then(function() {
|
|
488
|
+
throw new Error('devait rejeter');
|
|
489
|
+
}, function(e) {
|
|
490
|
+
return e;
|
|
491
|
+
})
|
|
492
|
+
];
|
|
493
|
+
case 1:
|
|
494
|
+
error = _state.sent();
|
|
495
|
+
expect(error).toBeInstanceOf(PlatformError);
|
|
496
|
+
expect(error).toMatchObject({
|
|
497
|
+
code: 'INCOMPATIBLE'
|
|
498
|
+
});
|
|
499
|
+
expect(error.message).toContain('Host manquant');
|
|
500
|
+
expect(error.message).toContain(target);
|
|
501
|
+
return [
|
|
502
|
+
2
|
|
503
|
+
];
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
})();
|
|
507
|
+
});
|
|
508
|
+
it('natif avec un Host conforme : ready se résout après le handshake', function() {
|
|
509
|
+
return _async_to_generator(function() {
|
|
510
|
+
return _ts_generator(this, function(_state) {
|
|
511
|
+
switch(_state.label){
|
|
512
|
+
case 0:
|
|
513
|
+
window.egenTarget = 'android';
|
|
514
|
+
createMockHost().install();
|
|
515
|
+
return [
|
|
516
|
+
4,
|
|
517
|
+
expect(getPlatform().ready).resolves.toBeUndefined()
|
|
518
|
+
];
|
|
519
|
+
case 1:
|
|
520
|
+
_state.sent();
|
|
521
|
+
return [
|
|
522
|
+
2
|
|
523
|
+
];
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
})();
|
|
527
|
+
});
|
|
528
|
+
it.each([
|
|
529
|
+
[
|
|
530
|
+
'sans subscribe',
|
|
531
|
+
{
|
|
532
|
+
send: function send() {}
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
[
|
|
536
|
+
'sans send',
|
|
537
|
+
{
|
|
538
|
+
subscribe: function subscribe() {}
|
|
539
|
+
}
|
|
540
|
+
],
|
|
541
|
+
[
|
|
542
|
+
'send non fonction',
|
|
543
|
+
{
|
|
544
|
+
send: 'x',
|
|
545
|
+
subscribe: function subscribe() {}
|
|
546
|
+
}
|
|
547
|
+
],
|
|
548
|
+
[
|
|
549
|
+
'null',
|
|
550
|
+
null
|
|
551
|
+
],
|
|
552
|
+
[
|
|
553
|
+
'chaîne',
|
|
554
|
+
'bridge'
|
|
555
|
+
]
|
|
556
|
+
])('natif avec un pont non conforme (%s) : ready rejette INCOMPATIBLE', function(_label, bridge) {
|
|
557
|
+
return _async_to_generator(function() {
|
|
558
|
+
return _ts_generator(this, function(_state) {
|
|
559
|
+
switch(_state.label){
|
|
560
|
+
case 0:
|
|
561
|
+
window.egenTarget = 'ios';
|
|
562
|
+
window.egenHostBridge = bridge;
|
|
563
|
+
expect(hasHostBridge()).toBe(false);
|
|
564
|
+
return [
|
|
565
|
+
4,
|
|
566
|
+
expect(getPlatform().ready).rejects.toMatchObject({
|
|
567
|
+
code: 'INCOMPATIBLE'
|
|
568
|
+
})
|
|
569
|
+
];
|
|
570
|
+
case 1:
|
|
571
|
+
_state.sent();
|
|
572
|
+
return [
|
|
573
|
+
2
|
|
574
|
+
];
|
|
575
|
+
}
|
|
576
|
+
});
|
|
577
|
+
})();
|
|
578
|
+
});
|
|
579
|
+
it('en Web, un pont présent ne change rien (la cible vient du build, pas de la détection)', function() {
|
|
580
|
+
return _async_to_generator(function() {
|
|
581
|
+
return _ts_generator(this, function(_state) {
|
|
582
|
+
window.egenHostBridge = {
|
|
583
|
+
send: function send() {},
|
|
584
|
+
subscribe: function subscribe() {}
|
|
585
|
+
};
|
|
586
|
+
expect(getPlatform().environment).toBe('web');
|
|
587
|
+
return [
|
|
588
|
+
2
|
|
589
|
+
];
|
|
590
|
+
});
|
|
591
|
+
})();
|
|
592
|
+
});
|
|
593
|
+
it('ne détecte ni Capacitor ni le User-Agent (N2, N4)', function() {
|
|
594
|
+
window.Capacitor = {
|
|
595
|
+
isNativePlatform: function isNativePlatform() {
|
|
596
|
+
return true;
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
Object.defineProperty(navigator, 'userAgent', {
|
|
600
|
+
value: 'Mozilla/5.0 (Linux; Android 14)',
|
|
601
|
+
configurable: true
|
|
602
|
+
});
|
|
603
|
+
expect(getPlatform().environment).toBe('web');
|
|
604
|
+
});
|
|
605
|
+
it('lire ready ne crée aucun rejet tant que personne ne l’attend', function() {
|
|
606
|
+
window.egenTarget = 'android';
|
|
607
|
+
// Aucune lecture de `ready` : construire la plateforme native sans Host ne doit rien rejeter.
|
|
608
|
+
expect(function() {
|
|
609
|
+
return getPlatform();
|
|
610
|
+
}).not.toThrow();
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
describe('createMockPlatform()', function() {
|
|
614
|
+
it('fournit seulement les capacités demandées ; le reste reste UNAVAILABLE', function() {
|
|
615
|
+
return _async_to_generator(function() {
|
|
616
|
+
var platform;
|
|
617
|
+
return _ts_generator(this, function(_state) {
|
|
618
|
+
switch(_state.label){
|
|
619
|
+
case 0:
|
|
620
|
+
platform = createMockPlatform({
|
|
621
|
+
environment: 'android',
|
|
622
|
+
capabilities: {
|
|
623
|
+
secureStorage: {
|
|
624
|
+
get: function get(key) {
|
|
625
|
+
return _async_to_generator(function() {
|
|
626
|
+
return _ts_generator(this, function(_state) {
|
|
627
|
+
return [
|
|
628
|
+
2,
|
|
629
|
+
"valeur-de-".concat(key)
|
|
630
|
+
];
|
|
631
|
+
});
|
|
632
|
+
})();
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
expect(platform.environment).toBe('android');
|
|
638
|
+
expect(platform.has('secureStorage')).toBe(true);
|
|
639
|
+
expect(platform.has('session')).toBe(false);
|
|
640
|
+
return [
|
|
641
|
+
4,
|
|
642
|
+
expect(platform.secureStorage.get('k')).resolves.toBe('valeur-de-k')
|
|
643
|
+
];
|
|
644
|
+
case 1:
|
|
645
|
+
_state.sent();
|
|
646
|
+
// Même dans une capacité fournie, une méthode non simulée reste UNAVAILABLE (pas de faux succès).
|
|
647
|
+
return [
|
|
648
|
+
4,
|
|
649
|
+
expect(platform.secureStorage.set('k', 'v')).rejects.toMatchObject({
|
|
650
|
+
code: 'UNAVAILABLE',
|
|
651
|
+
method: 'set'
|
|
652
|
+
})
|
|
653
|
+
];
|
|
654
|
+
case 2:
|
|
655
|
+
_state.sent();
|
|
656
|
+
return [
|
|
657
|
+
4,
|
|
658
|
+
expect(platform.session.getAuthorization()).rejects.toMatchObject({
|
|
659
|
+
code: 'UNAVAILABLE'
|
|
660
|
+
})
|
|
661
|
+
];
|
|
662
|
+
case 3:
|
|
663
|
+
_state.sent();
|
|
664
|
+
return [
|
|
665
|
+
2
|
|
666
|
+
];
|
|
667
|
+
}
|
|
668
|
+
});
|
|
669
|
+
})();
|
|
670
|
+
});
|
|
671
|
+
it('ready peut être contrôlé par le test', function() {
|
|
672
|
+
return _async_to_generator(function() {
|
|
673
|
+
var failing;
|
|
674
|
+
return _ts_generator(this, function(_state) {
|
|
675
|
+
switch(_state.label){
|
|
676
|
+
case 0:
|
|
677
|
+
failing = createMockPlatform({
|
|
678
|
+
environment: 'ios',
|
|
679
|
+
ready: Promise.reject(new PlatformError('TIMEOUT', 'x'))
|
|
680
|
+
});
|
|
681
|
+
return [
|
|
682
|
+
4,
|
|
683
|
+
expect(failing.ready).rejects.toMatchObject({
|
|
684
|
+
code: 'TIMEOUT'
|
|
685
|
+
})
|
|
686
|
+
];
|
|
687
|
+
case 1:
|
|
688
|
+
_state.sent();
|
|
689
|
+
return [
|
|
690
|
+
2
|
|
691
|
+
];
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
})();
|
|
695
|
+
});
|
|
696
|
+
});
|