@emdash-cms/plugin-test costruisce un plugin in sandbox ed esegue i suoi test all’interno di workerd. I test utilizzano il wrapper del sandbox di produzione Cloudflare di EmDash e PluginBridge, con binding locali D1 e Worker Loader forniti da @cloudflare/vitest-plugin.
I progetti creati con emdash-plugin init includono questa configurazione. I progetti di plugin esistenti possono installare l’host di test come dipendenza di sviluppo:
pnpm add -D @emdash-cms/plugin-test vitest
Se il progetto limita gli script di build delle dipendenze, consenti a workerd di installare il suo binario di piattaforma. La policy pnpm generata include questa voce:
allowBuilds:
workerd: true
Configurare Vitest
Aggiungi il plugin di test EmDash alla configurazione Vitest del progetto:
import { emdashPluginTest } from "@emdash-cms/plugin-test/config";
import { defineConfig } from "vitest/config";
export default defineConfig({
plugins: [emdashPluginTest()],
});
emdashPluginTest() esegue il build del plugin prima dell’avvio di Vitest. Legge il runtime e il manifesto generati, crea un database D1 isolato e un binding Worker Loader, ed esporta lo stesso PluginBridge utilizzato dai deployment Cloudflare. Passa { dir: "./packages/gallery" } quando la configurazione Vitest si trova al di fuori della directory del plugin.
Testare una route
Crea e distruggi un host in ogni test. La distruzione arresta il plugin e reimposta i suoi binding di test:
import { afterEach, describe, expect, it } from "vitest";
import { createPluginTestHost, type PluginTestHost } from "@emdash-cms/plugin-test";
let host: PluginTestHost | undefined;
afterEach(async () => {
await host?.dispose();
host = undefined;
});
describe("health route", () => {
it("identifies the plugin", async () => {
host = await createPluginTestHost();
await expect(host.invokeRoute("health")).resolves.toEqual({
ok: true,
plugin: "save-log",
});
});
});
invokeRoute() accetta un valore di input e proprietà di richiesta opzionali. La richiesta predefinita è un POST alla route del plugin con header vuoti e metadati di richiesta.
Testare hook e storage
Invoca gli hook con la forma dell’evento che ricevono da EmDash. I lettori di storage e KV ispezionano lo stato scritto attraverso il bridge:
host = await createPluginTestHost();
await host.invokeHook("content:afterSave", {
collection: "posts",
content: { id: "post-1", title: "First post" },
});
const events = await host.storage("events").list();
expect(events).toHaveLength(1);
expect(events[0]?.data).toMatchObject({
collection: "posts",
contentId: "post-1",
});
Le chiamate di storage continuano ad applicare le collezioni dichiarate in emdash-plugin.jsonc. Le chiamate di contenuto, media, utente, email e rete continuano ad applicare le capacità dichiarate e gli host consentiti del plugin.
Popolare il contenuto
Crea una collezione e popola le voci prima di invocare una route o un hook che legge il contenuto del sito:
host = await createPluginTestHost();
await host.createCollection({
slug: "posts",
label: "Posts",
fields: [{ slug: "title", label: "Title", type: "string" }],
});
await host.seedContent("posts", [{ title: "First" }, { title: "Second" }]);
await expect(host.invokeRoute("post-count")).resolves.toEqual({ count: 2 });
La collezione e le voci utilizzano il vero registro di schemi EmDash e il repository di contenuti contro D1.
Limiti dei test
L’host copre il plugin costruito, il confine di isolamento, la serializzazione delle chiamate a procedura remota, il comportamento di D1, i controlli delle capacità, gli hook, le route, KV e lo storage dichiarato. Non renderizza l’applicazione di amministrazione EmDash e non riproduce i limiti di CPU, memoria e sotto-richieste dei deployment Cloudflare. Usa un sito EmDash usa e getta per i percorsi del browser, e verifica il comportamento sensibile ai limiti su un deployment di anteprima o staging di Cloudflare.
Per i gestori Block Kit, invoca la route admin del plugin e verifica il documento di blocchi restituito. Usa il Block Playground o un percorso del browser per verificare il layout renderizzato e le interazioni.