@emdash-cms/plugin-test construit un plugin en sandbox et exécute ses tests dans workerd. Les tests utilisent le wrapper du sandbox de production Cloudflare d’EmDash et PluginBridge, avec des bindings D1 locaux et Worker Loader fournis par @cloudflare/vitest-plugin.
Les projets créés avec emdash-plugin init incluent cette configuration. Les projets de plugins existants peuvent installer l’hôte de test comme dépendance de développement :
pnpm add -D @emdash-cms/plugin-test vitest
Si le projet restreint les scripts de build des dépendances, autorisez workerd à installer son binaire de plateforme. La politique pnpm générée inclut cette entrée :
allowBuilds:
workerd: true
Configurer Vitest
Ajoutez le plugin de test EmDash à la configuration Vitest du projet :
import { emdashPluginTest } from "@emdash-cms/plugin-test/config";
import { defineConfig } from "vitest/config";
export default defineConfig({
plugins: [emdashPluginTest()],
});
emdashPluginTest() exécute le build du plugin avant le démarrage de Vitest. Il lit le runtime et le manifeste générés, crée une base de données D1 isolée et un binding Worker Loader, et exporte le même PluginBridge utilisé par les déploiements Cloudflare. Passez { dir: "./packages/gallery" } lorsque la configuration Vitest se trouve en dehors du répertoire du plugin.
Tester une route
Créez et détruisez un hôte dans chaque test. La destruction arrête le plugin et réinitialise ses bindings de 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() accepte une valeur d’entrée et des propriétés de requête optionnelles. La requête par défaut est un POST vers la route du plugin avec des en-têtes vides et des métadonnées de requête.
Tester les hooks et le stockage
Invoquez les hooks avec la forme d’événement qu’ils reçoivent d’EmDash. Les lecteurs de stockage et KV inspectent l’état écrit via le 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",
});
Les appels de stockage continuent d’appliquer les collections déclarées dans emdash-plugin.jsonc. Les appels de contenu, média, utilisateur, e-mail et réseau continuent d’appliquer les capacités déclarées et les hôtes autorisés du plugin.
Amorcer du contenu
Créez une collection et amorcez des entrées avant d’invoquer une route ou un hook qui lit le contenu du site :
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 collection et les entrées utilisent le vrai registre de schémas EmDash et le dépôt de contenu contre D1.
Limites des tests
L’hôte couvre le plugin construit, la limite d’isolation, la sérialisation des appels de procédures à distance, le comportement de D1, les vérifications de capacités, les hooks, les routes, KV et le stockage déclaré. Il ne rend pas l’application d’administration EmDash et ne reproduit pas les limites de CPU, mémoire et sous-requêtes des déploiements Cloudflare. Utilisez un site EmDash jetable pour les parcours navigateur, et vérifiez le comportement sensible aux limites sur un déploiement de prévisualisation ou de staging Cloudflare.
Pour les gestionnaires Block Kit, invoquez la route admin du plugin et vérifiez le document de blocs retourné. Utilisez le Block Playground ou un parcours navigateur pour vérifier la mise en page rendue et les interactions.