Coverage for tests/test_cli_teams.py: 100%
78 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-09 00:25 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-09 00:25 +0000
1import json 1abcdefg
3import pytest 1abcdefg
4import respx 1abcdefg
5from httpx import Response 1abcdefg
6from inline_snapshot import snapshot 1abcdefg
8from fastapi_cloud_cli.cli import cloud_app as app 1abcdefg
9from tests.utils import SnapshotCliRunner 1abcdefg
11runner = SnapshotCliRunner() 1abcdefg
14@pytest.mark.respx 1abcdefg
15def test_lists_teams_as_json_with_pagination_params( 1abcdefg
16 logged_in_cli: None,
17 respx_mock: respx.MockRouter,
18) -> None:
19 team = { 1hijklmn
20 "id": "00000000-0000-4000-8000-000000000001",
21 "slug": "acme",
22 "name": "Acme",
23 }
24 respx_mock.get("/teams/", params={"limit": "100", "skip": "20"}).mock( 1hijklmn
25 return_value=Response(200, json={"data": [team], "count": 1})
26 )
28 result = runner.invoke( 1hijklmn
29 app,
30 ["teams", "list", "--limit", "100", "--offset", "20", "--json"],
31 )
33 assert result.exit_code == 0 1hijklmn
34 assert json.loads(result.stdout) == { 1hijklmn
35 "data": {
36 "teams": [team],
37 "total_count": 1,
38 "limit": 100,
39 "offset": 20,
40 }
41 }
42 assert result.stderr == "" 1hijklmn
45def test_lists_teams_json_returns_not_logged_in_when_logged_out( 1abcdefg
46 logged_out_cli: None,
47) -> None:
48 result = runner.invoke(app, ["teams", "list", "--json"]) 1QRSTUVW
50 assert result.exit_code == 1 1QRSTUVW
51 assert json.loads(result.stdout) == { 1QRSTUVW
52 "error": {
53 "code": "not_logged_in",
54 "message": "No credentials found.",
55 "hint": "Run `fastapi cloud login`.",
56 }
57 }
58 assert result.stderr == "" 1QRSTUVW
61@pytest.mark.respx 1abcdefg
62def test_lists_teams_human_shows_api_error( 1abcdefg
63 logged_in_cli: None,
64 respx_mock: respx.MockRouter,
65) -> None:
66 respx_mock.get("/teams/").mock(return_value=Response(500)) 1XYZ0123
68 result = runner.invoke(app, ["teams", "list"]) 1XYZ0123
70 assert result.exit_code == 1 1XYZ0123
71 assert "Error fetching teams. Please try again later." in result.output 1XYZ0123
74@pytest.mark.respx 1abcdefg
75def test_lists_teams_in_human_output( 1abcdefg
76 logged_in_cli: None,
77 respx_mock: respx.MockRouter,
78) -> None:
79 respx_mock.get("/teams/").mock( 1456789!
80 return_value=Response(
81 200,
82 json={
83 "data": [
84 {
85 "id": "00000000-0000-4000-8000-000000000001",
86 "slug": "acme",
87 "name": "Acme",
88 }
89 ],
90 "count": 1,
91 },
92 )
93 )
95 result = runner.invoke(app, ["teams", "list"]) 1456789!
97 assert result.exit_code == 0 1456789!
98 assert result.output == snapshot("""\ 1456789!
99teams
101Name ID
103Acme 00000000-0000-4000-8000-000000000001\
104""")
107@pytest.mark.respx 1abcdefg
108def test_lists_teams_in_human_output_empty( 1abcdefg
109 logged_in_cli: None,
110 respx_mock: respx.MockRouter,
111) -> None:
112 respx_mock.get("/teams/").mock( 1#$%'()*
113 return_value=Response(
114 200,
115 json={"data": [], "count": 1},
116 )
117 )
119 result = runner.invoke(app, ["teams", "list"]) 1#$%'()*
121 assert result.exit_code == 0 1#$%'()*
122 assert result.output == snapshot("""\ 1#$%'()*
123teams
125No teams found.\
126""")
129def test_lists_teams_human_returns_not_logged_in_when_logged_out( 1abcdefg
130 logged_out_cli: None,
131) -> None:
132 result = runner.invoke(app, ["teams", "list"]) 1+,-./:;
134 assert result.exit_code == 1 1+,-./:;
135 assert result.output == snapshot("""\ 1+,-./:;
136✗ error: No credentials found.
138 hint: Run `fastapi cloud login`.\
139""")
142def test_gets_team_human_returns_not_logged_in_when_logged_out( 1abcdefg
143 logged_out_cli: None,
144) -> None:
145 result = runner.invoke( 1=?@[]^_
146 app,
147 ["teams", "get", "00000000-0000-4000-8000-000000000001"],
148 )
150 assert result.exit_code == 1 1=?@[]^_
151 assert result.output == snapshot("""\ 1=?@[]^_
152✗ error: No credentials found.
154 hint: Run `fastapi cloud login`.\
155""")
158@pytest.mark.respx 1abcdefg
159def test_gets_team_as_json( 1abcdefg
160 logged_in_cli: None,
161 respx_mock: respx.MockRouter,
162) -> None:
163 team = { 1opqrstu
164 "id": "00000000-0000-4000-8000-000000000001",
165 "slug": "acme",
166 "name": "Acme",
167 }
168 respx_mock.get(f"/teams/{team['id']}").mock(return_value=Response(200, json=team)) 1opqrstu
170 result = runner.invoke(app, ["teams", "get", team["id"], "--json"]) 1opqrstu
172 assert result.exit_code == 0 1opqrstu
173 assert json.loads(result.stdout) == {"data": {"team": team}} 1opqrstu
174 assert result.stderr == "" 1opqrstu
177@pytest.mark.respx 1abcdefg
178def test_gets_team_in_human_output( 1abcdefg
179 logged_in_cli: None,
180 respx_mock: respx.MockRouter,
181) -> None:
182 team = { 1JKLMNOP
183 "id": "00000000-0000-4000-8000-000000000001",
184 "slug": "acme",
185 "name": "Acme",
186 }
187 respx_mock.get(f"/teams/{team['id']}").mock(return_value=Response(200, json=team)) 1JKLMNOP
189 result = runner.invoke(app, ["teams", "get", team["id"]]) 1JKLMNOP
191 assert result.exit_code == 0 1JKLMNOP
192 assert result.output == snapshot("""\ 1JKLMNOP
193🏢 Acme
195 id 00000000-0000-4000-8000-000000000001
196 slug acme
197 url https://dashboard.fastapicloud.com/acme/apps\
198""")
201@pytest.mark.respx 1abcdefg
202def test_gets_team_json_returns_not_found_for_unknown_team( 1abcdefg
203 logged_in_cli: None,
204 respx_mock: respx.MockRouter,
205) -> None:
206 team_id = "00000000-0000-4000-8000-000000000001" 1vwxyzAB
207 respx_mock.get(f"/teams/{team_id}").mock(return_value=Response(404)) 1vwxyzAB
209 result = runner.invoke(app, ["teams", "get", team_id, "--json"]) 1vwxyzAB
211 assert result.exit_code == 1 1vwxyzAB
212 assert json.loads(result.stdout) == { 1vwxyzAB
213 "error": {
214 "code": "not_found",
215 "message": "Team not found.",
216 "hint": None,
217 }
218 }
219 assert result.stderr == "" 1vwxyzAB
222@pytest.mark.respx 1abcdefg
223def test_gets_team_json_returns_permission_denied( 1abcdefg
224 logged_in_cli: None,
225 respx_mock: respx.MockRouter,
226) -> None:
227 team_id = "00000000-0000-4000-8000-000000000001" 1CDEFGHI
228 respx_mock.get(f"/teams/{team_id}").mock(return_value=Response(403)) 1CDEFGHI
230 result = runner.invoke(app, ["teams", "get", team_id, "--json"]) 1CDEFGHI
232 assert result.exit_code == 1 1CDEFGHI
233 assert json.loads(result.stdout) == { 1CDEFGHI
234 "error": {
235 "code": "permission_denied",
236 "message": "You don't have permissions for this resource",
237 "hint": None,
238 }
239 }
240 assert result.stderr == "" 1CDEFGHI