Skip to main content
Glama

vchart-mcp-server

by VisActor
charts.test.ts7.88 kB
import * as Charts from "../../src/charts/index"; import { sampleChartData } from "../utils/testHelpers"; describe("Chart Schemas", () => { describe("cartesian chart schema", () => { test("should validate valid cartesian chart data", () => { const validData = { dataTable: sampleChartData.dataTable, xField: "month", yField: "sales", chartType: "bar", output: "image", }; const result = Charts.cartesian.schema.safeParse(validData); expect(result.success).toBe(true); if (result.success) { expect(result.data).toEqual(validData); } }); test("should reject invalid cartesian chart data", () => { const invalidData = { dataTable: sampleChartData.dataTable, xField: "month", // yField missing chartType: "bar", }; const result = Charts.cartesian.schema.safeParse(invalidData); expect(result.success).toBe(false); if (!result.success) { // 检查错误数组中是否包含 yField 相关的错误 const yFieldError = result.error.issues.find((issue) => issue.path.includes("yField") ); expect(yFieldError).toBeDefined(); // 修复:使用不区分大小写的检查或匹配 Zod 的实际错误消息 expect(yFieldError?.message.toLowerCase()).toContain("required"); } }); }); describe("polar chart schema", () => { test("should validate valid polar chart data", () => { const validData = { dataTable: sampleChartData.dataTable, categoryField: "month", valueField: "sales", chartType: "radar", output: "image", }; const result = Charts.polar.schema.safeParse(validData); expect(result.success).toBe(true); }); test("should reject invalid chart type", () => { const invalidData = { dataTable: sampleChartData.dataTable, categoryField: "month", valueField: "sales", chartType: "invalid_type", }; const result = Charts.polar.schema.safeParse(invalidData); expect(result.success).toBe(false); if (!result.success) { // 检查错误数组中是否包含 chartType 相关的错误 const chartTypeError = result.error.issues.find((issue) => issue.path.includes("chartType") ); expect(chartTypeError).toBeDefined(); // 更灵活的错误消息检查 expect(chartTypeError?.message).toBeDefined(); } }); }); describe("progress chart schema", () => { test("should validate valid progress chart data", () => { const validData = { dataTable: [{ task: "Project A", progress: 75 }], valueField: "progress", chartType: "linear_progress", output: "image", }; const result = Charts.progress.schema.safeParse(validData); expect(result.success).toBe(true); }); test("should reject invalid progress chart data", () => { const invalidData = { dataTable: [{ task: "Project A", progress: 75 }], // valueField missing chartType: "linear_progress", }; const result = Charts.progress.schema.safeParse(invalidData); expect(result.success).toBe(false); if (!result.success) { // 检查是否有 valueField 相关的错误 const valueFieldError = result.error.issues.find((issue) => issue.path.includes("valueField") ); expect(valueFieldError).toBeDefined(); // 使用不区分大小写的检查 expect(valueFieldError?.message.toLowerCase()).toContain("required"); } }); }); describe("error handling", () => { test("should handle empty data table", () => { const invalidData = { dataTable: [], xField: "month", yField: "sales", chartType: "bar", }; const result = Charts.cartesian.schema.safeParse(invalidData); expect(result.success).toBe(false); if (!result.success) { // 检查是否有 dataTable 相关的错误 const dataTableError = result.error.issues.find((issue) => issue.path.includes("dataTable") ); expect(dataTableError).toBeDefined(); } }); test("should handle missing dataTable", () => { const invalidData = { xField: "month", yField: "sales", chartType: "bar", }; const result = Charts.cartesian.schema.safeParse(invalidData); expect(result.success).toBe(false); if (!result.success) { // 检查错误信息 expect(result.error.issues.length).toBeGreaterThan(0); const dataTableError = result.error.issues.find((issue) => issue.path.includes("dataTable") ); expect(dataTableError).toBeDefined(); // 使用不区分大小写的检查 expect(dataTableError?.message.toLowerCase()).toContain("required"); } }); }); describe("schema validation with various chart types", () => { const testChartTypes = [ { type: "bar", valid: true }, { type: "line", valid: true }, { type: "area", valid: true }, { type: "waterfall", valid: true }, { type: "invalid_type", valid: false }, ]; testChartTypes.forEach(({ type, valid }) => { test(`should ${valid ? "accept" : "reject"} chartType: ${type}`, () => { const data = { dataTable: sampleChartData.dataTable, xField: "month", yField: "sales", chartType: type, }; const result = Charts.cartesian.schema.safeParse(data); expect(result.success).toBe(valid); // 如果应该失败但成功了,或者应该成功但失败了,输出调试信息 if (result.success !== valid) { console.log(`Unexpected result for chartType ${type}:`, result); } }); }); }); describe("optional fields", () => { test("should accept data with optional fields", () => { const dataWithOptionals = { dataTable: sampleChartData.dataTable, xField: "month", yField: "sales", chartType: "bar", colorField: "month", title: "Sales Chart", width: 800, height: 600, output: "html", }; const result = Charts.cartesian.schema.safeParse(dataWithOptionals); expect(result.success).toBe(true); // 如果失败了,输出调试信息 if (!result.success) { console.log("Validation failed for optional fields:", result.error.issues); } }); test("should accept data without optional fields", () => { const minimalData = { dataTable: sampleChartData.dataTable, xField: "month", yField: "sales", chartType: "bar", }; const result = Charts.cartesian.schema.safeParse(minimalData); expect(result.success).toBe(true); // 如果失败了,输出调试信息 if (!result.success) { console.log("Validation failed for minimal data:", result.error.issues); } }); }); // 添加一个测试来了解 Zod 错误消息的格式 describe("debug zod error messages", () => { test("should log zod error message format", () => { const invalidData = { dataTable: sampleChartData.dataTable, xField: "month", // yField missing chartType: "bar", }; const result = Charts.cartesian.schema.safeParse(invalidData); if (!result.success) { console.log("All validation errors:", result.error.issues); result.error.issues.forEach((issue, index) => { console.log(`Error ${index}:`, { path: issue.path, message: issue.message, code: issue.code, }); }); } }); }); });

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/VisActor/vchart-mcp-server'

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