forked from coredevices/pebble-tool
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_account_command.py
More file actions
175 lines (117 loc) · 5.2 KB
/
Copy pathtest_account_command.py
File metadata and controls
175 lines (117 loc) · 5.2 KB
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
from __future__ import annotations
from argparse import Namespace
import requests
from pebble_tool.commands.account import LogInCommand, LogOutCommand
class _Resp:
def __init__(self, payload, status_code=200, text=""):
self._payload = payload
self.status_code = status_code
self.text = text
def json(self):
return self._payload
class _FakeAccount:
def __init__(self, logged_in=False):
self.is_logged_in = logged_in
self.email = None
self.id = None
self._creds = {}
self.saved_creds = None
self.logged_in_args = None
self.login_token = None
self.logged_out = False
def get_credentials(self):
return dict(self._creds)
def get_access_token(self):
return "id-token"
def _save_credentials(self, creds):
self.saved_creds = dict(creds)
self._creds = dict(creds)
def login(self, args):
self.logged_in_args = args
def login_with_token(self, token):
self.login_token = token
def logout(self):
self.logged_out = True
def _args(**kw):
base = {"v": 0, "status": False, "id_token": None}
base.update(kw)
return Namespace(**base)
def test_login_status_logged_out(monkeypatch, capsys):
account = _FakeAccount(logged_in=False)
monkeypatch.setattr("pebble_tool.commands.account.get_account", lambda auth_provider: account)
LogInCommand()(_args(status=True))
out = capsys.readouterr().out
assert "Firebase login status: logged out" in out
def test_login_status_logged_in_linked_shows_developer_id(monkeypatch, capsys):
account = _FakeAccount(logged_in=True)
account._creds = {"identity_provider": "dashboard", "firebase_user_id": "uid-123"}
monkeypatch.setattr("pebble_tool.commands.account.get_account", lambda auth_provider: account)
def fake_get(url, headers=None, timeout=None):
return _Resp(
{
"developer": {
"id": "55023b8faab67cd8c7000049",
"email": "[email protected]",
"firebase_uid": "uid-123",
}
},
status_code=200,
)
monkeypatch.setattr("pebble_tool.commands.account.requests.get", fake_get)
LogInCommand()(_args(status=True))
out = capsys.readouterr().out
assert "Developer ID: 55023b8faab67cd8c7000049" in out
assert "Developer link: linked" in out
assert "Email: [email protected]" in out
assert account.saved_creds["email"] == "[email protected]"
def test_login_status_not_linked(monkeypatch, capsys):
account = _FakeAccount(logged_in=True)
account._creds = {"identity_provider": "dashboard"}
monkeypatch.setattr("pebble_tool.commands.account.get_account", lambda auth_provider: account)
def fake_get(url, headers=None, timeout=None):
return _Resp({"code": "DEVELOPER_NOT_LINKED"}, status_code=403)
monkeypatch.setattr("pebble_tool.commands.account.requests.get", fake_get)
LogInCommand()(_args(status=True))
out = capsys.readouterr().out
assert "Developer link: not linked" in out
def test_login_status_check_failed_exception(monkeypatch, capsys):
account = _FakeAccount(logged_in=True)
monkeypatch.setattr("pebble_tool.commands.account.get_account", lambda auth_provider: account)
def fake_get(url, headers=None, timeout=None):
raise requests.RequestException("boom")
monkeypatch.setattr("pebble_tool.commands.account.requests.get", fake_get)
LogInCommand()(_args(status=True))
out = capsys.readouterr().out
assert "Developer link: check failed" in out
assert "Developer link error: boom" in out
def test_login_with_id_token(monkeypatch, capsys):
account = _FakeAccount(logged_in=False)
monkeypatch.setattr("pebble_tool.commands.account.get_account", lambda auth_provider: account)
LogInCommand()(_args(id_token="abc123"))
out = capsys.readouterr().out
assert "Successfully logged in with provided Firebase id token." in out
assert account.login_token == "abc123"
def test_login_interactive_path_calls_account_login(monkeypatch):
account = _FakeAccount(logged_in=False)
monkeypatch.setattr("pebble_tool.commands.account.get_account", lambda auth_provider: account)
args = _args()
LogInCommand()(args)
assert account.logged_in_args is args
def test_logout_command_logs_out_all(monkeypatch):
firebase = _FakeAccount(logged_in=True)
legacy = _FakeAccount(logged_in=True)
def fake_get_account(auth_provider):
return firebase if auth_provider == "firebase" else legacy
monkeypatch.setattr("pebble_tool.commands.account.get_account", fake_get_account)
LogOutCommand()(_args())
assert firebase.logged_out is True
assert legacy.logged_out is True
def test_logout_command_prints_when_nothing_to_do(monkeypatch, capsys):
firebase = _FakeAccount(logged_in=False)
legacy = _FakeAccount(logged_in=False)
def fake_get_account(auth_provider):
return firebase if auth_provider == "firebase" else legacy
monkeypatch.setattr("pebble_tool.commands.account.get_account", fake_get_account)
LogOutCommand()(_args())
out = capsys.readouterr().out
assert "You aren't logged in anyway." in out