mcp-test-generator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +123 -0
  2. package/dist/analyzers/function-extractor.d.ts +3 -0
  3. package/dist/analyzers/function-extractor.js +18 -0
  4. package/dist/analyzers/function-extractor.js.map +1 -0
  5. package/dist/analyzers/project-analyzer.d.ts +2 -0
  6. package/dist/analyzers/project-analyzer.js +70 -0
  7. package/dist/analyzers/project-analyzer.js.map +1 -0
  8. package/dist/analyzers/python-analyzer.d.ts +2 -0
  9. package/dist/analyzers/python-analyzer.js +259 -0
  10. package/dist/analyzers/python-analyzer.js.map +1 -0
  11. package/dist/analyzers/typescript-analyzer.d.ts +2 -0
  12. package/dist/analyzers/typescript-analyzer.js +386 -0
  13. package/dist/analyzers/typescript-analyzer.js.map +1 -0
  14. package/dist/generators/test-generator.d.ts +4 -0
  15. package/dist/generators/test-generator.js +223 -0
  16. package/dist/generators/test-generator.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +14 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/models/function-info.d.ts +66 -0
  21. package/dist/models/function-info.js +2 -0
  22. package/dist/models/function-info.js.map +1 -0
  23. package/dist/models/project-info.d.ts +53 -0
  24. package/dist/models/project-info.js +2 -0
  25. package/dist/models/project-info.js.map +1 -0
  26. package/dist/models/test-case.d.ts +32 -0
  27. package/dist/models/test-case.js +2 -0
  28. package/dist/models/test-case.js.map +1 -0
  29. package/dist/server.d.ts +2 -0
  30. package/dist/server.js +159 -0
  31. package/dist/server.js.map +1 -0
  32. package/dist/tools/analyze-project.d.ts +9 -0
  33. package/dist/tools/analyze-project.js +24 -0
  34. package/dist/tools/analyze-project.js.map +1 -0
  35. package/dist/tools/generate-single-test.d.ts +12 -0
  36. package/dist/tools/generate-single-test.js +58 -0
  37. package/dist/tools/generate-single-test.js.map +1 -0
  38. package/dist/tools/generate-tests.d.ts +17 -0
  39. package/dist/tools/generate-tests.js +82 -0
  40. package/dist/tools/generate-tests.js.map +1 -0
  41. package/dist/utils/config-parser.d.ts +8 -0
  42. package/dist/utils/config-parser.js +27 -0
  43. package/dist/utils/config-parser.js.map +1 -0
  44. package/dist/utils/file-utils.d.ts +7 -0
  45. package/dist/utils/file-utils.js +157 -0
  46. package/dist/utils/file-utils.js.map +1 -0
  47. package/dist/utils/language-detector.d.ts +6 -0
  48. package/dist/utils/language-detector.js +148 -0
  49. package/dist/utils/language-detector.js.map +1 -0
  50. package/dist/utils/test-suite-renderer.d.ts +3 -0
  51. package/dist/utils/test-suite-renderer.js +62 -0
  52. package/dist/utils/test-suite-renderer.js.map +1 -0
  53. package/package.json +49 -0
