88import pytest
99import typer
1010
11+ from cycode .cli .apps .ai_guardrails import session_start_command as _session_start_mod
1112from cycode .cli .apps .ai_guardrails .session_start_command import session_start_command
1213
1314
@@ -22,7 +23,7 @@ def mock_ctx() -> MagicMock:
2223# Auth tests
2324
2425
25- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
26+ @patch . object ( _session_start_mod , ' get_authorization_info' )
2627def test_already_authenticated_skips_auth (mock_get_auth : MagicMock , mock_ctx : MagicMock ) -> None :
2728 """When already authenticated, AuthManager should not be called."""
2829 mock_get_auth .return_value = MagicMock ()
@@ -31,8 +32,8 @@ def test_already_authenticated_skips_auth(mock_get_auth: MagicMock, mock_ctx: Ma
3132 session_start_command (mock_ctx )
3233
3334
34- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. AuthManager' )
35- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
35+ @patch . object ( _session_start_mod , ' AuthManager' )
36+ @patch . object ( _session_start_mod , ' get_authorization_info' )
3637def test_not_authenticated_triggers_auth (
3738 mock_get_auth : MagicMock , mock_auth_manager_cls : MagicMock , mock_ctx : MagicMock
3839) -> None :
@@ -45,9 +46,9 @@ def test_not_authenticated_triggers_auth(
4546 mock_auth_manager_cls .return_value .authenticate .assert_called_once ()
4647
4748
48- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. handle_auth_exception' )
49- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. AuthManager' )
50- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
49+ @patch . object ( _session_start_mod , ' handle_auth_exception' )
50+ @patch . object ( _session_start_mod , ' AuthManager' )
51+ @patch . object ( _session_start_mod , ' get_authorization_info' )
5152def test_auth_failure_handled_gracefully (
5253 mock_get_auth : MagicMock ,
5354 mock_auth_manager_cls : MagicMock ,
@@ -67,7 +68,7 @@ def test_auth_failure_handled_gracefully(
6768# Stdin / payload tests
6869
6970
70- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
71+ @patch . object ( _session_start_mod , ' get_authorization_info' )
7172def test_tty_stdin_auth_only (mock_get_auth : MagicMock , mock_ctx : MagicMock ) -> None :
7273 """When stdin is a TTY (old hooks), only auth is performed."""
7374 mock_get_auth .return_value = MagicMock ()
@@ -80,8 +81,8 @@ def test_tty_stdin_auth_only(mock_get_auth: MagicMock, mock_ctx: MagicMock) -> N
8081 mock_stdin .read .assert_not_called ()
8182
8283
83- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
84- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
84+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
85+ @patch . object ( _session_start_mod , ' get_authorization_info' )
8586def test_empty_stdin_skips_session_init (
8687 mock_get_auth : MagicMock , mock_get_client : MagicMock , mock_ctx : MagicMock
8788) -> None :
@@ -94,8 +95,8 @@ def test_empty_stdin_skips_session_init(
9495 mock_get_client .assert_not_called ()
9596
9697
97- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
98- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
98+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
99+ @patch . object ( _session_start_mod , ' get_authorization_info' )
99100def test_invalid_json_stdin_skips_session_init (
100101 mock_get_auth : MagicMock , mock_get_client : MagicMock , mock_ctx : MagicMock
101102) -> None :
@@ -111,10 +112,10 @@ def test_invalid_json_stdin_skips_session_init(
111112# Conversation creation tests
112113
113114
114- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. extract_from_claude_transcript' )
115- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_config' )
116- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
117- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
115+ @patch . object ( _session_start_mod , ' extract_from_claude_transcript' )
116+ @patch . object ( _session_start_mod , ' load_claude_config' )
117+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
118+ @patch . object ( _session_start_mod , ' get_authorization_info' )
118119def test_claude_code_creates_conversation (
119120 mock_get_auth : MagicMock ,
120121 mock_get_client : MagicMock ,
@@ -145,8 +146,8 @@ def test_claude_code_creates_conversation(
145146 assert call_payload .ide_version == '2.1.20'
146147
147148
148- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
149- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
149+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
150+ @patch . object ( _session_start_mod , ' get_authorization_info' )
150151def test_cursor_creates_conversation (
151152 mock_get_auth : MagicMock ,
152153 mock_get_client : MagicMock ,
@@ -175,9 +176,9 @@ def test_cursor_creates_conversation(
175176 assert call_payload .ide_provider == 'cursor'
176177
177178
178- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_config' )
179- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
180- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
179+ @patch . object ( _session_start_mod , ' load_claude_config' )
180+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
181+ @patch . object ( _session_start_mod , ' get_authorization_info' )
181182def test_conversation_creation_failure_non_blocking (
182183 mock_get_auth : MagicMock ,
183184 mock_get_client : MagicMock ,
@@ -202,10 +203,10 @@ def test_conversation_creation_failure_non_blocking(
202203# MCP server reporting tests
203204
204205
205- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_settings' )
206- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_config' )
207- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
208- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
206+ @patch . object ( _session_start_mod , ' load_claude_settings' )
207+ @patch . object ( _session_start_mod , ' load_claude_config' )
208+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
209+ @patch . object ( _session_start_mod , ' get_authorization_info' )
209210def test_claude_code_reports_mcp_servers (
210211 mock_get_auth : MagicMock ,
211212 mock_get_client : MagicMock ,
@@ -236,10 +237,10 @@ def test_claude_code_reports_mcp_servers(
236237 )
237238
238239
239- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_settings' )
240- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_config' )
241- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
242- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
240+ @patch . object ( _session_start_mod , ' load_claude_settings' )
241+ @patch . object ( _session_start_mod , ' load_claude_config' )
242+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
243+ @patch . object ( _session_start_mod , ' get_authorization_info' )
243244def test_claude_code_merges_plugin_mcp_servers_and_metadata (
244245 mock_get_auth : MagicMock ,
245246 mock_get_client : MagicMock ,
@@ -289,15 +290,16 @@ def test_claude_code_merges_plugin_mcp_servers_and_metadata(
289290 'name' : 'cycode-dev' ,
290291 'version' : '1.0.28' ,
291292 'description' : 'Shared skills' ,
293+ 'mcp_server_names' : ['aspire' ],
292294 }
293295 },
294296 )
295297
296298
297- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_settings' )
298- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_claude_config' )
299- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
300- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
299+ @patch . object ( _session_start_mod , ' load_claude_settings' )
300+ @patch . object ( _session_start_mod , ' load_claude_config' )
301+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
302+ @patch . object ( _session_start_mod , ' get_authorization_info' )
301303def test_claude_code_no_mcp_servers_no_plugins_skips_report (
302304 mock_get_auth : MagicMock ,
303305 mock_get_client : MagicMock ,
@@ -320,9 +322,9 @@ def test_claude_code_no_mcp_servers_no_plugins_skips_report(
320322 mock_ai_client .report_session_context .assert_not_called ()
321323
322324
323- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_cursor_config' )
324- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
325- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
325+ @patch . object ( _session_start_mod , ' load_cursor_config' )
326+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
327+ @patch . object ( _session_start_mod , ' get_authorization_info' )
326328def test_cursor_reports_mcp_servers (
327329 mock_get_auth : MagicMock ,
328330 mock_get_client : MagicMock ,
@@ -344,9 +346,9 @@ def test_cursor_reports_mcp_servers(
344346 mock_ai_client .report_session_context .assert_called_once_with (mcp_servers = mcp_servers , enabled_plugins = {})
345347
346348
347- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. load_cursor_config' )
348- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
349- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
349+ @patch . object ( _session_start_mod , ' load_cursor_config' )
350+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
351+ @patch . object ( _session_start_mod , ' get_authorization_info' )
350352def test_cursor_no_mcp_servers_skips_report (
351353 mock_get_auth : MagicMock ,
352354 mock_get_client : MagicMock ,
@@ -367,10 +369,10 @@ def test_cursor_no_mcp_servers_skips_report(
367369 mock_ai_client .report_session_context .assert_not_called ()
368370
369371
370- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. handle_auth_exception' )
371- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. AuthManager' )
372- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_ai_security_manager_client' )
373- @patch ( 'cycode.cli.apps.ai_guardrails.session_start_command. get_authorization_info' )
372+ @patch . object ( _session_start_mod , ' handle_auth_exception' )
373+ @patch . object ( _session_start_mod , ' AuthManager' )
374+ @patch . object ( _session_start_mod , ' get_ai_security_manager_client' )
375+ @patch . object ( _session_start_mod , ' get_authorization_info' )
374376def test_unauthenticated_skips_session_init (
375377 mock_get_auth : MagicMock ,
376378 mock_get_client : MagicMock ,
0 commit comments