1313from policyengine_api .routes .policy_routes import policy_bp
1414from policyengine_api .routes .report_output_routes import report_output_bp
1515from policyengine_api .routes .simulation_routes import simulation_bp
16+ from tests .contract .clients import (
17+ ASGIContractClient ,
18+ ContractClient ,
19+ FlaskContractClient ,
20+ )
1621from tests .contract .helpers import (
1722 assert_field_path_exists ,
1823 assert_subset ,
@@ -121,7 +126,7 @@ def _load_contract_economy_blueprint():
121126 )
122127
123128
124- def _client () :
129+ def create_contract_flask_app () -> Flask :
125130 app = Flask (__name__ )
126131 app .config ["TESTING" ] = True
127132 app .register_blueprint (_load_contract_metadata_blueprint ())
@@ -141,7 +146,17 @@ def liveness_check():
141146 def readiness_check ():
142147 return Response ("OK" , status = 200 , mimetype = "text/plain" )
143148
144- return app .test_client ()
149+ return app
150+
151+
152+ @pytest .fixture (params = ("flask_direct" , "fastapi_fallback" ))
153+ def contract_client (request ) -> ContractClient :
154+ app = create_contract_flask_app ()
155+ if request .param == "flask_direct" :
156+ return FlaskContractClient (app )
157+ if request .param == "fastapi_fallback" :
158+ return ASGIContractClient (app )
159+ raise AssertionError (f"Unknown contract client: { request .param } " )
145160
146161
147162def _resolved_path (path : str ) -> str :
@@ -375,9 +390,12 @@ def _expected_subset(contract: ContractRequest) -> dict:
375390 APP_V2_ROUTE_CONTRACTS ,
376391 ids = lambda contract : f"{ contract .method } { contract .path } " ,
377392)
378- def test_app_v2_api_v1_route_contract (contract ):
393+ def test_app_v2_api_v1_route_contract (
394+ contract : ContractRequest ,
395+ contract_client : ContractClient ,
396+ ):
379397 with _patched_route_dependencies ():
380- response = _client () .open (
398+ response = contract_client .open (
381399 _resolved_path (contract .path ),
382400 method = contract .method ,
383401 json = _json_payload (contract ),
@@ -390,10 +408,9 @@ def test_app_v2_api_v1_route_contract(contract):
390408 assert_field_path_exists (payload , field_path )
391409
392410
393- def test_health_routes_contract ():
394- client = _client ()
395- liveness = client .get ("/liveness-check" )
396- readiness = client .get ("/readiness-check" )
411+ def test_health_routes_contract (contract_client : ContractClient ):
412+ liveness = contract_client .open ("/liveness-check" , method = "GET" )
413+ readiness = contract_client .open ("/readiness-check" , method = "GET" )
397414
398415 assert liveness .status_code == 200
399416 assert liveness .data == b"OK"
@@ -403,8 +420,8 @@ def test_health_routes_contract():
403420 assert "text/plain" in readiness .content_type
404421
405422
406- def test_invalid_country_contract ():
407- response = _client (). get ("/zz/metadata" )
423+ def test_invalid_country_contract (contract_client : ContractClient ):
424+ response = contract_client . open ("/zz/metadata" , method = "GET " )
408425
409426 assert response .status_code == 400
410427 assert_subset (
0 commit comments