From 1a45b707b179597154e60472415a1ea1e7934af8 Mon Sep 17 00:00:00 2001 From: NureddinSoltan Date: Fri, 27 Feb 2026 18:25:25 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A8=20=20fix:=20detect=20routes=20defi?= =?UTF-8?q?ned=20on=20APIRouter=20instances=20and=20add=20tests=20for=20ro?= =?UTF-8?q?uter-only=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/appDiscovery.ts | 3 ++- src/test/core/routerResolver.test.ts | 23 +++++++++++++++++++++++ src/test/testUtils.ts | 4 ++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/appDiscovery.ts b/src/appDiscovery.ts index 3c4b2c0..74ca11d 100644 --- a/src/appDiscovery.ts +++ b/src/appDiscovery.ts @@ -63,7 +63,8 @@ async function findAllFastAPIFiles( ) continue const content = await vscode.workspace.fs.readFile(uri) - if (new TextDecoder().decode(content).includes("FastAPI(")) { + const text = new TextDecoder().decode(content) + if (text.includes("FastAPI(") || text.includes("APIRouter(")) { results.push(uri.toString()) } } diff --git a/src/test/core/routerResolver.test.ts b/src/test/core/routerResolver.test.ts index 7794621..9aa38fd 100644 --- a/src/test/core/routerResolver.test.ts +++ b/src/test/core/routerResolver.test.ts @@ -517,5 +517,28 @@ suite("routerResolver", () => { "neon router should have routes", ) }) + + test("builds graph from standalone APIRouter-only file", async () => { + const result = await buildRouterGraph( + fixtures.routerOnly.mainPy, + parser, + fixtures.routerOnly.root, + nodeFileSystem, + ) + + assert.ok(result, "Should find router in APIRouter-only file") + assert.strictEqual(result.type, "APIRouter") + assert.strictEqual(result.variableName, "router") + assert.strictEqual(result.prefix, "/api") + + // Should have 2 routes: GET /items and POST /items + assert.strictEqual(result.routes.length, 2) + const getPaths = result.routes.map((r) => `${r.method} ${r.path}`) + assert.ok(getPaths.includes("get /items"), "Should have GET /items route") + assert.ok( + getPaths.includes("post /items"), + "Should have POST /items route", + ) + }) }) }) diff --git a/src/test/testUtils.ts b/src/test/testUtils.ts index 49ae925..b07bdcf 100644 --- a/src/test/testUtils.ts +++ b/src/test/testUtils.ts @@ -65,6 +65,10 @@ export const fixtures = { root: uri(join(fixturesPath, "error-cases")), mainPy: uri(join(fixturesPath, "error-cases", "main.py")), }, + routerOnly: { + root: uri(join(fixturesPath, "router-only")), + mainPy: uri(join(fixturesPath, "router-only", "main.py")), + }, nestedRouter: { root: uri(join(fixturesPath, "nested-router")), mainPy: uri(join(fixturesPath, "nested-router", "app", "main.py")),