@@ -100,6 +100,88 @@ import os
100100 assert . strictEqual ( routesImport . isRelative , true )
101101 } )
102102
103+ test ( "resolves same-file string variables in route paths" , ( ) => {
104+ const code = `
105+ from fastapi import FastAPI
106+
107+ app = FastAPI()
108+
109+ WEBHOOK_PATH = "/webhook"
110+
111+ @app.post(WEBHOOK_PATH)
112+ def some_webhook():
113+ pass
114+ `
115+ const tree = parse ( code )
116+ const result = analyzeTree ( tree , "/test/file.py" )
117+
118+ assert . strictEqual ( result . routes . length , 1 )
119+ assert . strictEqual ( result . routes [ 0 ] . path , "/webhook" )
120+ } )
121+
122+ test ( "resolves variable used in path concatenation" , ( ) => {
123+ const code = `
124+ from fastapi import FastAPI
125+
126+ app = FastAPI()
127+
128+ BASE = "/api"
129+
130+ @app.get(BASE + "/users")
131+ def list_users():
132+ pass
133+ `
134+ const tree = parse ( code )
135+ const result = analyzeTree ( tree , "/test/file.py" )
136+
137+ assert . strictEqual ( result . routes . length , 1 )
138+ assert . strictEqual ( result . routes [ 0 ] . path , "/api/users" )
139+ } )
140+
141+ test ( "leaves unresolvable variables wrapped" , ( ) => {
142+ const code = `
143+ from fastapi import FastAPI
144+
145+ app = FastAPI()
146+
147+ @app.get(settings.API_PREFIX)
148+ def handler():
149+ pass
150+ `
151+ const tree = parse ( code )
152+ const result = analyzeTree ( tree , "/test/file.py" )
153+
154+ assert . strictEqual ( result . routes . length , 1 )
155+ assert . strictEqual ( result . routes [ 0 ] . path , "{settings.API_PREFIX}" )
156+ } )
157+
158+ test ( "resolves variable in router prefix" , ( ) => {
159+ const code = `
160+ from fastapi import APIRouter
161+
162+ PREFIX = "/users"
163+ router = APIRouter(prefix=PREFIX)
164+ `
165+ const tree = parse ( code )
166+ const result = analyzeTree ( tree , "/test/file.py" )
167+
168+ const apiRouter = result . routers . find ( ( r ) => r . type === "APIRouter" )
169+ assert . ok ( apiRouter )
170+ assert . strictEqual ( apiRouter . prefix , "/users" )
171+ } )
172+
173+ test ( "resolves variable in include_router prefix" , ( ) => {
174+ const code = `
175+ USERS_PREFIX = "/users"
176+ app.include_router(users.router, prefix=USERS_PREFIX)
177+ `
178+ const tree = parse ( code )
179+ const result = analyzeTree ( tree , "/test/file.py" )
180+
181+ assert . strictEqual ( result . includeRouters . length , 1 )
182+ assert . strictEqual ( result . includeRouters [ 0 ] . prefix , "/users" )
183+ } )
184+
103185 test ( "sets filePath correctly" , ( ) => {
104186 const code = "x = 1"
105187 const tree = parse ( code )
0 commit comments