File size: 4,074 Bytes
ceeba19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from autoteam import manager


class _FakeStartedChatGPT:
    browser = True

    def __init__(self, members):
        self.members = list(members)

    def _api_fetch(self, method, path):
        assert method == "GET"
        assert path.endswith("/users")
        import json

        return {"status": 200, "body": json.dumps({"items": self.members})}

    def stop(self):
        self.browser = False


def test_resolve_auth_file_path_handles_container_and_project_relative_paths(tmp_path, monkeypatch):
    project_root = tmp_path / "repo"
    container_auth = project_root / "data" / "auths" / "codex-manual@example.com.json"
    container_auth.parent.mkdir(parents=True)
    container_auth.write_text("{}", encoding="utf-8")
    project_auth = project_root / "auths" / "codex-team@example.com-team.json"
    project_auth.parent.mkdir(parents=True, exist_ok=True)
    project_auth.write_text("{}", encoding="utf-8")

    monkeypatch.setattr(manager, "__file__", str(project_root / "src" / "autoteam" / "manager.py"))

    assert manager._resolve_auth_file_path("/app/data/auths/codex-manual@example.com.json") == container_auth
    assert manager._resolve_auth_file_path("data/auths/codex-manual@example.com.json") == container_auth
    assert manager._resolve_auth_file_path("auths/codex-team@example.com-team.json") == project_auth
    assert manager._has_auth_file({"auth_file": "/app/data/auths/codex-manual@example.com.json"}) is True


def test_find_team_auth_file_uses_search_dirs(tmp_path, monkeypatch):
    auth_dir = tmp_path / "auths"
    auth_dir.mkdir()
    auth_file = auth_dir / "codex-user@example.com-team-1234.json"
    auth_file.write_text("{}", encoding="utf-8")

    monkeypatch.setattr(manager, "_auth_search_dirs", lambda: (auth_dir,))

    assert manager._find_team_auth_file("user@example.com") == str(auth_file)


def test_sync_account_states_recovers_team_auth_file_as_protected(tmp_path, monkeypatch):
    auth_dir = tmp_path / "auths"
    auth_dir.mkdir()
    auth_file = auth_dir / "codex-manual@example.com-team.json"
    auth_file.write_text('{"email": "manual@example.com"}', encoding="utf-8")
    saved = []

    monkeypatch.setattr(manager, "get_chatgpt_account_id", lambda: "acc-1")
    monkeypatch.setattr(manager, "load_accounts", lambda: [])
    monkeypatch.setattr(manager, "save_accounts", lambda accounts: saved.extend(accounts))
    monkeypatch.setattr("autoteam.codex_auth.AUTH_DIR", auth_dir)

    chatgpt = _FakeStartedChatGPT([{"email": "manual@example.com", "user_id": "u-1"}])
    manager.sync_account_states(chatgpt_api=chatgpt)

    assert len(saved) == 1
    assert saved[0]["email"] == "manual@example.com"
    assert saved[0]["status"] == "active"
    assert saved[0]["auth_file"] == str(auth_file)
    assert saved[0]["workspace_account_id"] == "acc-1"
    assert saved[0]["protect_team_seat"] is True


def test_sync_account_states_protects_existing_standby_auth_file(tmp_path, monkeypatch):
    auth_file = tmp_path / "codex-member@example.com-team.json"
    auth_file.write_text("{}", encoding="utf-8")
    empty_auth_dir = tmp_path / "empty-auths"
    empty_auth_dir.mkdir()
    stored = [
        {
            "email": "member@example.com",
            "status": "standby",
            "auth_file": str(auth_file),
            "disabled": False,
        }
    ]
    saved = []

    monkeypatch.setattr(manager, "get_chatgpt_account_id", lambda: "acc-1")
    monkeypatch.setattr(manager, "load_accounts", lambda: [dict(item) for item in stored])
    monkeypatch.setattr(manager, "save_accounts", lambda accounts: saved.extend(accounts))
    monkeypatch.setattr(manager, "update_account", lambda _email, **_fields: None)
    monkeypatch.setattr("autoteam.codex_auth.AUTH_DIR", empty_auth_dir)

    chatgpt = _FakeStartedChatGPT([{"email": "member@example.com", "user_id": "u-1"}])
    manager.sync_account_states(chatgpt_api=chatgpt)

    assert len(saved) == 1
    assert saved[0]["status"] == "active"
    assert saved[0]["workspace_account_id"] == "acc-1"
    assert saved[0]["protect_team_seat"] is True