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

48 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-17 22:07 +0000

1import responses 

2from urllib.parse import urlencode 

3from flask_testing import TestCase 

4from webapp.app import create_app 

5 

6 

7JETBRAINS_SEARCH_RESPONSE = { 

8 "_embedded": { 

9 "clickindex:package": [ 

10 { 

11 "apps": ["space"], 

12 "architecture": ["amd64"], 

13 "developer_id": "28zEonXNoBLvIB7xneRbltOsp0Nf7DwS", 

14 "developer_name": "jetbrains", 

15 "developer_validation": "verified", 

16 "media": [ 

17 { 

18 "height": 512, 

19 "type": "icon", 

20 "url": ( 

21 "https://dashboard.snapcraft.io/site_media/" 

22 "appmedia/2019/12/ezgif.com-gif-maker.png" 

23 ), 

24 "width": 512, 

25 }, 

26 { 

27 "height": 1860, 

28 "type": "screenshot", 

29 "url": ( 

30 "https://dashboard.snapcraft.io/site_media/" 

31 "appmedia/2019/12/home_for_teams.png" 

32 ), 

33 "width": 2880, 

34 }, 

35 ], 

36 "origin": "jetbrains", 

37 "package_name": "space", 

38 "sections": [ 

39 { 

40 "featured": False, 

41 "name": "development", 

42 }, 

43 ], 

44 "summary": "Desktop Application for JetBrains Space", 

45 "title": "Space", 

46 }, 

47 ] 

48 }, 

49} 

50 

51JETBRAINS_FIND_RESPONSE = { 

52 "results": [ 

53 { 

54 "name": "pycharm-community", 

55 "snap": { 

56 "media": [ 

57 { 

58 "height": 400, 

59 "type": "icon", 

60 "url": ( 

61 "https://dashboard.snapcraft.io/site_media/" 

62 "appmedia/2024/06/Avatar-7.png" 

63 ), 

64 "width": 400, 

65 }, 

66 { 

67 "height": 2095, 

68 "type": "screenshot", 

69 "url": ( 

70 "https://dashboard.snapcraft.io/site_media/" 

71 "appmedia/2017/12/pycharm_com_general.png" 

72 ), 

73 "width": 3713, 

74 }, 

75 ], 

76 "publisher": { 

77 "display-name": "jetbrains", 

78 "id": "28zEonXNoBLvIB7xneRbltOsp0Nf7DwS", 

79 "username": "jetbrains", 

80 "validation": "verified", 

81 }, 

82 "summary": "PyCharm Community Edition", 

83 "title": "pycharm-community", 

84 }, 

85 "snap-id": "Qo9GiW9eyzgN1tXmWpQ9gdstdFsj4K7E", 

86 }, 

87 ] 

88} 

89 

90LUKEWH_FIND_RESPONSE = { 

91 "results": [ 

92 { 

93 "name": "deluge-lukewh", 

94 "snap": { 

95 "media": [ 

96 { 

97 "height": 300, 

98 "type": "icon", 

99 "url": ( 

100 "https://dashboard.snapcraft.io/site_media/" 

101 "appmedia/2020/04/the-new-deluge-icon-300x300.png" 

102 ), 

103 "width": 300, 

104 }, 

105 { 

106 "height": 720, 

107 "type": "banner", 

108 "url": ( 

109 "https://dashboard.snapcraft.io/site_media/" 

110 "appmedia/2020/05/deluge-banner1.png" 

111 ), 

112 "width": 2160, 

113 }, 

114 ], 

115 "publisher": { 

116 "display-name": "LukeWH", 

117 "id": "GMrEEEdGN4gN9BhRHjRRDCoJuUkyJJnm", 

118 "username": "lukewh", 

119 "validation": "unproven", 

120 }, 

121 "summary": ( 

122 "Deluge is a fully-featured cross-platform " 

123 "BitTorrent client" 

124 ), 

125 "title": "Deluge", 

126 }, 

127 "snap-id": "5dm2RBhIIGdr8sAnA9WJZWco2MQgbni7", 

128 }, 

129 ] 

130} 

