89 lines
3.6 KiB
Python
89 lines
3.6 KiB
Python
from __future__ import annotations
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from src.account_runtime import AccountRuntime
|
|
from src.agent_tools import build_tool_context, default_tool_registry, execute_tool
|
|
from src.agent_types import AgentRuntimeConfig
|
|
|
|
|
|
class AccountRuntimeTests(unittest.TestCase):
|
|
def test_account_runtime_discovers_profiles_and_persists_login(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
workspace = Path(tmp_dir)
|
|
(workspace / '.claw-account.json').write_text(
|
|
(
|
|
'{"profiles":['
|
|
'{"name":"local","provider":"openai","identity":"dev@example.com","authMode":"api_key"},'
|
|
'{"name":"team","provider":"anthropic","identity":"team@example.com","org":"Harness"}'
|
|
']}'
|
|
),
|
|
encoding='utf-8',
|
|
)
|
|
with patch.dict('os.environ', {'OPENAI_API_KEY': 'local-token'}, clear=False):
|
|
runtime = AccountRuntime.from_workspace(workspace)
|
|
report = runtime.login('local')
|
|
restored = AccountRuntime.from_workspace(workspace)
|
|
|
|
self.assertEqual(len(runtime.profiles), 2)
|
|
self.assertTrue(report.logged_in)
|
|
self.assertEqual(report.profile_name, 'local')
|
|
self.assertIsNotNone(restored.active_session)
|
|
self.assertEqual(restored.active_session.profile_name, 'local')
|
|
self.assertIn('Credential env vars: OPENAI_API_KEY', restored.render_summary())
|
|
|
|
def test_account_runtime_logout_clears_active_session(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
workspace = Path(tmp_dir)
|
|
(workspace / '.claw-account.json').write_text(
|
|
'{"profiles":[{"name":"local","provider":"openai","identity":"dev@example.com"}]}',
|
|
encoding='utf-8',
|
|
)
|
|
runtime = AccountRuntime.from_workspace(workspace)
|
|
runtime.login('local')
|
|
report = runtime.logout()
|
|
|
|
self.assertFalse(report.logged_in)
|
|
self.assertIn('Logged out dev@example.com', report.detail)
|
|
|
|
def test_account_tools_execute_against_runtime(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
workspace = Path(tmp_dir)
|
|
(workspace / '.claw-account.json').write_text(
|
|
'{"profiles":[{"name":"local","provider":"openai","identity":"dev@example.com"}]}',
|
|
encoding='utf-8',
|
|
)
|
|
runtime = AccountRuntime.from_workspace(workspace)
|
|
context = build_tool_context(
|
|
AgentRuntimeConfig(cwd=workspace),
|
|
account_runtime=runtime,
|
|
)
|
|
list_result = execute_tool(
|
|
default_tool_registry(),
|
|
'account_list_profiles',
|
|
{},
|
|
context,
|
|
)
|
|
login_result = execute_tool(
|
|
default_tool_registry(),
|
|
'account_login',
|
|
{'target': 'local'},
|
|
context,
|
|
)
|
|
status_result = execute_tool(
|
|
default_tool_registry(),
|
|
'account_status',
|
|
{},
|
|
context,
|
|
)
|
|
|
|
self.assertTrue(list_result.ok)
|
|
self.assertIn('dev@example.com', list_result.content)
|
|
self.assertTrue(login_result.ok)
|
|
self.assertIn('profile=local', login_result.content)
|
|
self.assertTrue(status_result.ok)
|
|
self.assertIn('Configured account profiles: 1', status_result.content)
|