main
py 119 lines 4.04 KB
Raw
1 # Copyright 2026 Google LLC
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 from unittest.mock import MagicMock, patch
16 import pytest
17 import typer
18 from colab_cli.auth import AuthProvider
19 from colab_cli.common import State
20
21
22 def test_resolve_session_no_local_sessions():
23 state = State()
24 state._store = MagicMock()
25 state._store.list.return_value = {}
26
27 with patch("typer.echo") as mock_echo:
28 with pytest.raises(typer.Exit):
29 state.resolve_session(None)
30 mock_echo.assert_any_call(
31 "[colab] Error: No active sessions found. Create one with 'colab new'."
32 )
33
34
35 def test_resolve_session_with_local_but_none_on_server():
36 state = State()
37 state._store = MagicMock()
38 # Local session exists
39 mock_session = MagicMock()
40 mock_session.endpoint = "e1"
41 state._store.list.return_value = {"s1": mock_session}
42
43 # But server says no assignments
44 state._client = MagicMock()
45 state._client.list_assignments.return_value = []
46
47 # Mock history and store.remove
48 state._history = MagicMock()
49
50 with patch("typer.echo") as mock_echo:
51 with pytest.raises(typer.Exit):
52 state.resolve_session(None)
53 mock_echo.assert_any_call("[colab] Pruned 1 stale local session(s).")
54 mock_echo.assert_any_call(
55 "[colab] Error: No active sessions found. Create one with 'colab new'."
56 )
57
58 state._store.remove.assert_called_with("s1")
59
60
61 def test_sync_sessions_avoids_client_if_no_local():
62 state = State()
63 state._store = MagicMock()
64 state._store.list.return_value = {}
65
66 # We want to verify that self.client is NOT accessed if store.list() is empty
67 # unless we explicitly call sync_sessions.
68 # Actually, in my current implementation of sync_sessions, I still call self.client.list_assignments()
69 # to support 'colab sessions' but I wrap it in a try-except.
70
71 with patch.object(State, "client", new_callable=MagicMock) as mock_client_prop:
72 state.sync_sessions()
73 # My implementation DOES call it to return assignments.
74 mock_client_prop.list_assignments.assert_called_once()
75
76
77 def test_resolve_session_avoids_sync_if_no_local():
78 state = State()
79 state._store = MagicMock()
80 state._store.list.return_value = {}
81
82 with patch.object(State, "sync_sessions") as mock_sync:
83 with pytest.raises(typer.Exit):
84 state.resolve_session(None)
85 mock_sync.assert_not_called()
86
87
88 def test_state_client_auth_flag_propagation():
89 state = State()
90 state.auth_provider = AuthProvider.OAUTH2
91
92 with patch("colab_cli.common.get_credentials") as mock_get_creds:
93 with patch("colab_cli.common.Client"):
94 _ = state.client
95 mock_get_creds.assert_called_once()
96 args, kwargs = mock_get_creds.call_args
97 assert kwargs["provider"] is AuthProvider.OAUTH2
98
99
100 def test_state_client_auth_provider_default_is_oauth2():
101 state = State()
102 assert state.auth_provider is AuthProvider.OAUTH2
103
104 with patch("colab_cli.common.get_credentials") as mock_get_creds:
105 with patch("colab_cli.common.Client"):
106 _ = state.client
107 args, kwargs = mock_get_creds.call_args
108 assert kwargs["provider"] is AuthProvider.OAUTH2
109
110
111 def test_state_client_auth_provider_adc():
112 state = State()
113 state.auth_provider = AuthProvider.ADC
114
115 with patch("colab_cli.common.get_credentials") as mock_get_creds:
116 with patch("colab_cli.common.Client"):
117 _ = state.client
118 args, kwargs = mock_get_creds.call_args
119 assert kwargs["provider"] is AuthProvider.ADC