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
« 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
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}
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}
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}
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 )
188 def create_app(self):
189 app = create_app(testing=True)
190 app.secret_key = "secret_key"
191 app.config["WTF_CSRF_METHODS"] = []
193 return app
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")
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")
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")
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")
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")