@@ -0,0 +1,309 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Tests for the unified auth module."""
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import json
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import os
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import time
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from pathlib import Path
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from unittest.mock import MagicMock, patch
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from video_processor.auth import (
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ KNOWN_CONFIGS,
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AuthConfig,
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AuthResult,
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OAuthManager,
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ get_auth_config,
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ get_auth_manager,
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # AuthConfig
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAuthConfig:
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_basic_creation(self):
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test")
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.service == "test"
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.supports_oauth is False
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_with_oauth_endpoints(self):
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oauth_authorize_url="https://example.com/auth",
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oauth_token_url="https://example.com/token",
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.supports_oauth is True
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_client_id_from_env(self):
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ client_id_env="TEST_CLIENT_ID",
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {"TEST_CLIENT_ID": "my-id"}):
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_client_id == "my-id"
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_client_id_explicit(self):
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ client_id="explicit-id",
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ client_id_env="TEST_CLIENT_ID",
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_client_id == "explicit-id"
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_api_key(self):
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test", api_key_env="TEST_API_KEY")
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {"TEST_API_KEY": "sk-123"}):
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_api_key == "sk-123"
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_api_key_empty(self):
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test", api_key_env="TEST_API_KEY")
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {}, clear=True):
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_api_key is None
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_token_path_default(self):
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="zoom")
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_token_path.name == "zoom_token.json"
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_token_path_custom(self):
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="zoom",
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_path=Path("/tmp/custom.json"),
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_token_path == Path("/tmp/custom.json")
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_resolved_account_id(self):
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ account_id_env="TEST_ACCOUNT_ID",
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {"TEST_ACCOUNT_ID": "acc-123"}):
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.resolved_account_id == "acc-123"
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # AuthResult
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAuthResult:
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_success(self):
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = AuthResult(
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ success=True,
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ access_token="tok",
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ method="api_key",
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.success
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.access_token == "tok"
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_failure(self):
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = AuthResult(success=False, error="no key")
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert not result.success
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.error == "no key"
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # OAuthManager
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestOAuthManager:
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_api_key_fallback(self):
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ api_key_env="TEST_KEY",
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {"TEST_KEY": "sk-abc"}):
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = manager.authenticate()
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.success
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.access_token == "sk-abc"
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.method == "api_key"
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_no_auth_available(self):
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test")
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {}, clear=True):
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = manager.authenticate()
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert not result.success
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert "No auth method" in result.error
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_saved_token_valid(self, tmp_path):
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file = tmp_path / "token.json"
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_data = {
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "access_token": "saved-tok",
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "expires_at": time.time() + 3600,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file.write_text(json.dumps(token_data))
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_path=token_file,
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = manager.authenticate()
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.success
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.access_token == "saved-tok"
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.method == "saved_token"
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_saved_token_expired_no_refresh(self, tmp_path):
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file = tmp_path / "token.json"
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_data = {
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "access_token": "old-tok",
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "expires_at": time.time() - 100,
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file.write_text(json.dumps(token_data))
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_path=token_file,
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = manager.authenticate()
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert not result.success
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_get_token_convenience(self):
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ api_key_env="TEST_KEY",
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {"TEST_KEY": "sk-xyz"}):
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token = manager.get_token()
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert token == "sk-xyz"
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_get_token_none_on_failure(self):
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test")
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {}, clear=True):
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token = manager.get_token()
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert token is None
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_clear_token(self, tmp_path):
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file = tmp_path / "token.json"
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file.write_text("{}")
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test", token_path=token_file)
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager.clear_token()
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert not token_file.exists()
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_clear_token_no_file(self, tmp_path):
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_path=tmp_path / "nonexistent.json",
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager.clear_token() # should not raise
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_save_token_creates_dir(self, tmp_path):
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nested = tmp_path / "deep" / "dir" / "token.json"
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(service="test", token_path=nested)
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager._save_token({"access_token": "tok"})
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nested.exists()
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ data = json.loads(nested.read_text())
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert data["access_token"] == "tok"
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_saved_token_expired_with_refresh(self, tmp_path):
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file = tmp_path / "token.json"
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_data = {
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "access_token": "old-tok",
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "refresh_token": "ref-tok",
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "expires_at": time.time() - 100,
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "client_id": "cid",
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "client_secret": "csec",
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file.write_text(json.dumps(token_data))
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ oauth_token_url="https://example.com/token",
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_path=token_file,
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_resp = MagicMock()
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_resp.json.return_value = {
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "access_token": "new-tok",
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "refresh_token": "new-ref",
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "expires_in": 7200,
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_resp.raise_for_status = MagicMock()
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("requests.post", return_value=mock_resp):
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = manager.authenticate()
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.success
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.access_token == "new-tok"
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.method == "saved_token"
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_oauth_prefers_saved_over_api_key(self, tmp_path):
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Saved token should be tried before API key fallback."""
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file = tmp_path / "token.json"
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_data = {
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "access_token": "saved-tok",
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "expires_at": time.time() + 3600,
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_file.write_text(json.dumps(token_data))
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = AuthConfig(
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service="test",
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ api_key_env="TEST_KEY",
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ token_path=token_file,
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manager = OAuthManager(config)
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch.dict(os.environ, {"TEST_KEY": "api-key"}):
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = manager.authenticate()
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.access_token == "saved-tok"
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.method == "saved_token"
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Known configs and helpers
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # -----------------------------------------------------------------------
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestKnownConfigs:
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_zoom_config(self):
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = KNOWN_CONFIGS["zoom"]
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.service == "zoom"
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.supports_oauth
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.client_id_env == "ZOOM_CLIENT_ID"
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_notion_config(self):
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = KNOWN_CONFIGS["notion"]
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.api_key_env == "NOTION_API_KEY"
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.supports_oauth
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_github_config(self):
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = KNOWN_CONFIGS["github"]
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.api_key_env == "GITHUB_TOKEN"
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert "repo" in config.scopes
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_dropbox_config(self):
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = KNOWN_CONFIGS["dropbox"]
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.api_key_env == "DROPBOX_ACCESS_TOKEN"
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_google_config(self):
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = KNOWN_CONFIGS["google"]
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.supports_oauth
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_microsoft_config(self):
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config = KNOWN_CONFIGS["microsoft"]
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.supports_oauth
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_all_configs_have_service(self):
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for name, config in KNOWN_CONFIGS.items():
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert config.service == name
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_get_auth_config(self):
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert get_auth_config("zoom") is not None
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert get_auth_config("nonexistent") is None
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_get_auth_manager(self):
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mgr = get_auth_manager("zoom")
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert mgr is not None
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(mgr, OAuthManager)
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_get_auth_manager_unknown(self):
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert get_auth_manager("nonexistent") is None