99
1010
1111class RequestPanelTestCase (BaseTestCase ):
12+
1213 panel_id = RequestPanel .panel_id
1314
15+ def setUp (self ):
16+ super ().setUp ()
17+ from django .contrib .sessions .middleware import SessionMiddleware
18+ middleware = SessionMiddleware (lambda req : None )
19+ middleware .process_request (self .request )
20+ self .request .session .save ()
21+
1422 def test_non_ascii_session (self ):
1523 self .request .session = {"où" : "où" }
1624 response = self .panel .process_request (self .request )
@@ -121,23 +129,23 @@ def test_session_list_sorted_or_not(self):
121129 "data" : ["foo" , "bar" , 1 ],
122130 (2 , 3 ): "tuple_key" ,
123131 }
124- data = {
125- "list" : [(1 , "value" ), ("data" , ["foo" , "bar" , 1 ]), ((2 , 3 ), "tuple_key" )]
126- }
132+ expected_data = {
133+ "list" : [(1 , "value" ), ("data" , ["foo" , "bar" , 1 ]), (" (2, 3)" , "tuple_key" )]
134+ }
127135 response = self .panel .process_request (self .request )
128136 self .panel .generate_stats (self .request , response )
129137 panel_stats = self .panel .get_stats ()
130- self .assertEqual (panel_stats ["session" ], data )
138+ self .assertEqual (panel_stats ["session" ], expected_data )
131139
132140 self .request .session = {
133141 "b" : "b-value" ,
134142 "a" : "a-value" ,
135143 }
136- data = {"list" : [("a" , "a-value" ), ("b" , "b-value" )]}
144+ expected_data = {"list" : [("a" , "a-value" ), ("b" , "b-value" )]}
137145 response = self .panel .process_request (self .request )
138146 self .panel .generate_stats (self .request , response )
139147 panel_stats = self .panel .get_stats ()
140- self .assertEqual (panel_stats ["session" ], data )
148+ self .assertEqual (panel_stats ["session" ], expected_data )
141149
142150 def test_sensitive_post_data_sanitized (self ):
143151 """Test that sensitive POST data is redacted."""
@@ -211,3 +219,62 @@ def test_querydict_sanitized(self):
211219 self .assertIn ("token" , content )
212220 self .assertNotIn ("abc456" , content )
213221 self .assertIn ("********************" , content )
222+
223+ def test_session_with_tuple_keys_are_converted (self ):
224+ """Test that session data with tuple keys is properly converted."""
225+
226+ self .request .session ["lookup" ] = {(1 , 2 ): "foo" , (3 , 4 ): "bar" }
227+
228+ response = self .panel .process_request (self .request )
229+ self .panel .generate_stats (self .request , response )
230+ stats = self .panel .get_stats ()
231+
232+
233+ session = stats .get ('session' , {})
234+ session_list = session .get ('list' , [])
235+
236+
237+ lookup_data = None
238+ for key , value in session_list :
239+ if key == 'lookup' :
240+ lookup_data = value
241+ break
242+
243+ self .assertIsNotNone (lookup_data )
244+ self .assertIn ("(1, 2)" , lookup_data )
245+ self .assertIn ("(3, 4)" , lookup_data )
246+ self .assertEqual (lookup_data ["(1, 2)" ], "foo" )
247+ self .assertEqual (lookup_data ["(3, 4)" ], "bar" )
248+
249+ def test_nested_non_string_keys_are_converted (self ):
250+ """Test that deeply nested non-string keys are converted."""
251+
252+ self .request .session ["complex" ] = {
253+ (1 , 2 ): {
254+ (3 , 4 ): ["value1" , {"nested" : (5 , 6 )}]
255+ }
256+ }
257+
258+ response = self .panel .process_request (self .request )
259+ self .panel .generate_stats (self .request , response )
260+ stats = self .panel .get_stats ()
261+
262+
263+
264+ session = stats .get ('session' , {})
265+ session_list = session .get ('list' , [])
266+
267+ complex_data = None
268+ for key , value in session_list :
269+ if key == 'complex' :
270+ complex_data = value
271+ break
272+
273+ self .assertIsNotNone (complex_data )
274+ self .assertIn ("(1, 2)" , complex_data )
275+
276+ nested = complex_data ["(1, 2)" ]
277+ self .assertIn ("(3, 4)" , nested )
278+ self .assertEqual (nested ["(3, 4)" ][0 ], "value1" )
279+ self .assertIn ("nested" , nested ["(3, 4)" ][1 ])
280+ self .assertEqual (nested ["(3, 4)" ][1 ]["nested" ], "(5, 6)" )
0 commit comments