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

1import json 1abcdefg

2 

3import pytest 1abcdefg

4import respx 1abcdefg

5from httpx import Response 1abcdefg

6from inline_snapshot import snapshot 1abcdefg

7 

8from fastapi_cloud_cli.cli import cloud_app as app 1abcdefg

9from tests.utils import SnapshotCliRunner 1abcdefg

10 

11runner = SnapshotCliRunner() 1abcdefg

12 

13 

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 ) 

27 

28 result = runner.invoke( 1hijklmn

29 app, 

30 ["teams", "list", "--limit", "100", "--offset", "20", "--json"], 

31 ) 

32 

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

43 

44 

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

49 

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

59 

60 

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

67 

68 result = runner.invoke(app, ["teams", "list"]) 1XYZ0123

69 

70 assert result.exit_code == 1 1XYZ0123

71 assert "Error fetching teams. Please try again later." in result.output 1XYZ0123

72 

73 

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 ) 

94 

95 result = runner.invoke(app, ["teams", "list"]) 1456789!

96 

97 assert result.exit_code == 0 1456789!

98 assert result.output == snapshot("""\ 1456789!

99teams 

100 

101Name ID 

102 

103Acme 00000000-0000-4000-8000-000000000001\ 

104""") 

105 

106 

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 ) 

118 

119 result = runner.invoke(app, ["teams", "list"]) 1#$%'()*

120 

121 assert result.exit_code == 0 1#$%'()*

122 assert result.output == snapshot("""\ 1#$%'()*

123teams 

124 

125No teams found.\ 

126""") 

127 

128 

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+,-./:;

133 

134 assert result.exit_code == 1 1+,-./:;

135 assert result.output == snapshot("""\ 1+,-./:;

136✗ error: No credentials found. 

137 

138 hint: Run `fastapi cloud login`.\ 

139""") 

140 

141 

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 ) 

149 

150 assert result.exit_code == 1 1=?@[]^_

151 assert result.output == snapshot("""\ 1=?@[]^_

152✗ error: No credentials found. 

153 

154 hint: Run `fastapi cloud login`.\ 

155""") 

156 

157 

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

169 

170 result = runner.invoke(app, ["teams", "get", team["id"], "--json"]) 1opqrstu

171 

172 assert result.exit_code == 0 1opqrstu

173 assert json.loads(result.stdout) == {"data": {"team": team}} 1opqrstu

174 assert result.stderr == "" 1opqrstu

175 

176 

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

188 

189 result = runner.invoke(app, ["teams", "get", team["id"]]) 1JKLMNOP

190 

191 assert result.exit_code == 0 1JKLMNOP

192 assert result.output == snapshot("""\ 1JKLMNOP

193🏢 Acme 

194 

195 id 00000000-0000-4000-8000-000000000001 

196 slug acme 

197 url https://dashboard.fastapicloud.com/acme/apps\ 

198""") 

199 

200 

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

208 

209 result = runner.invoke(app, ["teams", "get", team_id, "--json"]) 1vwxyzAB

210 

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

220 

221 

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

229 

230 result = runner.invoke(app, ["teams", "get", team_id, "--json"]) 1CDEFGHI

231 

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