@@ -0,0 +1,157 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { glob } from "glob";
4
+ import { getSourceExtensions } from "./language-detector.js";
5
+ const DEFAULT_EXCLUDE_DIRS = [
6
+ "node_modules",
7
+ ".git",
8
+ "dist",
9
+ "build",
10
+ "coverage",
11
+ ".next",
12
+ "__pycache__",
13
+ ".pytest_cache",
14
+ "venv",
15
+ "env",
16
+ ".venv",
17
+ "target",
18
+ ".gradle",
19
+ ".idea",
20
+ ".vscode",
21
+ ];
22
+ const DEFAULT_EXCLUDE_FILES = [
23
+ "*.d.ts",
24
+ "*.config.*",
25
+ "*.spec.*",
26
+ "*.test.*",
27
+ "*_test.*",
28
+ "*Test.*",
29
+ "index.ts",
30
+ "index.js",
31
+ "main.ts",
32
+ "main.js",
33
+ "setup.*",
34
+ "jest.setup.*",
35
+ ];
36
+ export async function findSourceFiles(projectPath, language, includePatterns, excludePatterns) {
37
+ const extensions = getSourceExtensions(language);
38
+ let patterns;
39
+ if (includePatterns && includePatterns.length > 0) {
40
+ patterns = includePatterns;
41
+ }
42
+ else {
43
+ patterns = extensions.map((ext) => `**/*${ext}`);
44
+ }
45
+ const excludeDirs = DEFAULT_EXCLUDE_DIRS.map((d) => `**/${d}/**`);
46
+ const defaultExcludes = [
47
+ ...excludeDirs,
48
+ ...DEFAULT_EXCLUDE_FILES.map((f) => `**/${f}`),
49
+ ];
50
+ const allExcludes = [
51
+ ...defaultExcludes,
52
+ ...(excludePatterns || []),
53
+ ];
54
+ const sourceFiles = [];
55
+ for (const pattern of patterns) {
56
+ const files = await glob(pattern, {
57
+ cwd: projectPath,
58
+ ignore: allExcludes,
59
+ absolute: false,
60
+ nodir: true,
61
+ });
62
+ for (const file of files) {
63
+ const absolutePath = path.join(projectPath, file);
64
+ const stat = fs.statSync(absolutePath);
65
+ // Skip test files
66
+ if (isTestFile(file))
67
+ continue;
68
+ // Skip very small files (likely just exports)
69
+ if (stat.size < 50)
70
+ continue;
71
+ const existingTestPath = findExistingTest(projectPath, file, language);
72
+ sourceFiles.push({
73
+ filePath: absolutePath,
74
+ relativePath: file,
75
+ language,
76
+ size: stat.size,
77
+ hasExistingTests: existingTestPath !== null,
78
+ existingTestPath,
79
+ });
80
+ }
81
+ }
82
+ return sourceFiles;
83
+ }
84
+ export function isTestFile(filePath) {
85
+ const basename = path.basename(filePath);
86
+ return (basename.includes(".test.") ||
87
+ basename.includes(".spec.") ||
88
+ basename.includes("_test.") ||
89
+ basename.endsWith("Test.java") ||
90
+ basename.endsWith("Tests.java") ||
91
+ filePath.includes("__tests__") ||
92
+ filePath.includes("/tests/") ||
93
+ filePath.includes("/test/"));
94
+ }
95
+ export function findExistingTest(projectPath, sourceRelativePath, language) {
96
+ const parsed = path.parse(sourceRelativePath);
97
+ const nameWithoutExt = parsed.name;
98
+ const dir = parsed.dir;
99
+ const possibleTestPaths = [
100
+ // Co-located tests
101
+ path.join(dir, `${nameWithoutExt}.test${parsed.ext}`),
102
+ path.join(dir, `${nameWithoutExt}.spec${parsed.ext}`),
103
+ // __tests__ directory
104
+ path.join(dir, "__tests__", `${nameWithoutExt}.test${parsed.ext}`),
105
+ path.join(dir, "__tests__", `${nameWithoutExt}.spec${parsed.ext}`),
106
+ // tests directory at root
107
+ path.join("tests", dir, `${nameWithoutExt}.test${parsed.ext}`),
108
+ path.join("test", dir, `${nameWithoutExt}.test${parsed.ext}`),
109
+ ];
110
+ // Python-specific
111
+ if (language === "python") {
112
+ possibleTestPaths.push(path.join(dir, `test_${nameWithoutExt}.py`), path.join(dir, `${nameWithoutExt}_test.py`), path.join("tests", `test_${nameWithoutExt}.py`));
113
+ }
114
+ // Java-specific
115
+ if (language === "java") {
116
+ possibleTestPaths.push(path.join(dir.replace("main", "test"), `${nameWithoutExt}Test.java`));
117
+ }
118
+ for (const testPath of possibleTestPaths) {
119
+ const absoluteTestPath = path.join(projectPath, testPath);
120
+ if (fs.existsSync(absoluteTestPath)) {
121
+ return testPath;
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ export function generateTestFilePath(projectPath, sourceRelativePath, language, testFramework, outputDir) {
127
+ const parsed = path.parse(sourceRelativePath);
128
+ const nameWithoutExt = parsed.name;
129
+ let testFileName;
130
+ let testDir;
131
+ switch (language) {
132
+ case "python":
133
+ testFileName = `test_${nameWithoutExt}.py`;
134
+ testDir = outputDir || "tests";
135
+ break;
136
+ case "java":
137
+ testFileName = `${nameWithoutExt}Test.java`;
138
+ testDir = outputDir || parsed.dir.replace("src/main", "src/test");
139
+ break;
140
+ default:
141
+ testFileName = `${nameWithoutExt}.test${parsed.ext}`;
142
+ testDir = outputDir || path.join(parsed.dir, "__tests__");
143
+ break;
144
+ }
145
+ return path.join(projectPath, testDir, testFileName);
146
+ }
147
+ export function ensureDirectoryExists(filePath) {
148
+ const dir = path.dirname(filePath);
149
+ if (!fs.existsSync(dir)) {
150
+ fs.mkdirSync(dir, { recursive: true });
151
+ }
152
+ }
153
+ export function writeTestFile(filePath, content) {
154
+ ensureDirectoryExists(filePath);
155
+ fs.writeFileSync(filePath, content, "utf-8");
156
+ }
157
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ProgrammingLanguage, ProjectFramework, TestFramework } from "../models/project-info.js";
2
+ export declare function detectLanguage(projectPath: string): ProgrammingLanguage;
3
+ export declare function detectFramework(projectPath: string): ProjectFramework;
4
+ export declare function detectTestFramework(projectPath: string, language: ProgrammingLanguage): TestFramework;
5
+ export declare function getSourceExtensions(language: ProgrammingLanguage): string[];
6
+ export declare function getTestFileExtension(language: ProgrammingLanguage, framework: TestFramework): string;
@@ -0,0 +1,148 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ export function detectLanguage(projectPath) {
4
+ const files = fs.readdirSync(projectPath);
5
+ // Check for TypeScript
6
+ if (files.includes("tsconfig.json") ||
7
+ files.some((f) => f.endsWith(".ts") || f.endsWith(".tsx"))) {
8
+ return "typescript";
9
+ }
10
+ // Check for Python
11
+ if (files.includes("setup.py") ||
12
+ files.includes("pyproject.toml") ||
13
+ files.includes("requirements.txt") ||
14
+ files.some((f) => f.endsWith(".py"))) {
15
+ return "python";
16
+ }
17
+ // Check for Java
18
+ if (files.includes("pom.xml") ||
19
+ files.includes("build.gradle") ||
20
+ files.some((f) => f.endsWith(".java"))) {
21
+ return "java";
22
+ }
23
+ // Check for JavaScript
24
+ if (files.includes("package.json") ||
25
+ files.some((f) => f.endsWith(".js") || f.endsWith(".jsx"))) {
26
+ return "javascript";
27
+ }
28
+ return "unknown";
29
+ }
30
+ export function detectFramework(projectPath) {
31
+ const packageJsonPath = path.join(projectPath, "package.json");
32
+ if (fs.existsSync(packageJsonPath)) {
33
+ try {
34
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
35
+ const allDeps = {
36
+ ...pkg.dependencies,
37
+ ...pkg.devDependencies,
38
+ };
39
+ if (allDeps["next"])
40
+ return "nextjs";
41
+ if (allDeps["@nestjs/core"])
42
+ return "nestjs";
43
+ if (allDeps["react"])
44
+ return "react";
45
+ if (allDeps["vue"])
46
+ return "vue";
47
+ if (allDeps["@angular/core"])
48
+ return "angular";
49
+ if (allDeps["express"])
50
+ return "express";
51
+ }
52
+ catch {
53
+ // Ignore parse errors
54
+ }
55
+ }
56
+ // Check for Python frameworks
57
+ const requirementsPath = path.join(projectPath, "requirements.txt");
58
+ if (fs.existsSync(requirementsPath)) {
59
+ const content = fs.readFileSync(requirementsPath, "utf-8");
60
+ if (content.includes("fastapi"))
61
+ return "fastapi";
62
+ if (content.includes("flask"))
63
+ return "flask";
64
+ if (content.includes("django"))
65
+ return "django";
66
+ }
67
+ // Check for pyproject.toml
68
+ const pyprojectPath = path.join(projectPath, "pyproject.toml");
69
+ if (fs.existsSync(pyprojectPath)) {
70
+ const content = fs.readFileSync(pyprojectPath, "utf-8");
71
+ if (content.includes("fastapi"))
72
+ return "fastapi";
73
+ if (content.includes("flask"))
74
+ return "flask";
75
+ if (content.includes("django"))
76
+ return "django";
77
+ }
78
+ // Check for Java frameworks
79
+ const pomPath = path.join(projectPath, "pom.xml");
80
+ if (fs.existsSync(pomPath)) {
81
+ const content = fs.readFileSync(pomPath, "utf-8");
82
+ if (content.includes("spring"))
83
+ return "spring";
84
+ }
85
+ return null;
86
+ }
87
+ export function detectTestFramework(projectPath, language) {
88
+ const packageJsonPath = path.join(projectPath, "package.json");
89
+ if (fs.existsSync(packageJsonPath)) {
90
+ try {
91
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
92
+ const allDeps = {
93
+ ...pkg.dependencies,
94
+ ...pkg.devDependencies,
95
+ };
96
+ if (allDeps["vitest"])
97
+ return "vitest";
98
+ if (allDeps["jest"] || allDeps["@jest/core"])
99
+ return "jest";
100
+ if (allDeps["mocha"])
101
+ return "mocha";
102
+ }
103
+ catch {
104
+ // Ignore
105
+ }
106
+ }
107
+ // Defaults by language
108
+ switch (language) {
109
+ case "typescript":
110
+ case "javascript":
111
+ return "jest";
112
+ case "python":
113
+ return "pytest";
114
+ case "java":
115
+ return "junit";
116
+ default:
117
+ return "jest";
118
+ }
119
+ }
120
+ export function getSourceExtensions(language) {
121
+ switch (language) {
122
+ case "typescript":
123
+ return [".ts", ".tsx"];
124
+ case "javascript":
125
+ return [".js", ".jsx", ".mjs"];
126
+ case "python":
127
+ return [".py"];
128
+ case "java":
129
+ return [".java"];
130
+ default:
131
+ return [".ts", ".js"];
132
+ }
133
+ }
134
+ export function getTestFileExtension(language, framework) {
135
+ switch (language) {
136
+ case "typescript":
137
+ return framework === "vitest" ? ".test.ts" : ".test.ts";
138
+ case "javascript":
139
+ return ".test.js";
140
+ case "python":
141
+ return "_test.py";
142
+ case "java":
143
+ return "Test.java";
144
+ default:
145
+ return ".test.ts";
146
+ }
147
+ }
148
+ //# sourceMappingURL=language-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-detector.js","sourceRoot":"","sources":["../../src/utils/language-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TestSuite } from "../models/test-case.js";
2
+ import { ProgrammingLanguage } from "../models/project-info.js";
3
+ export declare function renderTestSuiteToCode(suite: TestSuite, _testFramework: string, language: ProgrammingLanguage): string;
@@ -0,0 +1,62 @@
1
+ export function renderTestSuiteToCode(suite, _testFramework, language) {
2
+ if (language === "python") {
3
+ return renderPython(suite);
4
+ }
5
+ return renderJestOrVitest(suite);
6
+ }
7
+ function renderJestOrVitest(suite) {
8
+ const lines = [...suite.imports, ""];
9
+ for (const block of suite.describes) {
10
+ lines.push(...renderDescribeBlock(block, 0));
11
+ }
12
+ return lines.join("\n");
13
+ }
14
+ function renderDescribeBlock(block, indent) {
15
+ const lines = [];
16
+ const pad = " ".repeat(indent);
17
+ lines.push(`${pad}describe("${escapeStr(block.name)}", () => {`);
18
+ if (block.beforeEach) {
19
+ lines.push(`${pad} beforeEach(() => {`);
20
+ block.beforeEach.split("\n").forEach((l) => lines.push(`${pad} ${l.trim()}`));
21
+ lines.push(`${pad} });`);
22
+ }
23
+ for (const tc of block.testCases) {
24
+ const testFn = tc.isAsync ? "async () =>" : "() =>";
25
+ lines.push(`${pad} it("${escapeStr(tc.name)}", ${testFn} {`);
26
+ if (tc.arrangement) {
27
+ tc.arrangement.split("\n").forEach((l) => lines.push(`${pad} ${l.trim()}`));
28
+ }
29
+ tc.action.split("\n").forEach((l) => lines.push(`${pad} ${l.trim()}`));
30
+ tc.assertion.split("\n").forEach((l) => lines.push(`${pad} ${l.trim()}`));
31
+ lines.push(`${pad} });`);
32
+ }
33
+ for (const nested of block.nestedDescribes) {
34
+ lines.push(...renderDescribeBlock(nested, indent + 1));
35
+ }
36
+ lines.push(`${pad}});`);
37
+ return lines;
38
+ }
39
+ function renderPython(suite) {
40
+ const lines = [...suite.imports, ""];
41
+ for (const block of suite.describes) {
42
+ lines.push(`class Test${block.name.replace(/\W/g, "_")}:`);
43
+ if (block.beforeEach) {
44
+ lines.push(" def setUp(self):");
45
+ block.beforeEach.split("\n").forEach((l) => lines.push(` ${l.trim()}`));
46
+ }
47
+ for (const tc of block.testCases) {
48
+ const methodName = tc.name.replace(/\s+/g, "_").replace(/[^a-zA-Z0-9_]/g, "");
49
+ lines.push(` def test_${methodName}(self):`);
50
+ [tc.arrangement, tc.action, tc.assertion].forEach((s) => {
51
+ if (s)
52
+ s.split("\n").forEach((l) => lines.push(` ${l.trim()}`));
53
+ });
54
+ lines.push("");
55
+ }
56
+ }
57
+ return lines.join("\n");
58
+ }
59
+ function escapeStr(s) {
60
+ return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
61
+ }
62
+ //# sourceMappingURL=test-suite-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-suite-renderer.js","sourceRoot":"","sources":["../../src/utils/test-suite-renderer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "mcp-test-generator",
3
+ "version": "1.0.0",
4
+ "description": "MCP server that generates test cases for TypeScript, JavaScript, Python, and Java projects. Use with Cursor, Claude Desktop, or any MCP client.",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "mcp-test-generator": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx src/index.ts",
18
+ "watch": "tsc --watch",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "model-context-protocol",
24
+ "test-generator",
25
+ "jest",
26
+ "pytest",
27
+ "vitest",
28
+ "testing"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/ranjats/mcp-test-generator.git"
33
+ },
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=18"
37
+ },
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.0.0",
40
+ "glob": "^10.3.10",
41
+ "typescript": "^5.3.3",
42
+ "ts-morph": "^21.0.1",
43
+ "zod": "^3.22.4"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^20.10.0",
47
+ "tsx": "^4.7.0"
48
+ }
49
+ }