Testare plugin in sandbox

In questa pagina

@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.