@@ -128,49 +128,6 @@ def test_get_test_session_name_custom_prefix(server: Server) -> None:
128128 assert not server .has_session (result )
129129
130130
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-
174131def test_get_test_session_name_loop_behavior (
175132 server : Server ,
176133) -> None :
@@ -244,51 +201,6 @@ def test_get_test_window_name_custom_prefix(session: Session) -> None:
244201 assert not any (w .window_name == result for w in session .windows )
245202
246203
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-
292204def test_get_test_window_name_loop_behavior (
293205 session : Session ,
294206) -> None :
@@ -435,3 +347,71 @@ def test_random_str_sequence_iter_next_methods() -> None:
435347
436348 # Verify all results are unique
437349 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