@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/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
- return Promise.resolve(canned);
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 {@link DEFAULT_THEME}. Pass overrides to
221
- * change any field; the returned `api` is a {@link MockApiClient} recording every call, and `logs`
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` is **`null`**. Both are optional on
225
- * the real context — the host supplies labels partially, and gives a doc-store plugin no schema at all — so
226
- * a component that needs either has to survive its absence. The mock makes you face that unless you pass
227
- * one in ({@link makeMockSchema} for the schema).
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,
@@ -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.7.1",
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": {