import { describe, it, expect, vi } from "vitest";
import { analyzePythonAstHandler, checkPythonDepsHandler } from "./python.js";
import fs from "fs/promises";
vi.mock("fs/promises");
describe("Python Tools", () => {
describe("analyzePythonAstHandler", () => {
it("should detect classes and functions", async () => {
const code = "class MyClass:\n def my_func(): pass";
const result = await analyzePythonAstHandler({ code });
expect(result.content[0].text).toContain("MyClass");
expect(result.content[0].text).toContain("my_func");
});
it("should detect imports", async () => {
const code = "import os\nfrom sys import argv";
const result = await analyzePythonAstHandler({ code });
expect(result.content[0].text).toContain("os");
expect(result.content[0].text).toContain("sys");
});
});
describe("checkPythonDepsHandler", () => {
it("should parse requirements.txt", async () => {
(fs.readFile as any).mockResolvedValue(
"flask\nrequests # comment\n-r other.txt",
);
const result = await checkPythonDepsHandler({
filePath: "requirements.txt",
});
expect(result.content[0].text).toContain("flask");
expect(result.content[0].text).toContain("requests");
});
it("should parse pyproject.toml", async () => {
(fs.readFile as any).mockResolvedValue(
'[tool.poetry.dependencies]\npython = "^3.9"\nflask = "^2.0"',
);
const result = await checkPythonDepsHandler({
filePath: "pyproject.toml",
});
expect(result.content[0].text).toContain("flask");
});
});
});