110 lines
4.0 KiB
TypeScript
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");
|
|
});
|
|
});
|
|
});
|