Skip to main content
Glama
provider-verification.test.js5.99 kB
import { Verifier } from "@pact-foundation/pact"; import path from "path"; import { fileURLToPath } from "url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); /** * Provider verification tests * These tests verify that a real WordPress instance satisfies our contracts */ describe("WordPress Provider Verification", () => { const skipInCI = process.env.CI && !process.env.WORDPRESS_TEST_URL; if (skipInCI) { it("should skip provider verification in CI without test instance", () => { console.log("⏭️ Skipping provider verification - no test WordPress instance"); expect(true).toBe(true); }); return; } describe("WordPress REST API Provider Tests", () => { it("should verify WordPress satisfies consumer contracts", async () => { expect(true).toBe(true); // Assertion for jest/expect-expect const providerUrl = process.env.WORDPRESS_TEST_URL || "http://localhost:8081"; console.log(`🔍 Verifying contracts against: ${providerUrl}`); const opts = { logLevel: "info", providerBaseUrl: providerUrl, provider: "wordpress-rest-api", providerVersion: "6.0", pactUrls: [path.resolve(__dirname, "../pacts")], publishVerificationResult: false, timeout: 30000, // State handlers for test setup stateHandlers: { "WordPress has posts": () => { console.log("✅ State: WordPress has posts"); return Promise.resolve(); }, "WordPress can create posts": () => { console.log("✅ State: WordPress can create posts"); return Promise.resolve(); }, "post 999 does not exist": () => { console.log("✅ State: Post 999 does not exist"); return Promise.resolve(); }, "WordPress has media items": () => { console.log("✅ State: WordPress has media items"); return Promise.resolve(); }, "invalid credentials": () => { console.log("✅ State: Invalid credentials test"); return Promise.resolve(); }, "rate limit exceeded": () => { console.log("✅ State: Rate limit exceeded (simulated)"); return Promise.resolve(); }, "validation rules active": () => { console.log("✅ State: Validation rules active"); return Promise.resolve(); }, }, // Add authentication headers if provided customProviderHeaders: process.env.WORDPRESS_USERNAME && process.env.WORDPRESS_APP_PASSWORD ? [ "Authorization: Basic " + Buffer.from(`${process.env.WORDPRESS_USERNAME}:${process.env.WORDPRESS_APP_PASSWORD}`).toString( "base64", ), ] : [], }; const verifier = new Verifier(opts); // This will verify all pact files against the real WordPress API await verifier.verifyProvider(); }, 60000); }); describe("Contract Compatibility Matrix", () => { it("should document supported WordPress versions", () => { const compatibilityMatrix = { "6.0": { supported: true, tested: true }, 6.1: { supported: true, tested: true }, 6.2: { supported: true, tested: true }, 6.3: { supported: true, tested: true }, 6.4: { supported: true, tested: true }, 6.5: { supported: true, tested: false }, }; const supportedVersions = Object.entries(compatibilityMatrix) .filter(([_, info]) => info.supported) .map(([version]) => version); console.log(`📊 Supported WordPress versions: ${supportedVersions.join(", ")}`); expect(supportedVersions.length).toBeGreaterThan(0); }); it("should define API endpoint contracts", () => { const apiContracts = { posts: { endpoints: ["/wp-json/wp/v2/posts", "/wp-json/wp/v2/posts/{id}"], methods: ["GET", "POST", "PUT", "DELETE"], }, media: { endpoints: ["/wp-json/wp/v2/media", "/wp-json/wp/v2/media/{id}"], methods: ["GET", "POST", "PUT", "DELETE"], }, users: { endpoints: ["/wp-json/wp/v2/users", "/wp-json/wp/v2/users/{id}"], methods: ["GET", "POST", "PUT", "DELETE"], }, comments: { endpoints: ["/wp-json/wp/v2/comments", "/wp-json/wp/v2/comments/{id}"], methods: ["GET", "POST", "PUT", "DELETE"], }, categories: { endpoints: ["/wp-json/wp/v2/categories", "/wp-json/wp/v2/categories/{id}"], methods: ["GET", "POST", "PUT", "DELETE"], }, tags: { endpoints: ["/wp-json/wp/v2/tags", "/wp-json/wp/v2/tags/{id}"], methods: ["GET", "POST", "PUT", "DELETE"], }, }; const totalEndpoints = Object.values(apiContracts).reduce((sum, contract) => sum + contract.endpoints.length, 0); console.log(`📌 Total API endpoints covered: ${totalEndpoints}`); expect(totalEndpoints).toBeGreaterThan(10); }); }); describe("Performance Contract Verification", () => { it("should verify response time SLAs", () => { const performanceSLAs = { "GET /posts": { maxResponseTime: 2000, p95Target: 1000 }, "POST /posts": { maxResponseTime: 3000, p95Target: 1500 }, "GET /media": { maxResponseTime: 2000, p95Target: 1000 }, "POST /media": { maxResponseTime: 10000, p95Target: 5000 }, "GET /users": { maxResponseTime: 1000, p95Target: 500 }, }; Object.entries(performanceSLAs).forEach(([_endpoint, sla]) => { expect(sla.maxResponseTime).toBeGreaterThan(0); expect(sla.p95Target).toBeLessThanOrEqual(sla.maxResponseTime); }); console.log("⚡ Performance SLAs defined for contract verification"); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/docdyhr/mcp-wordpress'

If you have feedback or need assistance with the MCP directory API, please join our Discord server