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

91 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2025-12-29 22:06 +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 ] 

91 ) 

92 } 

93 ), 

94 ] 

95 ) 

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

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

98 

99 def create_app(self): 

100 app = create_app(testing=True) 

101 app.secret_key = "secret_key" 

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

103 

104 return app 

105 

106 @responses.activate 

107 def test_api_404(self): 

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

109 responses.add( 

110 responses.Response( 

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

112 ) 

113 ) 

114 

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

116 

117 assert len(responses.calls) == 1 

118 called = responses.calls[0] 

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

120 

121 assert response.status_code == 404 

122 

123 @responses.activate 

124 def test_api_500(self): 

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

126 responses.add( 

127 responses.Response( 

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

129 ) 

130 ) 

131 

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

133 

134 assert len(responses.calls) == 1 

135 called = responses.calls[0] 

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

137 

138 assert response.status_code == 502 

139 

140 @responses.activate 

141 def test_api_500_no_answer(self): 

142 responses.add( 

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

144 ) 

145 

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

147 

148 assert len(responses.calls) == 1 

149 called = responses.calls[0] 

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

151 

152 assert response.status_code == 502 

153 

154 @responses.activate 

155 def test_get_badge(self): 

156 payload = self.snap_payload 

157 

158 responses.add( 

159 responses.Response( 

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

161 ) 

162 ) 

163 

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

165 

166 self.assertEqual(response.status_code, 200) 

167 

168 @responses.activate 

169 def test_get_trending_empty(self): 

170 payload = self.snap_payload 

171 

172 responses.add( 

173 responses.Response( 

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

175 ) 

176 ) 

177 

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

179 svg = response.get_data(as_text=True) 

180 

181 self.assertEqual(response.status_code, 200) 

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

183 

184 @responses.activate 

185 def test_get_trending_is_trending(self): 

186 payload = self.snap_payload 

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

188 

189 responses.add( 

190 responses.Response( 

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

192 ) 

193 ) 

194 

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

196 svg = response.get_data(as_text=True) 

197 

198 self.assertEqual(response.status_code, 200) 

199 self.assertTrue("Trending" in svg) 

200 

201 # external access to trending preview should show empty SVG 

202 @responses.activate 

203 def test_get_trending_preview_external(self): 

204 payload = self.snap_payload 

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

206 

207 responses.add( 

208 responses.Response( 

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

210 ) 

211 ) 

212 

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

214 response = self.client.get(preview_url) 

215 svg = response.get_data(as_text=True) 

216 

217 self.assertEqual(response.status_code, 200) 

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

219 

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

221 @responses.activate 

222 def test_get_trending_preview_publisher(self): 

223 payload = self.snap_payload 

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

225 

226 responses.add( 

227 responses.Response( 

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

229 ) 

230 ) 

231 

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

233 # make test session 'authenticated' 

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

235 s["macaroon_root"] = "test" 

236 s["macaroon_discharge"] = "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)