Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import responses 

2from urllib.parse import urlencode 

3from flask_testing import TestCase 

4from webapp.app import create_app 

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 }, 

42 { 

43 "channel": { 

44 "architecture": "amd64", 

45 "name": "stable", 

46 "risk": "stable", 

47 "track": "test", 

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

49 }, 

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

51 "version": "1.0", 

52 "confinement": "conf", 

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

54 }, 

55 ], 

56 } 

57 

58 def setUp(self): 

59 self.snap_name = "toto" 

60 self.api_url = "".join( 

61 [ 

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

63 "snaps/info/", 

64 self.snap_name, 

65 "?", 

66 urlencode( 

67 { 

68 "fields": ",".join( 

69 [ 

70 "title", 

71 "summary", 

72 "description", 

73 "license", 

74 "contact", 

75 "website", 

76 "publisher", 

77 "media", 

78 "download", 

79 "version", 

80 "created-at", 

81 "confinement", 

82 "categories", 

83 "trending", 

84 "unlisted", 

85 "links", 

86 ] 

87 ) 

88 } 

89 ), 

90 ] 

91 ) 

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

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

94 

95 def create_app(self): 

96 app = create_app(testing=True) 

97 app.secret_key = "secret_key" 

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

99 

100 return app 

101 

102 @responses.activate 

103 def test_api_404(self): 

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

105 responses.add( 

106 responses.Response( 

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

108 ) 

109 ) 

110 

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

112 

113 assert len(responses.calls) == 1 

114 called = responses.calls[0] 

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

116 

117 assert response.status_code == 404 

118 

119 @responses.activate 

120 def test_api_500(self): 

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

122 responses.add( 

123 responses.Response( 

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

125 ) 

126 ) 

127 

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

129 

130 assert len(responses.calls) == 1 

131 called = responses.calls[0] 

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

133 

134 assert response.status_code == 502 

135 

136 @responses.activate 

137 def test_api_500_no_answer(self): 

138 responses.add( 

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

140 ) 

141 

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

143 

144 assert len(responses.calls) == 1 

145 called = responses.calls[0] 

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

147 

148 assert response.status_code == 502 

149 

150 @responses.activate 

151 def test_get_badge(self): 

152 payload = self.snap_payload 

153 

154 responses.add( 

155 responses.Response( 

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

157 ) 

158 ) 

159 

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

161 

162 self.assertEqual(response.status_code, 200) 

163 

164 @responses.activate 

165 def test_get_trending_empty(self): 

166 payload = self.snap_payload 

167 

168 responses.add( 

169 responses.Response( 

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

171 ) 

172 ) 

173 

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

175 svg = response.get_data(as_text=True) 

176 

177 self.assertEqual(response.status_code, 200) 

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

179 

180 @responses.activate 

181 def test_get_trending_is_trending(self): 

182 payload = self.snap_payload 

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

184 

185 responses.add( 

186 responses.Response( 

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

188 ) 

189 ) 

190 

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

192 svg = response.get_data(as_text=True) 

193 

194 self.assertEqual(response.status_code, 200) 

195 self.assertTrue("Trending" in svg) 

196 

197 # external access to trending preview should show empty SVG 

198 @responses.activate 

199 def test_get_trending_preview_external(self): 

200 payload = self.snap_payload 

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

202 

203 responses.add( 

204 responses.Response( 

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

206 ) 

207 ) 

208 

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

210 response = self.client.get(preview_url) 

211 svg = response.get_data(as_text=True) 

212 

213 self.assertEqual(response.status_code, 200) 

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

215 

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

217 @responses.activate 

218 def test_get_trending_preview_publisher(self): 

219 payload = self.snap_payload 

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

221 

222 responses.add( 

223 responses.Response( 

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

225 ) 

226 ) 

227 

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

229 # make test session 'authenticated' 

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

231 s["macaroon_root"] = "test" 

232 s["macaroon_discharge"] = "test" 

233 # mock test user snaps list 

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

235 

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

237 response = self.client.get(preview_url) 

238 svg = response.get_data(as_text=True) 

239 

240 self.assertEqual(response.status_code, 200) 

241 self.assertTrue("Trending" in svg)