The sidecar launches a claude run on one Claude login: the default account (the CLI's own ~/.claude) or one declared in SIDECAR_ACCOUNTS (work=~/.claude-work), exported as CLAUDE_CONFIG_DIR for that run. account on /spawn, /resume and /fork; fork finds its source in that account's projects/; a non-default account with no login is a 409; ANTHROPIC_API_KEY is stripped once accounts are declared; no --remote-control for non-default accounts; GET /accounts = claude auth status. backend/accounts.py holds the personal/work profiles and the resolution order (explicit stamp -> import source -> cwd rule -> default), with unit tests.
85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
"""Unit tests for the account profiles (``python3 -m unittest test_accounts``
|
|
from ``backend/`` — stdlib only, no app import)."""
|
|
|
|
import unittest
|
|
|
|
import accounts
|
|
|
|
|
|
class ResolveOrder(unittest.TestCase):
|
|
ORUS = "/home/u/projects/orus-monorepo"
|
|
|
|
def test_default(self):
|
|
self.assertEqual(accounts.resolve({"cwd": "/home/u/homelab"}, {}),
|
|
"personal")
|
|
self.assertEqual(accounts.resolve(None, None), "personal")
|
|
|
|
def test_cwd_rule(self):
|
|
self.assertEqual(accounts.resolve({"cwd": self.ORUS}, {}), "work")
|
|
|
|
def test_source_beats_cwd(self):
|
|
# a work-account session started from a terminal in the homelab
|
|
self.assertEqual(accounts.resolve({"cwd": "/home/u/homelab"},
|
|
{"accountSource": "work"}), "work")
|
|
|
|
def test_explicit_beats_source_and_cwd(self):
|
|
self.assertEqual(accounts.resolve({"cwd": self.ORUS},
|
|
{"account": "personal",
|
|
"accountSource": "work"}),
|
|
"personal")
|
|
|
|
def test_unknown_stamp_ignored(self):
|
|
self.assertEqual(accounts.resolve({"cwd": self.ORUS},
|
|
{"account": "nope"}), "work")
|
|
|
|
|
|
class CwdRule(unittest.TestCase):
|
|
def test_repo_and_subdir(self):
|
|
for cwd in ("/home/u/projects/orus-monorepo",
|
|
"/home/u/projects/orus-monorepo/apps/web",
|
|
"/home/u/projects/orus-monorepo/"):
|
|
self.assertEqual(accounts.account_for_cwd(cwd), "work", cwd)
|
|
|
|
def test_worktrees(self):
|
|
self.assertEqual(
|
|
accounts.account_for_cwd("/home/u/worktrees/orus-monorepo-fix-bug"),
|
|
"work")
|
|
self.assertEqual(
|
|
accounts.account_for_cwd("/home/u/worktrees/orus-monorepo-a/pkg"),
|
|
"work")
|
|
|
|
def test_non_matches(self):
|
|
for cwd in ("/home/u/homelab", "/home/u/projects/ai-agent",
|
|
"/home/u/projects/orus-monorepo-notes",
|
|
"/home/u/worktrees/homelab-orus-monorepo",
|
|
"", None):
|
|
self.assertIsNone(accounts.account_for_cwd(cwd), cwd)
|
|
|
|
|
|
class Projects(unittest.TestCase):
|
|
def test_routing(self):
|
|
self.assertEqual(accounts.account_for_projects(["orus-monorepo"]), "work")
|
|
self.assertEqual(
|
|
accounts.account_for_projects(["homelab", "project:orus-monorepo"]),
|
|
"work")
|
|
self.assertIsNone(accounts.account_for_projects(["ai-agent"]))
|
|
self.assertIsNone(accounts.account_for_projects(None))
|
|
|
|
|
|
class Selector(unittest.TestCase):
|
|
def test_totals_default_excludes_work(self):
|
|
sel = accounts.selector(None)
|
|
self.assertTrue(sel("personal"))
|
|
self.assertFalse(sel("work"))
|
|
self.assertTrue(sel(None)) # unresolved ⇒ default account
|
|
|
|
def test_all_and_one(self):
|
|
self.assertTrue(accounts.selector("all")("work"))
|
|
self.assertTrue(accounts.selector("work")("work"))
|
|
self.assertFalse(accounts.selector("work")("personal"))
|
|
self.assertFalse(accounts.selector("bogus")("personal"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|