@@ -128,49 +128,6 @@ def test_get_test_session_name_custom_prefix(server: Server) -> None:
128
128
assert not server .has_session (result )
129
129
130
130
131
- def test_get_test_session_name_collision (
132
- server : Server ,
133
- monkeypatch : pytest .MonkeyPatch ,
134
- ) -> None :
135
- """Test get_test_session_name when first attempts collide."""
136
- collision_name = TEST_SESSION_PREFIX + "collision"
137
- success_name = TEST_SESSION_PREFIX + "success"
138
- name_iter = iter (["collision" , "success" ])
139
-
140
- def mock_next (self : t .Any ) -> str :
141
- return next (name_iter )
142
-
143
- monkeypatch .setattr (RandomStrSequence , "__next__" , mock_next )
144
-
145
- # Create a session that will cause a collision
146
- with server .new_session (collision_name ):
147
- result = get_test_session_name (server = server )
148
- assert result == success_name
149
- assert not server .has_session (result )
150
-
151
-
152
- def test_get_test_session_name_multiple_collisions (
153
- server : Server ,
154
- monkeypatch : pytest .MonkeyPatch ,
155
- ) -> None :
156
- """Test get_test_session_name with multiple collisions."""
157
- names = ["collision1" , "collision2" , "success" ]
158
- collision_names = [TEST_SESSION_PREFIX + name for name in names [:- 1 ]]
159
- success_name = TEST_SESSION_PREFIX + names [- 1 ]
160
- name_iter = iter (names )
161
-
162
- def mock_next (self : t .Any ) -> str :
163
- return next (name_iter )
164
-
165
- monkeypatch .setattr (RandomStrSequence , "__next__" , mock_next )
166
-
167
- # Create sessions that will cause collisions
168
- with server .new_session (collision_names [0 ]), server .new_session (collision_names [1 ]):
169
- result = get_test_session_name (server = server )
170
- assert result == success_name
171
- assert not server .has_session (result )
172
-
173
-
174
131
def test_get_test_session_name_loop_behavior (
175
132
server : Server ,
176
133
) -> None :
@@ -244,51 +201,6 @@ def test_get_test_window_name_custom_prefix(session: Session) -> None:
244
201
assert not any (w .window_name == result for w in session .windows )
245
202
246
203
247
- def test_get_test_window_name_collision (
248
- session : Session ,
249
- monkeypatch : pytest .MonkeyPatch ,
250
- ) -> None :
251
- """Test get_test_window_name when first attempts collide."""
252
- collision_name = TEST_SESSION_PREFIX + "collision"
253
- success_name = TEST_SESSION_PREFIX + "success"
254
- name_iter = iter (["collision" , "success" ])
255
-
256
- def mock_next (self : t .Any ) -> str :
257
- return next (name_iter )
258
-
259
- monkeypatch .setattr (RandomStrSequence , "__next__" , mock_next )
260
-
261
- # Create a window that will cause a collision
262
- session .new_window (window_name = collision_name )
263
- result = get_test_window_name (session = session )
264
- assert result == success_name
265
- assert not any (w .window_name == result for w in session .windows )
266
-
267
-
268
- def test_get_test_window_name_multiple_collisions (
269
- session : Session ,
270
- monkeypatch : pytest .MonkeyPatch ,
271
- ) -> None :
272
- """Test get_test_window_name with multiple collisions."""
273
- names = ["collision1" , "collision2" , "success" ]
274
- collision_names = [TEST_SESSION_PREFIX + name for name in names [:- 1 ]]
275
- success_name = TEST_SESSION_PREFIX + names [- 1 ]
276
- name_iter = iter (names )
277
-
278
- def mock_next (self : t .Any ) -> str :
279
- return next (name_iter )
280
-
281
- monkeypatch .setattr (RandomStrSequence , "__next__" , mock_next )
282
-
283
- # Create windows that will cause collisions
284
- for name in collision_names :
285
- session .new_window (window_name = name )
286
-
287
- result = get_test_window_name (session = session )
288
- assert result == success_name
289
- assert not any (w .window_name == result for w in session .windows )
290
-
291
-
292
204
def test_get_test_window_name_loop_behavior (
293
205
session : Session ,
294
206
) -> None :
@@ -435,3 +347,71 @@ def test_random_str_sequence_iter_next_methods() -> None:
435
347
436
348
# Verify all results are unique
437
349
assert len (set (results )) == len (results )
350
+
351
+
352
+ def test_collisions_with_real_objects (
353
+ server : Server ,
354
+ session : Session ,
355
+ ) -> None :
356
+ """Test collision behavior using real tmux objects instead of mocks.
357
+
358
+ This test replaces multiple monkeypatched tests:
359
+ - test_get_test_session_name_collision
360
+ - test_get_test_session_name_multiple_collisions
361
+ - test_get_test_window_name_collision
362
+ - test_get_test_window_name_multiple_collisions
363
+
364
+ Instead of mocking the random generator, we create real sessions and
365
+ windows with predictable names and verify the uniqueness logic.
366
+ """
367
+ # Test session name collisions
368
+ # ----------------------------
369
+ # Create a known prefix for testing
370
+ prefix = "test_collision_"
371
+
372
+ # Create several sessions with predictable names
373
+ session_name1 = prefix + "session1"
374
+ session_name2 = prefix + "session2"
375
+
376
+ # Create a couple of actual sessions to force collisions
377
+ with server .new_session (session_name1 ), server .new_session (session_name2 ):
378
+ # Verify our sessions exist
379
+ assert server .has_session (session_name1 )
380
+ assert server .has_session (session_name2 )
381
+
382
+ # When requesting a session name with same prefix, we should get a unique name
383
+ # that doesn't match either existing session
384
+ result = get_test_session_name (server = server , prefix = prefix )
385
+ assert result .startswith (prefix )
386
+ assert result != session_name1
387
+ assert result != session_name2
388
+ assert not server .has_session (result )
389
+
390
+ # Test window name collisions
391
+ # --------------------------
392
+ # Create windows with predictable names
393
+ window_name1 = prefix + "window1"
394
+ window_name2 = prefix + "window2"
395
+
396
+ # Create actual windows to force collisions
397
+ window1 = session .new_window (window_name = window_name1 )
398
+ window2 = session .new_window (window_name = window_name2 )
399
+
400
+ try :
401
+ # Verify our windows exist
402
+ assert any (w .window_name == window_name1 for w in session .windows )
403
+ assert any (w .window_name == window_name2 for w in session .windows )
404
+
405
+ # When requesting a window name with same prefix, we should get a unique name
406
+ # that doesn't match either existing window
407
+ result = get_test_window_name (session = session , prefix = prefix )
408
+ assert result .startswith (prefix )
409
+ assert result != window_name1
410
+ assert result != window_name2
411
+ assert not any (w .window_name == result for w in session .windows )
412
+ finally :
413
+ # Clean up the windows we created
414
+ if window1 :
415
+ window1 .kill ()
416
+ if window2 :
417
+ window2 .kill ()
0 commit comments