@emdash-cms/plugin-test baut ein Sandbox-Plugin und führt seine Tests in workerd aus. Tests verwenden den Produktions-Cloudflare-Sandbox-Wrapper von EmDash und PluginBridge, mit lokalen D1- und Worker-Loader-Bindings, die von @cloudflare/vitest-plugin bereitgestellt werden.
Projekte, die mit emdash-plugin init erstellt wurden, enthalten dieses Setup. Bestehende Plugin-Projekte können den Test-Host als Entwicklungsabhängigkeit installieren:
pnpm add -D @emdash-cms/plugin-test vitest
Wenn das Projekt Build-Skripte von Abhängigkeiten einschränkt, erlauben Sie workerd, seine Plattform-Binärdatei zu installieren. Die generierte pnpm-Richtlinie enthält diesen Eintrag:
allowBuilds:
workerd: true
Vitest konfigurieren
Fügen Sie das EmDash-Test-Plugin zur Vitest-Konfiguration des Projekts hinzu:
import { emdashPluginTest } from "@emdash-cms/plugin-test/config";
import { defineConfig } from "vitest/config";
export default defineConfig({
plugins: [emdashPluginTest()],
});
emdashPluginTest() führt den Plugin-Build vor dem Start von Vitest aus. Es liest die generierte Laufzeit und das Manifest, erstellt eine isolierte D1-Datenbank und ein Worker-Loader-Binding und exportiert dieselbe PluginBridge, die von Cloudflare-Bereitstellungen verwendet wird. Übergeben Sie { dir: "./packages/gallery" }, wenn die Vitest-Konfiguration außerhalb des Plugin-Verzeichnisses liegt.
Eine Route testen
Erstellen und entsorgen Sie einen Host in jedem Test. Die Entsorgung stoppt das Plugin und setzt seine Test-Bindings zurück:
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() akzeptiert einen Eingabewert und optionale Anfrage-Eigenschaften. Die Standardanfrage ist ein POST an die Plugin-Route mit leeren Headern und Anfrage-Metadaten.
Hooks und Speicher testen
Rufen Sie Hooks mit der Ereignisform auf, die sie von EmDash erhalten. Die Storage- und KV-Reader inspizieren den Zustand, der über die Bridge geschrieben wurde:
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",
});
Storage-Aufrufe erzwingen weiterhin die in emdash-plugin.jsonc deklarierten Sammlungen. Inhalts-, Medien-, Benutzer-, E-Mail- und Netzwerkaufrufe erzwingen weiterhin die deklarierten Fähigkeiten und erlaubten Hosts des Plugins.
Inhalte vorbelegen
Erstellen Sie eine Sammlung und belegen Sie Einträge vor, bevor Sie eine Route oder einen Hook aufrufen, der Website-Inhalte liest:
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 });
Die Sammlung und Einträge verwenden die echte EmDash-Schema-Registry und das Inhalts-Repository gegen D1.
Testgrenzen
Der Host deckt das gebaute Plugin, die Isolationsgrenze, die Remote-Procedure-Call-Serialisierung, das D1-Verhalten, Fähigkeitsprüfungen, Hooks, Routen, KV und den deklarierten Speicher ab. Er rendert nicht die EmDash-Admin-Anwendung und reproduziert nicht die CPU-, Speicher- und Unteranfrage-Limits von Cloudflare-Bereitstellungen. Verwenden Sie eine Wegwerf-EmDash-Site für Browser-Journeys und überprüfen Sie limit-sensitives Verhalten auf einer Cloudflare-Vorschau- oder Staging-Bereitstellung.
Für Block-Kit-Handler rufen Sie die admin-Route des Plugins auf und bestätigen Sie das zurückgegebene Block-Dokument. Verwenden Sie den Block Playground oder einen Browser-Journey, um das gerenderte Layout und die Interaktionen zu überprüfen.