Coverage for tests/store/tests_github_badge.py: 100%

90 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-10 22:08 +0000

1import responses 

2from urllib.parse import urlencode 

3from webapp.app import create_app 

4from flask_testing import TestCase 

5 

6 

7class GetGitHubBadgeTest(TestCase): 

8 snap_payload = { 

9 "snap-id": "id", 

10 "name": "snapName", 

11 "default-track": "test", 

12 "snap": { 

13 "title": "Snap Title", 

14 "summary": "This is a summary", 

15 "description": "this is a description", 

16 "media": [], 

17 "license": "license", 

18 "publisher": { 

19 "display-name": "Toto", 

20 "username": "toto", 

21 "validation": True, 

22 }, 

23 "categories": [{"name": "test"}], 

24 "trending": False, 

25 "unlisted": False, 

26 "links": {}, 

27 }, 

28 "channel-map": [ 

29 { 

30 "channel": { 

31 "architecture": "amd64", 

32 "name": "stable", 

33 "risk": "stable", 

34 "track": "latest", 

35 "released-at": "2018-09-18T14:45:28.064633+00:00", 

36 }, 

37 "created-at": "2018-09-18T14:45:28.064633+00:00", 

38 "version": "1.0", 

39 "confinement": "conf", 

40 "download": {"size": 100000}, 

41 "revision": 1, 

42 }, 

43 { 

44 "channel": { 

45 "architecture": "amd64", 

46 "name": "stable", 

47 "risk": "stable", 

48 "track": "test", 

49 "released-at": "2018-09-18T14:45:28.064633+00:00", 

50 }, 

51 "created-at": "2018-09-18T14:45:28.064633+00:00", 

52 "version": "1.0", 

53 "confinement": "conf", 

54 "download": {"size": 100000}, 

55 "revision": 1, 

56 }, 

57 ], 

58 } 

59 

60 def setUp(self): 

61 super().setUp() 

62 self.snap_name = "toto" 

63 self.api_url = "".join( 

64 [ 

65 "https://api.snapcraft.io/v2/", 

66 "snaps/info/", 

67 self.snap_name, 

68 "?", 

69 urlencode( 

70 { 

71 "fields": ",".join( 

72 [ 

73 "title", 

74 "summary", 

75 "description", 

76 "license", 

77 "contact", 

78 "website", 

79 "publisher", 

80 "media", 

81 "download", 

82 "version", 

83 "created-at", 

84 "confinement", 

85 "categories", 

86 "trending", 

87 "unlisted", 

88 "links", 

89 "revision", 

90 "sboms", 

91 ] 

92 ) 

93 } 

94 ), 

95 ] 

96 ) 

97 self.badge_url = "/" + self.snap_name + "/badge.svg" 

98 self.trending_url = "/" + self.snap_name + "/trending.svg" 

99 

100 def create_app(self): 

101 app = create_app(testing=True) 

102 app.secret_key = "secret_key" 

103 app.config["WTF_CSRF_METHODS"] = [] 

104 

105 return app 

106 

107 @responses.activate 

108 def test_api_404(self): 

109 payload = {"error-list": []} 

110 responses.add( 

111 responses.Response( 

112 method="GET", url=self.api_url, json=payload, status=404 

113 ) 

114 ) 

115 

116 response = self.client.get(self.badge_url) 

117 

118 assert len(responses.calls) == 1 

119 called = responses.calls[0] 

120 assert called.request.url == self.api_url 

121 

122 assert response.status_code == 404 

123 

124 @responses.activate 

125 def test_api_500(self): 

126 payload = {"error-list": []} 

127 responses.add( 

128 responses.Response( 

129 method="GET", url=self.api_url, json=payload, status=500 

130 ) 

131 ) 

132 

133 response = self.client.get(self.badge_url) 

134 

135 assert len(responses.calls) == 1 

136 called = responses.calls[0] 

137 assert called.request.url == self.api_url 

138 

139 assert response.status_code == 502 

140 

141 @responses.activate 

142 def test_api_500_no_answer(self): 

143 responses.add( 

144 responses.Response(method="GET", url=self.api_url, status=500) 

145 ) 

146 

147 response = self.client.get(self.badge_url) 

148 

149 assert len(responses.calls) == 1 

150 called = responses.calls[0] 

151 assert called.request.url == self.api_url 

152 

153 assert response.status_code == 502 

154 

155 @responses.activate 

156 def test_get_badge(self): 

157 payload = self.snap_payload 

158 

159 responses.add( 

160 responses.Response( 

161 method="GET", url=self.api_url, json=payload, status=200 

162 ) 

163 ) 

164 

165 response = self.client.get(self.badge_url) 

166 

167 self.assertEqual(response.status_code, 200) 

168 

169 @responses.activate 

170 def test_get_trending_empty(self): 

171 payload = self.snap_payload 

172 

173 responses.add( 

174 responses.Response( 

175 method="GET", url=self.api_url, json=payload, status=200 

176 ) 

177 ) 

178 

179 response = self.client.get(self.trending_url) 

180 svg = response.get_data(as_text=True) 

181 

182 self.assertEqual(response.status_code, 200) 

183 self.assertTrue("Trending" not in svg) 

184 

185 @responses.activate 

186 def test_get_trending_is_trending(self): 

187 payload = self.snap_payload 

188 payload["snap"]["trending"] = True 

189 

190 responses.add( 

191 responses.Response( 

192 method="GET", url=self.api_url, json=payload, status=200 

193 ) 

194 ) 

195 

196 response = self.client.get(self.trending_url) 

197 svg = response.get_data(as_text=True) 

198 

199 self.assertEqual(response.status_code, 200) 

200 self.assertTrue("Trending" in svg) 

201 

202 # external access to trending preview should show empty SVG 

203 @responses.activate 

204 def test_get_trending_preview_external(self): 

205 payload = self.snap_payload 

206 payload["snap"]["trending"] = False 

207 

208 responses.add( 

209 responses.Response( 

210 method="GET", url=self.api_url, json=payload, status=200 

211 ) 

212 ) 

213 

214 preview_url = self.trending_url + "?preview=1" 

215 response = self.client.get(preview_url) 

216 svg = response.get_data(as_text=True) 

217 

218 self.assertEqual(response.status_code, 200) 

219 self.assertTrue("Trending" not in svg) 

220 

221 # internal publisher access to trending preview should show badge SVG 

222 @responses.activate 

223 def test_get_trending_preview_publisher(self): 

224 payload = self.snap_payload 

225 payload["snap"]["trending"] = False 

226 

227 responses.add( 

228 responses.Response( 

229 method="GET", url=self.api_url, json=payload, status=200 

230 ) 

231 ) 

232 

233 with self.client.session_transaction() as s: 

234 # make test session 'authenticated' 

235 s["publisher"] = {"nickname": "toto", "fullname": "Totinio"} 

236 s["macaroon_exchanged"] = "test" 

237 # mock test user snaps list 

238 s["user_snaps"] = {"toto": {"snap-id": "test"}} 

239 

240 preview_url = self.trending_url + "?preview=1" 

241 response = self.client.get(preview_url) 

242 svg = response.get_data(as_text=True) 

243 

244 self.assertEqual(response.status_code, 200) 

245 self.assertTrue("Trending" in svg)