@@ -15,59 +15,92 @@ def test_get_starting_context_contains_correct_keys():
1515 assert context ["now" ].tzinfo == datetime .timezone .utc
1616
1717
18- def test_build_context_with_extra_context_and_overlays_composes_correct ():
19- """Build context should render extra contexts and merge overlay contexts."""
20- ui = Mock ()
21-
22- with (
23- patch ("project_forge.context_builder.context.get_starting_context" ) as mock_get_starting_context ,
24- patch ("project_forge.context_builder.context.render_expression" ) as mock_render_expression ,
25- patch ("project_forge.context_builder.context.process_overlay" ) as mock_process_overlay ,
26- ):
27- composition = Mock ()
28- composition .merge_keys = {}
29- composition .extra_context = {"key" : "{{ value }}" , "overlay_key" : "I should get overwritten" }
30- composition .overlays = ["overlay1" , "overlay2" ]
31-
32- mock_get_starting_context .return_value = {}
33- mock_render_expression .return_value = "rendered_value"
34- mock_process_overlay .return_value = {"overlay_key" : "overlay_value" }
35-
36- context = build_context (composition , ui )
37-
38- assert context == {
39- "key" : "rendered_value" ,
40- "overlay_key" : "overlay_value" ,
41- }
42-
43- assert mock_render_expression .called
44- assert mock_process_overlay .called
45- assert mock_get_starting_context .called
46-
47-
48- def test_build_context_with_empty_composition_is_starting_context ():
49- """Building a context with an empty composition returns the starting context."""
50- ui = Mock ()
51- starting_context = {"key" : "value" }
52- with (
53- patch ("project_forge.context_builder.context.get_starting_context" ) as mock_get_starting_context ,
54- patch ("project_forge.context_builder.context.render_expression" ) as mock_render_expression ,
55- patch ("project_forge.context_builder.context.process_overlay" ) as mock_process_overlay ,
56- ):
57- composition = Mock ()
58- composition .extra_context = {}
59- composition .overlays = []
60-
61- mock_get_starting_context .return_value = starting_context
62- mock_render_expression .return_value = ""
63- mock_process_overlay .return_value = {}
64-
65- context = build_context (composition , ui )
66-
67- assert context == starting_context
68- mock_render_expression .assert_not_called ()
69- mock_process_overlay .assert_not_called ()
70- assert mock_get_starting_context .called
18+ class TestBuildContext :
19+ """Tests for the build_context function."""
20+
21+ def test_extra_context_and_overlays_composes_correctly (self ):
22+ """Build context should render extra contexts and merge overlay contexts."""
23+ ui = Mock ()
24+
25+ with (
26+ patch ("project_forge.context_builder.context.get_starting_context" ) as mock_get_starting_context ,
27+ patch ("project_forge.context_builder.context.render_expression" ) as mock_render_expression ,
28+ patch ("project_forge.context_builder.context.process_overlay" ) as mock_process_overlay ,
29+ ):
30+ composition = Mock ()
31+ composition .merge_keys = {}
32+ composition .extra_context = {"key" : "{{ value }}" , "overlay_key" : "I should get overwritten" }
33+ composition .overlays = ["overlay1" , "overlay2" ]
34+
35+ mock_get_starting_context .return_value = {}
36+ mock_render_expression .return_value = "rendered_value"
37+ mock_process_overlay .return_value = {"overlay_key" : "overlay_value" }
38+
39+ context = build_context (composition , ui )
40+
41+ assert context == {
42+ "key" : "rendered_value" ,
43+ "overlay_key" : "overlay_value" ,
44+ }
45+
46+ assert mock_render_expression .called
47+ assert mock_process_overlay .called
48+ assert mock_get_starting_context .called
49+
50+ def test_empty_composition_is_starting_context (self ):
51+ """Building a context with an empty composition returns the starting context."""
52+ ui = Mock ()
53+ starting_context = {"key" : "value" }
54+ with (
55+ patch ("project_forge.context_builder.context.get_starting_context" ) as mock_get_starting_context ,
56+ patch ("project_forge.context_builder.context.render_expression" ) as mock_render_expression ,
57+ patch ("project_forge.context_builder.context.process_overlay" ) as mock_process_overlay ,
58+ ):
59+ composition = Mock ()
60+ composition .extra_context = {}
61+ composition .overlays = []
62+
63+ mock_get_starting_context .return_value = starting_context
64+ mock_render_expression .return_value = ""
65+ mock_process_overlay .return_value = {}
66+
67+ context = build_context (composition , ui )
68+
69+ assert context == starting_context
70+ mock_render_expression .assert_not_called ()
71+ mock_process_overlay .assert_not_called ()
72+ assert mock_get_starting_context .called
73+
74+ def initial_context_merges_with_extra_context (self ):
75+ """When an initial context is passed, it merges with the extra context."""
76+ ui = Mock ()
77+
78+ with (
79+ patch ("project_forge.context_builder.context.get_starting_context" ) as mock_get_starting_context ,
80+ patch ("project_forge.context_builder.context.render_expression" ) as mock_render_expression ,
81+ patch ("project_forge.context_builder.context.process_overlay" ) as mock_process_overlay ,
82+ ):
83+ composition = Mock ()
84+ composition .merge_keys = {}
85+ composition .extra_context = {"key" : "{{ value }}" , "overlay_key" : "I should get overwritten" }
86+ composition .overlays = ["overlay1" , "overlay2" ]
87+ initial_context = {"initial_key" : "initial_value" }
88+
89+ mock_get_starting_context .return_value = {}
90+ mock_render_expression .return_value = "rendered_value"
91+ mock_process_overlay .return_value = {"overlay_key" : "overlay_value" }
92+
93+ context = build_context (composition , ui , initial_context )
94+
95+ assert context == {
96+ "key" : "rendered_value" ,
97+ "overlay_key" : "overlay_value" ,
98+ "initial_key" : "initial_value" ,
99+ }
100+
101+ assert mock_render_expression .called
102+ assert mock_process_overlay .called
103+ assert mock_get_starting_context .called
71104
72105
73106class TestUpdateContext :
0 commit comments