131 

132 

133class GetPublisherPageTest(TestCase): 

134 def setUp(self): 

135 self.api_url_publisher_items = "".join( 

136 [ 

137 "https://api.snapcraft.io/api/v1/", 

138 "snaps/search", 

139 "?", 

140 urlencode( 

141 { 

142 "q": "publisher:28zEonXNoBLvIB7xneRbltOsp0Nf7DwS", 

143 "size": "500", 

144 "page": "1", 

145 "scope": "wide", 

146 "confinement": "strict,classic", 

147 "fields": ",".join( 

148 [ 

149 "package_name", 

150 "title", 

151 "summary", 

152 "architecture", 

153 "media", 

154 "developer_name", 

155 "developer_id", 

156 "developer_validation", 

157 "origin", 

158 "apps", 

159 "sections", 

160 ] 

161 ), 

162 "arch": "wide", 

163 } 

164 ), 

165 ] 

166 ) 

167 self.api_url_find = lambda publisher: "".join( 

168 [ 

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

170 "snaps/find", 

171 "?", 

172 urlencode( 

173 { 

174 "publisher": publisher, 

175 "fields": ",".join( 

176 [ 

177 "title", 

178 "summary", 

179 "media", 

180 "publisher", 

181 ] 

182 ), 

183 } 

184 ), 

185 ] 

186 ) 

187 

188 def create_app(self): 

189 app = create_app(testing=True) 

190 app.secret_key = "secret_key" 

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

192 

193 return app 

194 

195 @responses.activate 

196 def test_community_publisher(self): 

197 responses.add( 

198 responses.GET, 

199 self.api_url_find("lukewh"), 

200 json=LUKEWH_FIND_RESPONSE, 

201 status=200, 

202 ) 

203 response = self.client.get("/publisher/lukewh") 

204 self.assertEqual(response.status_code, 200) 

205 self.assert_template_used("store/community-publisher-details.html") 

206 

207 @responses.activate 

208 def test_existant_publisher(self): 

209 responses.add( 

210 responses.GET, 

211 self.api_url_publisher_items, 

212 json=JETBRAINS_SEARCH_RESPONSE, 

213 status=200, 

214 ) 

215 responses.add( 

216 responses.GET, 

217 self.api_url_find("jetbrains"), 

218 json=JETBRAINS_FIND_RESPONSE, 

219 status=200, 

220 ) 

221 response = self.client.get("/publisher/jetbrains") 

222 self.assertEqual(response.status_code, 200) 

223 self.assert_template_used("store/publisher-details.html") 

224 

225 @responses.activate 

226 def test_non_existant_publisher(self): 

227 responses.add( 

228 responses.GET, 

229 self.api_url_find("toto"), 

230 json={"results": []}, 

231 status=200, 

232 ) 

233 response = self.client.get("/publisher/toto") 

234 self.assertEqual(response.status_code, 200) 

235 self.assert_template_used("store/community-publisher-details.html") 

236 

237 @responses.activate 

238 def test_api_error(self): 

239 responses.add( 

240 responses.GET, self.api_url_publisher_items, json={}, status=504 

241 ) 

242 response = self.client.get("/publisher/jetbrains") 

243 self.assertEqual(response.status_code, 200) 

244 self.assert_template_used("store/publisher-details.html") 

245 

246 @responses.activate 

247 def test_no_snaps_from_api(self): 

248 payload = {"_embedded": {"clickindex:package": []}} 

249 responses.add( 

250 responses.GET, 

251 self.api_url_publisher_items, 

252 json=payload, 

253 status=200, 

254 ) 

255 response = self.client.get("/publisher/jetbrains") 

256 self.assertEqual(response.status_code, 200) 

257 self.assert_template_used("store/publisher-details.html")