BMAD-METHOD/bmad-mcp/tests/server-unified-integration....

110 lines
4.0 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach } from "vitest";
import { promises as fs } from "fs";
import { join } from "path";
import { BmadMcpServer } from "../src/server.js";
import { ResourceProvider } from "../src/providers/resourceProvider.js";
describe("BmadMcpServer - Unified Resources Integration", () => {
let server: BmadMcpServer;
let tempDir: string;
let checklistsDir: string;
let templatesDir: string;
beforeEach(async () => {
// Create temporary directory structure
tempDir = await fs.mkdtemp("/tmp/bmad-test-");
checklistsDir = join(tempDir, "bmad-core", "checklists");
templatesDir = join(tempDir, "bmad-core", "templates");
await fs.mkdir(checklistsDir, { recursive: true });
await fs.mkdir(templatesDir, { recursive: true });
// Create test checklist files
await fs.writeFile(
join(checklistsDir, "pm-checklist.md"),
`# PM Checklist
Product Manager requirements checklist for ensuring comprehensive project definition.
- [ ] Define user stories
- [ ] Create acceptance criteria
- [ ] Validate business requirements`
);
// Create test template files
await fs.writeFile(
join(templatesDir, "prd-tmpl.md"),
`# Product Requirements Document Template
## Overview
[Brief description of the product]
## Requirements
[Detailed requirements here]`
);
// Initialize server
server = new BmadMcpServer();
});
afterEach(async () => {
// Clean up temp directory
await fs.rm(tempDir, { recursive: true, force: true });
});
describe("Resource Provider Integration", () => {
it("should create ResourceProvider instances for each resource type", () => {
expect(server).toBeDefined();
expect(server).toBeInstanceOf(BmadMcpServer);
// Verify server was constructed successfully
const resourceProviders = (server as any).resourceProviders;
expect(resourceProviders).toBeDefined();
expect(resourceProviders.has("Template")).toBe(true);
expect(resourceProviders.has("Checklist")).toBe(true);
expect(resourceProviders.has("Agent")).toBe(true);
expect(resourceProviders.has("Data")).toBe(true);
expect(resourceProviders.has("Task")).toBe(true);
expect(resourceProviders.has("Util")).toBe(true);
expect(resourceProviders.has("Workflow")).toBe(true);
});
it("should have resource configurations with proper settings", () => {
const resourceConfigs = (server as any).resourceConfigs;
expect(resourceConfigs).toHaveLength(7); // Agent, Checklist, Data, Task, Template, Util, Workflow
const templateConfig = resourceConfigs.find((c: any) => c.resourceType === "Template");
expect(templateConfig).toBeDefined();
expect(templateConfig.supportedExtensions).toEqual([".md"]);
expect(templateConfig.directory).toBe("templates");
const checklistConfig = resourceConfigs.find((c: any) => c.resourceType === "Checklist");
expect(checklistConfig).toBeDefined();
expect(checklistConfig.supportedExtensions).toEqual([".md"]);
expect(checklistConfig.directory).toBe("checklists");
// Verify some of the other resource types are present
const agentConfig = resourceConfigs.find((c: any) => c.resourceType === "Agent");
expect(agentConfig).toBeDefined();
expect(agentConfig.supportedExtensions).toEqual([".md"]);
expect(agentConfig.directory).toBe("agents");
const workflowConfig = resourceConfigs.find((c: any) => c.resourceType === "Workflow");
expect(workflowConfig).toBeDefined();
expect(workflowConfig.supportedExtensions).toEqual([".yml"]);
expect(workflowConfig.directory).toBe("workflows");
});
});
describe("MIME Type Handling", () => {
it("should correctly determine MIME types", () => {
const getMimeType = (server as any).getMimeTypeForExtension.bind(server);
expect(getMimeType("md")).toBe("text/markdown");
expect(getMimeType("txt")).toBe("text/plain");
expect(getMimeType("json")).toBe("application/json");
expect(getMimeType("unknown")).toBe("text/plain");
});
});
});