@@ -26,7 +26,7 @@ def test_query_invokes_wren_engine_with_resolved_manifest(
2626 result = toolkit .query ("SELECT 1" , limit = 10 )
2727
2828 assert result is fake_table
29- fake_engine .query .assert_called_once_with ("SELECT 1" , limit = 10 )
29+ fake_engine .query .assert_called_once_with ("SELECT 1" , limit = 10 , properties = None )
3030 # Engine constructed with manifest bytes + datasource + connection_info
3131 engine_ctor .assert_called_once ()
3232 kwargs = engine_ctor .call_args .kwargs
@@ -106,7 +106,9 @@ def test_dry_plan_delegates_to_engine(tmp_project, fake_active_profile):
106106 result = toolkit .dry_plan ("SELECT * FROM orders" )
107107
108108 assert result == "SELECT * FROM cte_orders"
109- fake_engine .dry_plan .assert_called_once_with ("SELECT * FROM orders" )
109+ fake_engine .dry_plan .assert_called_once_with (
110+ "SELECT * FROM orders" , properties = None
111+ )
110112
111113
112114def test_dry_run_delegates_to_engine (tmp_project , fake_active_profile ):
@@ -118,4 +120,54 @@ def test_dry_run_delegates_to_engine(tmp_project, fake_active_profile):
118120 with patch ("wren_pydantic._toolkit.WrenEngine" , return_value = fake_engine ):
119121 toolkit .dry_run ("SELECT 1" )
120122
121- fake_engine .dry_run .assert_called_once_with ("SELECT 1" )
123+ fake_engine .dry_run .assert_called_once_with ("SELECT 1" , properties = None )
124+
125+
126+ def test_query_forwards_session_properties (tmp_project , fake_active_profile ):
127+ """Session properties reach the engine, so RLAC-protected models are readable."""
128+ fake_engine = MagicMock (name = "engine" )
129+ fake_engine .query .return_value = pa .table ({"x" : [1 ]})
130+ fake_engine ._connector = MagicMock ()
131+ properties = {"session_user_id" : "'u_42'" }
132+
133+ toolkit = WrenToolkit .from_project (tmp_project )
134+
135+ with patch ("wren_pydantic._toolkit.WrenEngine" , return_value = fake_engine ):
136+ toolkit .query ("SELECT * FROM orders" , limit = 5 , properties = properties )
137+
138+ fake_engine .query .assert_called_once_with (
139+ "SELECT * FROM orders" , limit = 5 , properties = properties
140+ )
141+
142+
143+ def test_dry_plan_forwards_session_properties (tmp_project , fake_active_profile ):
144+ """dry_plan forwards properties: RLAC predicates are injected while planning."""
145+ fake_engine = MagicMock (name = "engine" )
146+ fake_engine .dry_plan .return_value = "SELECT 1"
147+ fake_engine ._connector = MagicMock ()
148+ properties = {"session_user_id" : "'u_42'" }
149+
150+ toolkit = WrenToolkit .from_project (tmp_project )
151+
152+ with patch ("wren_pydantic._toolkit.WrenEngine" , return_value = fake_engine ):
153+ toolkit .dry_plan ("SELECT * FROM orders" , properties = properties )
154+
155+ fake_engine .dry_plan .assert_called_once_with (
156+ "SELECT * FROM orders" , properties = properties
157+ )
158+
159+
160+ def test_dry_run_forwards_session_properties (tmp_project , fake_active_profile ):
161+ """dry_run forwards properties so validation matches what query will run."""
162+ fake_engine = MagicMock (name = "engine" )
163+ fake_engine ._connector = MagicMock ()
164+ properties = {"session_user_id" : "'u_42'" }
165+
166+ toolkit = WrenToolkit .from_project (tmp_project )
167+
168+ with patch ("wren_pydantic._toolkit.WrenEngine" , return_value = fake_engine ):
169+ toolkit .dry_run ("SELECT * FROM orders" , properties = properties )
170+
171+ fake_engine .dry_run .assert_called_once_with (
172+ "SELECT * FROM orders" , properties = properties
173+ )
0 commit comments