@@ -2694,3 +2694,60 @@ def query_model_advanced(params: Annotated[QueryAdvanced, Query()]) -> Dict[str,
26942694 full_name_error = next ((e for e in errors if "full_name" in e ["loc" ] or "fullName" in e ["loc" ]), None )
26952695 assert full_name_error is not None
26962696 assert full_name_error ["type" ] == "string_too_short"
2697+
2698+
2699+ def test_validation_query_string_with_fully_encoded_datetime_alb_resolver ():
2700+ # GIVEN a ALBResolver with validation enabled,
2701+ # and an event with a fully url-encoded datetime
2702+ # as a query string parameter
2703+ app = ALBResolver (enable_validation = True , decode_query_parameters = True )
2704+ raw_event = load_event ("albEvent.json" )
2705+ raw_event ["path" ] = "/users"
2706+ # Fully encoded: "2025-12-20T16:56:02.032000" -> "2025-12-20T16%3A56%3A02.032000"
2707+ # With spaces or special chars: "2025-12-20 16:56:02" -> "2025-12-20%2016%3A56%3A02"
2708+ raw_event ["queryStringParameters" ] = {"query_dt" : "2025-12-20T16%3A56%3A02.032000" }
2709+
2710+ @app .get ("/users" )
2711+ def handler (query_dt : datetime .datetime ):
2712+ return {"received" : query_dt .isoformat ()}
2713+
2714+ result = app (raw_event , {})
2715+ assert result ["statusCode" ] == 200
2716+ body = json .loads (result ["body" ])
2717+ assert body ["received" ] == "2025-12-20T16:56:02.032000"
2718+
2719+
2720+ def test_validation_query_string_with_encoded_key_and_value_alb_resolver ():
2721+ # GIVEN a ALBResolver with validation enabled,
2722+ # and an event with url-encoded key AND value
2723+ app = ALBResolver (enable_validation = True , decode_query_parameters = True )
2724+ raw_event = load_event ("albEvent.json" )
2725+ raw_event ["path" ] = "/search"
2726+ # Key: "search query" -> "search%20query"
2727+ # Value: "hello world" -> "hello%20world"
2728+ raw_event ["queryStringParameters" ] = {"search%20query" : "hello%20world" }
2729+
2730+ @app .get ("/search" )
2731+ def handler (search_query : Annotated [str , Query (alias = "search query" )]):
2732+ return {"result" : search_query }
2733+
2734+ result = app (raw_event , {})
2735+ assert result ["statusCode" ] == 200
2736+ body = json .loads (result ["body" ])
2737+ assert body ["result" ] == "hello world"
2738+
2739+
2740+ def test_validation_without_decode_query_parameters_alb_resolver ():
2741+ # GIVEN a ALBResolver WITHOUT decode_query_parameters (default behavior)
2742+ app = ALBResolver (enable_validation = True )
2743+ raw_event = load_event ("albEvent.json" )
2744+ raw_event ["path" ] = "/users"
2745+ raw_event ["queryStringParameters" ] = {"query_dt" : "2025-12-20T16%3A56%3A02.032000" }
2746+
2747+ @app .get ("/users" )
2748+ def handler (query_dt : datetime .datetime ):
2749+ return None
2750+
2751+ # THEN validation should fail because the encoded string is not a valid datetime
2752+ result = app (raw_event , {})
2753+ assert result ["statusCode" ] == 422
0 commit comments