@mosaicast/plugin-sdk 0.7.1 → 0.9.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/README.md +357 -0
- package/dist/index.d.ts +994 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +341 -1
- package/dist/index.js.map +1 -1
- package/dist/testing.d.ts +222 -9
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +499 -8
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
package/dist/testing.js
CHANGED
|
@@ -1,21 +1,104 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// SPDX-FileCopyrightText: 2026 The Mosaicast Authors
|
|
3
|
+
import { DISPLAY_BATCH_LIMIT, DOC_KEY_PATTERN, declaredTypeFor } from './index.js';
|
|
4
|
+
/**
|
|
5
|
+
* A canned failure: what the host would have answered instead of a body.
|
|
6
|
+
*
|
|
7
|
+
* Put one in {@link MockApiClient.responses} and the call rejects with a {@link PluginApiError} carrying
|
|
8
|
+
* that status — which is how a component's 404 branch and its 500 branch become separately testable.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* const ctx = makeMockCtx({ apiResponses: { 'get data/site/main/stats': apiError(403, {
|
|
12
|
+
* detail: 'this key is written by the plugin backend',
|
|
13
|
+
* }) } });
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @param status the HTTP status to fail with
|
|
17
|
+
* @param problem the RFC 7807 body, if the test cares about it
|
|
18
|
+
* @returns a marker the mock client turns into a rejection
|
|
19
|
+
* @since 0.9.0
|
|
20
|
+
*/
|
|
21
|
+
export function apiError(status, problem) {
|
|
22
|
+
return { __mosaicastApiError: true, status, problem };
|
|
23
|
+
}
|
|
24
|
+
function isCannedApiError(value) {
|
|
25
|
+
return typeof value === 'object' && value !== null && '__mosaicastApiError' in value;
|
|
26
|
+
}
|
|
27
|
+
/** Builds the error shape the host produces, so `isPluginApiError` and `e.status` behave as in production. */
|
|
28
|
+
function toApiError(canned, method, path) {
|
|
29
|
+
const error = new Error(`${canned.status} on ${method.toUpperCase()} ${path}${canned.problem?.detail ? `: ${canned.problem.detail}` : ''}`);
|
|
30
|
+
error.status = canned.status;
|
|
31
|
+
error.problem = canned.problem;
|
|
32
|
+
return error;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Waits until every call recorded by a mock client has settled *and* the `.then` chains behind them have
|
|
36
|
+
* run.
|
|
37
|
+
*
|
|
38
|
+
* The two-part wait is the point: `await client.settled()` knows when the *requests* finished, and the
|
|
39
|
+
* microtask drain after it lets the component's own `.then(setState)` hops reach the DOM. Use it instead
|
|
40
|
+
* of counting `await Promise.resolve()` calls by hand.
|
|
41
|
+
*
|
|
42
|
+
* ```ts
|
|
43
|
+
* mount(ctx);
|
|
44
|
+
* await flushMockApi(ctx.api);
|
|
45
|
+
* expect(root.querySelector('.title')).toHaveTextContent('The Kraken');
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @param client the mock client — `ctx.api` from {@link makeMockCtx}
|
|
49
|
+
* @since 0.9.0
|
|
50
|
+
*/
|
|
51
|
+
export async function flushMockApi(client) {
|
|
52
|
+
await client.settled();
|
|
53
|
+
// Two hops, because a component that chains `.then(parse).then(setState)` needs one per link and the
|
|
54
|
+
// cost of an extra hop is nothing. Anything deeper than this is a component doing its own async work,
|
|
55
|
+
// which is the component's to await.
|
|
56
|
+
await Promise.resolve();
|
|
57
|
+
await Promise.resolve();
|
|
58
|
+
}
|
|
3
59
|
/** The unsubscribe returned by the inert `onChange` doubles — there is nothing to detach. */
|
|
4
60
|
const noop = () => { };
|
|
5
61
|
function makeMockApi(responses) {
|
|
6
62
|
const calls = [];
|
|
63
|
+
const inFlight = [];
|
|
7
64
|
const resolve = (method, path, body) => {
|
|
8
65
|
calls.push({ method, path, body });
|
|
9
66
|
const canned = api.responses[`${method} ${path}`] ?? api.responses[path];
|
|
10
|
-
|
|
67
|
+
const result = isCannedApiError(canned)
|
|
68
|
+
? Promise.reject(toApiError(canned, method, path))
|
|
69
|
+
: Promise.resolve(canned);
|
|
70
|
+
// Tracked separately, and with its rejection absorbed, so `settled()` can await every call without
|
|
71
|
+
// becoming an unhandled-rejection source of its own.
|
|
72
|
+
inFlight.push(result.catch(() => undefined));
|
|
73
|
+
return result;
|
|
11
74
|
};
|
|
12
75
|
const api = {
|
|
13
76
|
calls,
|
|
14
77
|
responses,
|
|
15
78
|
get: (path) => resolve('get', path),
|
|
79
|
+
getOrNull: async (path) => {
|
|
80
|
+
try {
|
|
81
|
+
return await resolve('get', path);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
// Exactly the host's rule: 404 is an answer, everything else is a failure.
|
|
85
|
+
if (e instanceof Error && e.status === 404) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
throw e;
|
|
89
|
+
}
|
|
90
|
+
},
|
|
16
91
|
post: (path, body) => resolve('post', path, body),
|
|
17
92
|
put: (path, body) => resolve('put', path, body),
|
|
18
93
|
delete: (path) => resolve('delete', path),
|
|
94
|
+
settled: async () => {
|
|
95
|
+
// Re-read the list each round: awaiting one call can start another.
|
|
96
|
+
let pending = inFlight.length;
|
|
97
|
+
do {
|
|
98
|
+
pending = inFlight.length;
|
|
99
|
+
await Promise.all(inFlight.slice());
|
|
100
|
+
} while (inFlight.length !== pending);
|
|
101
|
+
},
|
|
19
102
|
};
|
|
20
103
|
return api;
|
|
21
104
|
}
|
|
@@ -197,6 +280,272 @@ export function makeMockSchema(rows = {}) {
|
|
|
197
280
|
};
|
|
198
281
|
return client;
|
|
199
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* A {@link FeedsClient} double: snapshots you register, and **nothing for the ones you don't**.
|
|
285
|
+
*
|
|
286
|
+
* An unregistered slug resolves `null` (or is absent from a batch) rather than throwing, because that is
|
|
287
|
+
* what the host does for an episode this visitor may not see — a `WITHDRAWN` or tier-gated one is absent,
|
|
288
|
+
* not redacted. So the empty case a component must handle is the double's default, and a component that
|
|
289
|
+
* assumes every slug comes back fails here rather than in front of a visitor.
|
|
290
|
+
*
|
|
291
|
+
* ```ts
|
|
292
|
+
* const feeds = makeMockFeeds().withDisplay('kraken', { title: 'The Kraken', description: '' });
|
|
293
|
+
* const ctx = makeMockCtx({ feeds, episodes: ['kraken', 'gated'] });
|
|
294
|
+
*
|
|
295
|
+
* await mount(ctx);
|
|
296
|
+
* expect(root.textContent).toContain('The Kraken'); // and renders nothing for `gated`
|
|
297
|
+
* ```
|
|
298
|
+
*
|
|
299
|
+
* @param snapshots snapshots to start with, keyed by slug
|
|
300
|
+
* @returns a feeds double with `withDisplay` and a recorded `requested` list
|
|
301
|
+
* @since 0.9.0
|
|
302
|
+
*/
|
|
303
|
+
export function makeMockFeeds(snapshots = {}) {
|
|
304
|
+
const stored = { ...snapshots };
|
|
305
|
+
const requested = [];
|
|
306
|
+
const client = {
|
|
307
|
+
requested,
|
|
308
|
+
withDisplay(slug, snapshot) {
|
|
309
|
+
stored[slug] = snapshot;
|
|
310
|
+
return client;
|
|
311
|
+
},
|
|
312
|
+
display: (slug) => {
|
|
313
|
+
requested.push(slug);
|
|
314
|
+
return Promise.resolve(stored[slug] ?? null);
|
|
315
|
+
},
|
|
316
|
+
displayMany: (slugs) => {
|
|
317
|
+
// Clamped, not rejected — the host's behaviour past the batch ceiling.
|
|
318
|
+
const asked = slugs.slice(0, DISPLAY_BATCH_LIMIT);
|
|
319
|
+
requested.push(...asked);
|
|
320
|
+
const result = {};
|
|
321
|
+
for (const slug of asked) {
|
|
322
|
+
const snapshot = stored[slug];
|
|
323
|
+
// Absent rather than null: a slug the caller may not see is simply not a key in the answer.
|
|
324
|
+
if (snapshot)
|
|
325
|
+
result[slug] = snapshot;
|
|
326
|
+
}
|
|
327
|
+
return Promise.resolve(result);
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
return client;
|
|
331
|
+
}
|
|
332
|
+
/** The host's canonicalisation rule: trim, collapse internal whitespace, casefold. */
|
|
333
|
+
function canonicalTag(tag) {
|
|
334
|
+
const canonical = tag.trim().replace(/\s+/g, ' ').toLowerCase();
|
|
335
|
+
if (canonical === '') {
|
|
336
|
+
throw new Error('tag must not be blank');
|
|
337
|
+
}
|
|
338
|
+
return canonical;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* A {@link TagsClient} double that **refuses what the host refuses**.
|
|
342
|
+
*
|
|
343
|
+
* Two refusals matter, and both are invisible to a component tested against a permissive double:
|
|
344
|
+
*
|
|
345
|
+
* - **Episode writes throw** unless you pass `writesEpisodes: true`, standing in for the manifest
|
|
346
|
+
* declaration. Off by default, so the branch where the host says no gets exercised.
|
|
347
|
+
* - **`untagEpisode` removes only this plugin's own assignment.** Seed the feed's side with
|
|
348
|
+
* {@link MockTagsClient.withFeedTag} and the tag survives your removal, exactly as the host's `source`
|
|
349
|
+
* column makes it survive.
|
|
350
|
+
*
|
|
351
|
+
* Canonicalisation is applied as the host applies it, so a test that writes `'Maritime '` and reads
|
|
352
|
+
* `'maritime'` passes here for the same reason it passes against core.
|
|
353
|
+
*
|
|
354
|
+
* @param opts `writesEpisodes` grants the episode-write capability; `subjects` and `episodes` seed
|
|
355
|
+
* assignments this plugin owns
|
|
356
|
+
* @returns a tags double
|
|
357
|
+
* @since 0.9.0
|
|
358
|
+
*/
|
|
359
|
+
export function makeMockTags(opts = {}) {
|
|
360
|
+
const labels = new Map();
|
|
361
|
+
// `plugin` vs `feed`: which rows this plugin is allowed to take back.
|
|
362
|
+
const episodeRows = [];
|
|
363
|
+
const subjects = new Map();
|
|
364
|
+
const remember = (canonical, spelling) => {
|
|
365
|
+
if (!labels.has(canonical))
|
|
366
|
+
labels.set(canonical, spelling.trim().replace(/\s+/g, ' '));
|
|
367
|
+
};
|
|
368
|
+
const addEpisodeRow = (slug, tag, source) => {
|
|
369
|
+
const canonical = canonicalTag(tag);
|
|
370
|
+
remember(canonical, tag);
|
|
371
|
+
if (!episodeRows.some((r) => r.slug === slug && r.tag === canonical && r.source === source)) {
|
|
372
|
+
episodeRows.push({ slug, tag: canonical, source });
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
const addSubject = (subjectKey, tag) => {
|
|
376
|
+
if (subjectKey === '')
|
|
377
|
+
throw new Error('subjectKey must not be blank');
|
|
378
|
+
const canonical = canonicalTag(tag);
|
|
379
|
+
remember(canonical, tag);
|
|
380
|
+
const existing = subjects.get(subjectKey) ?? new Set();
|
|
381
|
+
existing.add(canonical);
|
|
382
|
+
subjects.set(subjectKey, existing);
|
|
383
|
+
};
|
|
384
|
+
const requireEpisodeWrites = () => {
|
|
385
|
+
if (!opts.writesEpisodes) {
|
|
386
|
+
throw new Error("this plugin's manifest does not declare tags.writesEpisodes; " +
|
|
387
|
+
'pass { writesEpisodes: true } to makeMockTags to test the granted case');
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
const infoFor = (canonical) => ({
|
|
391
|
+
tag: canonical,
|
|
392
|
+
label: labels.get(canonical) ?? canonical,
|
|
393
|
+
episodes: new Set(episodeRows.filter((r) => r.tag === canonical).map((r) => r.slug)).size,
|
|
394
|
+
subjects: [...subjects.values()].filter((tags) => tags.has(canonical)).length,
|
|
395
|
+
});
|
|
396
|
+
const tagsOnEpisode = (slug) => [...new Set(episodeRows.filter((r) => r.slug === slug).map((r) => r.tag))].sort();
|
|
397
|
+
for (const [slug, tags] of Object.entries(opts.episodes ?? {})) {
|
|
398
|
+
for (const tag of tags)
|
|
399
|
+
addEpisodeRow(slug, tag, 'plugin');
|
|
400
|
+
}
|
|
401
|
+
for (const [subjectKey, tags] of Object.entries(opts.subjects ?? {})) {
|
|
402
|
+
for (const tag of tags)
|
|
403
|
+
addSubject(subjectKey, tag);
|
|
404
|
+
}
|
|
405
|
+
const client = {
|
|
406
|
+
get episodeTags() {
|
|
407
|
+
const byEpisode = {};
|
|
408
|
+
for (const row of episodeRows)
|
|
409
|
+
byEpisode[row.slug] = tagsOnEpisode(row.slug);
|
|
410
|
+
return byEpisode;
|
|
411
|
+
},
|
|
412
|
+
get subjectTags() {
|
|
413
|
+
const bySubject = {};
|
|
414
|
+
for (const [key, tags] of subjects)
|
|
415
|
+
bySubject[key] = [...tags].sort();
|
|
416
|
+
return bySubject;
|
|
417
|
+
},
|
|
418
|
+
withFeedTag(episodeSlug, tag) {
|
|
419
|
+
addEpisodeRow(episodeSlug, tag, 'feed');
|
|
420
|
+
return client;
|
|
421
|
+
},
|
|
422
|
+
all: async () => [...labels.keys()]
|
|
423
|
+
.map(infoFor)
|
|
424
|
+
// A tag stops existing when nothing carries it — the host keeps no empty vocabulary rows.
|
|
425
|
+
.filter((info) => info.episodes > 0 || info.subjects > 0)
|
|
426
|
+
.sort((a, b) => b.episodes + b.subjects - (a.episodes + a.subjects) || a.tag.localeCompare(b.tag)),
|
|
427
|
+
episodesWith: async (tag) => {
|
|
428
|
+
const canonical = canonicalTag(tag);
|
|
429
|
+
return [...new Set(episodeRows.filter((r) => r.tag === canonical).map((r) => r.slug))].sort();
|
|
430
|
+
},
|
|
431
|
+
tagsOn: async (episodeSlug) => tagsOnEpisode(episodeSlug),
|
|
432
|
+
similarTo: async (tag, limit = 10) => {
|
|
433
|
+
const canonical = canonicalTag(tag);
|
|
434
|
+
const shared = new Map();
|
|
435
|
+
const bump = (other) => {
|
|
436
|
+
if (other !== canonical)
|
|
437
|
+
shared.set(other, (shared.get(other) ?? 0) + 1);
|
|
438
|
+
};
|
|
439
|
+
for (const slug of new Set(episodeRows.filter((r) => r.tag === canonical).map((r) => r.slug))) {
|
|
440
|
+
tagsOnEpisode(slug).forEach(bump);
|
|
441
|
+
}
|
|
442
|
+
for (const tags of subjects.values()) {
|
|
443
|
+
if (tags.has(canonical))
|
|
444
|
+
tags.forEach(bump);
|
|
445
|
+
}
|
|
446
|
+
return [...shared.entries()]
|
|
447
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
448
|
+
.slice(0, Math.max(0, limit))
|
|
449
|
+
.map(([other]) => infoFor(other));
|
|
450
|
+
},
|
|
451
|
+
subjectsWith: async (tag) => {
|
|
452
|
+
const canonical = canonicalTag(tag);
|
|
453
|
+
return [...subjects.entries()]
|
|
454
|
+
.filter(([, tags]) => tags.has(canonical))
|
|
455
|
+
.map(([key]) => key)
|
|
456
|
+
.sort();
|
|
457
|
+
},
|
|
458
|
+
tagsOnSubject: async (subjectKey) => [...(subjects.get(subjectKey) ?? [])].sort(),
|
|
459
|
+
tagSubject: async (subjectKey, tag) => {
|
|
460
|
+
addSubject(subjectKey, tag);
|
|
461
|
+
},
|
|
462
|
+
untagSubject: async (subjectKey, tag) => {
|
|
463
|
+
const tags = subjects.get(subjectKey);
|
|
464
|
+
if (!tags)
|
|
465
|
+
return;
|
|
466
|
+
tags.delete(canonicalTag(tag));
|
|
467
|
+
if (tags.size === 0)
|
|
468
|
+
subjects.delete(subjectKey);
|
|
469
|
+
},
|
|
470
|
+
tagEpisode: async (episodeSlug, tag) => {
|
|
471
|
+
requireEpisodeWrites();
|
|
472
|
+
addEpisodeRow(episodeSlug, tag, 'plugin');
|
|
473
|
+
},
|
|
474
|
+
untagEpisode: async (episodeSlug, tag) => {
|
|
475
|
+
requireEpisodeWrites();
|
|
476
|
+
const canonical = canonicalTag(tag);
|
|
477
|
+
// Only this plugin's row. A tag the feed also put here stays, and the episode keeps carrying it.
|
|
478
|
+
const at = episodeRows.findIndex((r) => r.slug === episodeSlug && r.tag === canonical && r.source === 'plugin');
|
|
479
|
+
if (at >= 0)
|
|
480
|
+
episodeRows.splice(at, 1);
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
return client;
|
|
484
|
+
}
|
|
485
|
+
/** Resolves a {@link DocTarget} to the partition path the host would address. */
|
|
486
|
+
function docPath(target) {
|
|
487
|
+
if (target === 'self')
|
|
488
|
+
return 'data/user/me';
|
|
489
|
+
if (target === 'site')
|
|
490
|
+
return 'data/site/main';
|
|
491
|
+
return `data/${target.type}/${encodeURIComponent(target.id)}`;
|
|
492
|
+
}
|
|
493
|
+
function requireDocKey(key) {
|
|
494
|
+
if (!DOC_KEY_PATTERN.test(key)) {
|
|
495
|
+
throw new Error(`doc key must match ${DOC_KEY_PATTERN.source}, got: ${JSON.stringify(key)}`);
|
|
496
|
+
}
|
|
497
|
+
return key;
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* A {@link DocClient} double: an in-memory store that **validates keys the way the client does**.
|
|
501
|
+
*
|
|
502
|
+
* A key with a `/` in it, or one over 200 characters, throws here rather than silently working — which
|
|
503
|
+
* matters, because against a permissive double the failure would first appear as a 400 in production.
|
|
504
|
+
*
|
|
505
|
+
* ```ts
|
|
506
|
+
* const docs = makeMockDocs({ 'data/user/me/marks': { b3: true } });
|
|
507
|
+
* const ctx = makeMockCtx({ docs });
|
|
508
|
+
*
|
|
509
|
+
* await mount(ctx);
|
|
510
|
+
* expect(docs.stored['data/user/me/marks']).toEqual({ b3: true, b4: true });
|
|
511
|
+
* ```
|
|
512
|
+
*
|
|
513
|
+
* @param initial documents to start with, keyed `"<partition>/<key>"`
|
|
514
|
+
* @returns a doc client double with an inspectable `stored` map
|
|
515
|
+
* @since 0.9.0
|
|
516
|
+
*/
|
|
517
|
+
export function makeMockDocs(initial = {}) {
|
|
518
|
+
const stored = { ...initial };
|
|
519
|
+
return {
|
|
520
|
+
stored,
|
|
521
|
+
get: async (target, key) => (stored[`${docPath(target)}/${requireDocKey(key)}`] ?? null),
|
|
522
|
+
put: async (target, key, value) => {
|
|
523
|
+
stored[`${docPath(target)}/${requireDocKey(key)}`] = value;
|
|
524
|
+
},
|
|
525
|
+
list: async (target, opts) => {
|
|
526
|
+
const prefix = `${docPath(target)}/`;
|
|
527
|
+
const items = Object.entries(stored)
|
|
528
|
+
.filter(([path]) => path.startsWith(prefix))
|
|
529
|
+
.map(([path, value]) => ({ key: path.slice(prefix.length), value }))
|
|
530
|
+
.filter((entry) => entry.key.startsWith(opts?.prefix ?? ''))
|
|
531
|
+
.sort((a, b) => a.key.localeCompare(b.key));
|
|
532
|
+
const size = opts?.size ?? 50;
|
|
533
|
+
const page = opts?.page ?? 0;
|
|
534
|
+
const result = {
|
|
535
|
+
items: items.slice(page * size, page * size + size),
|
|
536
|
+
page,
|
|
537
|
+
size,
|
|
538
|
+
totalElements: items.length,
|
|
539
|
+
totalPages: Math.ceil(items.length / size),
|
|
540
|
+
};
|
|
541
|
+
return result;
|
|
542
|
+
},
|
|
543
|
+
remove: async (target, key) => {
|
|
544
|
+
// Idempotent, like the host: removing what is gone resolves rather than rejecting.
|
|
545
|
+
delete stored[`${docPath(target)}/${requireDocKey(key)}`];
|
|
546
|
+
},
|
|
547
|
+
};
|
|
548
|
+
}
|
|
200
549
|
/** Escapes a string for literal use inside a `RegExp` — the non-wildcard parts of a `like` pattern. */
|
|
201
550
|
function escapeRegExp(literal) {
|
|
202
551
|
return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
@@ -212,19 +561,122 @@ export const DEFAULT_THEME = {
|
|
|
212
561
|
accent2: '#7048e8',
|
|
213
562
|
border: '#dddddd',
|
|
214
563
|
};
|
|
564
|
+
/**
|
|
565
|
+
* A {@link BlobClient} double: uploads land in memory, `urlFor` returns the host's URL shape, and every
|
|
566
|
+
* call is recorded.
|
|
567
|
+
*
|
|
568
|
+
* **It refuses what the host refuses.** The per-file ceiling, the quota and the type allow-list are
|
|
569
|
+
* enforced here, because a component that only ever meets an accepting double will meet its first refusal
|
|
570
|
+
* in front of a podcaster — and a refusal is the case worth writing a test for, since the person who picked
|
|
571
|
+
* the file is the only one who can pick a different one.
|
|
572
|
+
*
|
|
573
|
+
* What it does **not** do is read file formats: the host refuses a file whose bytes contradict its declared
|
|
574
|
+
* type, and a second, diverging copy of that rule here would be worse than none. Drive that case with a
|
|
575
|
+
* `File` named in `rejectContent`.
|
|
576
|
+
*
|
|
577
|
+
* @param opts limits and refusals; the defaults are small on purpose, so a test moving real quantities of
|
|
578
|
+
* data has to say so
|
|
579
|
+
* @returns a recording, in-memory blob client
|
|
580
|
+
*
|
|
581
|
+
* @example
|
|
582
|
+
* ```ts
|
|
583
|
+
* const blobs = makeMockBlobs({ mimeTypes: ['image/png'] });
|
|
584
|
+
* const ctx = makeMockCtx({ blobs });
|
|
585
|
+
*
|
|
586
|
+
* await mount(ctx);
|
|
587
|
+
* expect(blobs.uploads[0]).toMatchObject({ filename: 'diagram.png', mime: 'image/png' });
|
|
588
|
+
* ```
|
|
589
|
+
*/
|
|
590
|
+
export function makeMockBlobs(opts = {}) {
|
|
591
|
+
const mimeTypes = opts.mimeTypes ?? ['image/png', 'image/jpeg', 'image/webp', 'image/gif'];
|
|
592
|
+
const maxFileBytes = opts.maxFileBytes ?? 1024 * 1024;
|
|
593
|
+
const quotaBytes = opts.quotaBytes ?? 8 * 1024 * 1024;
|
|
594
|
+
const rejected = new Set(opts.rejectContent ?? []);
|
|
595
|
+
const uploads = [];
|
|
596
|
+
const removals = [];
|
|
597
|
+
const stored = [];
|
|
598
|
+
let nextRef = 1;
|
|
599
|
+
const usedBytes = () => stored.reduce((sum, blob) => sum + blob.size, 0);
|
|
600
|
+
const client = {
|
|
601
|
+
uploads,
|
|
602
|
+
removals,
|
|
603
|
+
stored,
|
|
604
|
+
upload: (file, uploadOpts) => {
|
|
605
|
+
const filename = uploadOpts?.filename ?? (file instanceof File ? file.name : null);
|
|
606
|
+
// The same normalisation the real client applies, so a `File` with an empty `type` — what Firefox
|
|
607
|
+
// hands over when the OS MIME lookup fails — is accepted here exactly as the host accepts it.
|
|
608
|
+
const declared = uploadOpts?.declaredType === 'preserve' ? file.type : declaredTypeFor(file);
|
|
609
|
+
uploads.push({ filename, mime: declared, size: file.size });
|
|
610
|
+
if (!mimeTypes.includes(declared)) {
|
|
611
|
+
return Promise.reject(new Error(`content type not allowed for this plugin: ${declared}`));
|
|
612
|
+
}
|
|
613
|
+
if (filename != null && rejected.has(filename)) {
|
|
614
|
+
return Promise.reject(new Error(`content does not match the declared type: ${declared}`));
|
|
615
|
+
}
|
|
616
|
+
if (file.size > maxFileBytes) {
|
|
617
|
+
return Promise.reject(new Error(`file is larger than this plugin may store: ${file.size} > ${maxFileBytes}`));
|
|
618
|
+
}
|
|
619
|
+
if (usedBytes() + file.size > quotaBytes) {
|
|
620
|
+
return Promise.reject(new Error(`storing this file would exceed the plugin's quota`));
|
|
621
|
+
}
|
|
622
|
+
const info = {
|
|
623
|
+
ref: `blob-${nextRef++}`,
|
|
624
|
+
filename,
|
|
625
|
+
mime: declared,
|
|
626
|
+
size: file.size,
|
|
627
|
+
updatedAt: new Date().toISOString(),
|
|
628
|
+
};
|
|
629
|
+
stored.push(info);
|
|
630
|
+
return Promise.resolve(info);
|
|
631
|
+
},
|
|
632
|
+
list: (listOpts) => {
|
|
633
|
+
const page = listOpts?.page ?? 0;
|
|
634
|
+
const size = listOpts?.size ?? 50;
|
|
635
|
+
// Newest first, like the host — a component that renders the list in order shows the same thing here.
|
|
636
|
+
const newestFirst = [...stored].reverse();
|
|
637
|
+
const from = Math.min(page * size, newestFirst.length);
|
|
638
|
+
const result = {
|
|
639
|
+
items: newestFirst.slice(from, from + size),
|
|
640
|
+
page,
|
|
641
|
+
size,
|
|
642
|
+
total: newestFirst.length,
|
|
643
|
+
};
|
|
644
|
+
return Promise.resolve(result);
|
|
645
|
+
},
|
|
646
|
+
remove: (ref) => {
|
|
647
|
+
removals.push(ref);
|
|
648
|
+
const at = stored.findIndex((blob) => blob.ref === ref);
|
|
649
|
+
if (at >= 0) {
|
|
650
|
+
stored.splice(at, 1);
|
|
651
|
+
}
|
|
652
|
+
// Idempotent, like the host: removing what is gone resolves rather than rejecting.
|
|
653
|
+
return Promise.resolve();
|
|
654
|
+
},
|
|
655
|
+
urlFor: (ref) => `/api/plugins/test/blob/${ref}`,
|
|
656
|
+
quota: () => {
|
|
657
|
+
const quota = { usedBytes: usedBytes(), quotaBytes, maxFileBytes };
|
|
658
|
+
return Promise.resolve(quota);
|
|
659
|
+
},
|
|
660
|
+
};
|
|
661
|
+
return client;
|
|
662
|
+
}
|
|
215
663
|
/**
|
|
216
664
|
* Builds a {@link PluginContext} wired with in-memory doubles for unit tests.
|
|
217
665
|
*
|
|
218
666
|
* Defaults: `site` scope, no episodes, anonymous user, **all consent denied** (a {@link makeMockConsent}
|
|
219
667
|
* double — pass your own to drive grants), empty filter, a player
|
|
220
|
-
* parked at 0s, empty route, `en` locale, unknown progress, and
|
|
221
|
-
* change any field; the returned `api` is a
|
|
222
|
-
* collects every `ctx.log(...)`.
|
|
668
|
+
* parked at 0s, empty route with an empty query and hash, `en` locale, unknown progress, and
|
|
669
|
+
* {@link DEFAULT_THEME}. Pass overrides to change any field; the returned `api` is a
|
|
670
|
+
* {@link MockApiClient} recording every call, and `logs` collects every `ctx.log(...)`.
|
|
671
|
+
*
|
|
672
|
+
* `docs` and `feeds` are real doubles ({@link makeMockDocs}, {@link makeMockFeeds}), because every plugin
|
|
673
|
+
* has both — the empty ones give a component nothing to render, which is the case worth defaulting to.
|
|
223
674
|
*
|
|
224
|
-
* `episodeLabels` is deliberately **absent** by default, and `schema`
|
|
225
|
-
* the real context — the host supplies labels partially, and gives a
|
|
226
|
-
*
|
|
227
|
-
*
|
|
675
|
+
* `episodeLabels` is deliberately **absent** by default, and `schema`, `blobs` and `tags` are **`null`**.
|
|
676
|
+
* All four are optional on the real context — the host supplies labels partially, and gives a plugin no
|
|
677
|
+
* schema, no blob store and no tag surface unless its manifest declares them — so a component that needs
|
|
678
|
+
* any of them has to survive its absence. The mock makes you face that unless you pass one in
|
|
679
|
+
* ({@link makeMockSchema}, {@link makeMockBlobs}, {@link makeMockTags}).
|
|
228
680
|
*
|
|
229
681
|
* **`route` is the one override that merges** rather than replacing: `route: { path: 'kraken' }` pins the
|
|
230
682
|
* subpath and keeps the recording `navigate`. Everything else is all-or-nothing, because everything else
|
|
@@ -245,9 +697,21 @@ export function makeMockCtx(overrides = {}) {
|
|
|
245
697
|
episodes: [],
|
|
246
698
|
user: null,
|
|
247
699
|
api: mockApi,
|
|
700
|
+
// Real doubles rather than null: every plugin has a doc store and every plugin can read snapshots,
|
|
701
|
+
// so there is no "declared it or not" case for a component to handle here.
|
|
702
|
+
docs: makeMockDocs(),
|
|
703
|
+
feeds: makeMockFeeds(),
|
|
704
|
+
// Null, like schema and blobs: `ctx.tags` exists only for a plugin whose manifest declares a `tags`
|
|
705
|
+
// block, and a component written against a context that always has one breaks on every plugin that
|
|
706
|
+
// does not.
|
|
707
|
+
tags: null,
|
|
248
708
|
// Null, not a client: a plugin only has one if its manifest declares `storage.schema`, and a
|
|
249
709
|
// component written against a schema that is always there never handles the doc-store case.
|
|
250
710
|
schema: null,
|
|
711
|
+
// Null for the same reason, and it matters more here: `blobs` is the newer member, so a component
|
|
712
|
+
// written against a context that always has it would break on every plugin that declares no `blobs`
|
|
713
|
+
// block — which is most of them.
|
|
714
|
+
blobs: null,
|
|
251
715
|
logs,
|
|
252
716
|
navigations,
|
|
253
717
|
log: (level, message) => {
|
|
@@ -260,6 +724,10 @@ export function makeMockCtx(overrides = {}) {
|
|
|
260
724
|
player: { currentTime: () => 0, seekTo: () => { }, on: () => noop },
|
|
261
725
|
route: {
|
|
262
726
|
path: '',
|
|
727
|
+
// Parsed like the host's, and empty by default — a component reading a filter off the query has to
|
|
728
|
+
// survive arriving without one, which is how a visitor first reaches the page.
|
|
729
|
+
query: new URLSearchParams(),
|
|
730
|
+
hash: '',
|
|
263
731
|
onChange: () => noop,
|
|
264
732
|
// Recorded rather than applied: the double has no router and no URL, so `path` does not move.
|
|
265
733
|
// Assert on `navigations`; drive a route change by rendering again with a different `path`.
|
|
@@ -267,6 +735,29 @@ export function makeMockCtx(overrides = {}) {
|
|
|
267
735
|
navigations.push({ subpath, replace: opts?.replace ?? false });
|
|
268
736
|
},
|
|
269
737
|
},
|
|
738
|
+
// A real implementation, not a stub: these are pure string builders, so the double can simply be
|
|
739
|
+
// right. It mirrors the host's URL shapes (`ShellController`), and core has a test pinning them
|
|
740
|
+
// together — a mock that invented its own would let a component pass here and link nowhere in
|
|
741
|
+
// production.
|
|
742
|
+
links: {
|
|
743
|
+
episode: (slug, linkOpts) => {
|
|
744
|
+
const t = linkOpts?.t;
|
|
745
|
+
const at = t != null && Number.isFinite(t) && t > 0 ? `?t=${Math.floor(t)}` : '';
|
|
746
|
+
return `/episodes/${encodeURIComponent(slug)}${at}`;
|
|
747
|
+
},
|
|
748
|
+
feed: (slug, linkOpts) => {
|
|
749
|
+
const params = new URLSearchParams();
|
|
750
|
+
if (linkOpts?.season)
|
|
751
|
+
params.set('season', linkOpts.season);
|
|
752
|
+
if (linkOpts?.tag)
|
|
753
|
+
params.set('tag', linkOpts.tag);
|
|
754
|
+
// `newest` is the host's default and is left out, so one view has one URL.
|
|
755
|
+
if (linkOpts?.order === 'oldest')
|
|
756
|
+
params.set('order', 'oldest');
|
|
757
|
+
const query = params.toString();
|
|
758
|
+
return `/feeds/${encodeURIComponent(slug)}${query ? `?${query}` : ''}`;
|
|
759
|
+
},
|
|
760
|
+
},
|
|
270
761
|
locale: { current: () => 'en', onChange: () => noop },
|
|
271
762
|
progress: { get: () => Promise.resolve(null) },
|
|
272
763
|
theme: DEFAULT_THEME,
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mosaicast/plugin-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Versioned plugin contract for Mosaicast: the frontend PluginContext types, a Web Component base helper, an i18n helper, plus a test kit under the /testing subpath.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|