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
« 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
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 }
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"
99 def create_app(self):
100 app = create_app(testing=True)
101 app.secret_key = "secret_key"
102 app.config["WTF_CSRF_METHODS"] = []
104 return app
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 )
115 response = self.client.get(self.badge_url)
117 assert len(responses.calls) == 1
118 called = responses.calls[0]
119 assert called.request.url == self.api_url
121 assert response.status_code == 404
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 )
132 response = self.client.get(self.badge_url)
134 assert len(responses.calls) == 1
135 called = responses.calls[0]
136 assert called.request.url == self.api_url
138 assert response.status_code == 502
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 )
146 response = self.client.get(self.badge_url)
148 assert len(responses.calls) == 1
149 called = responses.calls[0]
150 assert called.request.url == self.api_url
152 assert response.status_code == 502
154 @responses.activate
155 def test_get_badge(self):
156 payload = self.snap_payload
158 responses.add(
159 responses.Response(
160 method="GET", url=self.api_url, json=payload, status=200
161 )
162 )
164 response = self.client.get(self.badge_url)
166 self.assertEqual(response.status_code, 200)
168 @responses.activate
169 def test_get_trending_empty(self):
170 payload = self.snap_payload
172 responses.add(
173 responses.Response(
174 method="GET", url=self.api_url, json=payload, status=200
175 )
176 )
178 response = self.client.get(self.trending_url)
179 svg = response.get_data(as_text=True)
181 self.assertEqual(response.status_code, 200)
182 self.assertTrue("Trending" not in svg)
184 @responses.activate
185 def test_get_trending_is_trending(self):
186 payload = self.snap_payload
187 payload["snap"]["trending"] = True
189 responses.add(
190 responses.Response(
191 method="GET", url=self.api_url, json=payload, status=200
192 )
193 )
195 response = self.client.get(self.trending_url)
196 svg = response.get_data(as_text=True)
198 self.assertEqual(response.status_code, 200)
199 self.assertTrue("Trending" in svg)
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
207 responses.add(
208 responses.Response(
209 method="GET", url=self.api_url, json=payload, status=200
210 )
211 )
213 preview_url = self.trending_url + "?preview=1"
214 response = self.client.get(preview_url)
215 svg = response.get_data(as_text=True)
217 self.assertEqual(response.status_code, 200)
218 self.assertTrue("Trending" not in svg)
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
226 responses.add(
227 responses.Response(
228 method="GET", url=self.api_url, json=payload, status=200
229 )
230 )
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"}}
240 preview_url = self.trending_url + "?preview=1"
241 response = self.client.get(preview_url)
242 svg = response.get_data(as_text=True)
244 self.assertEqual(response.status_code, 200)
245 self.assertTrue("Trending" in svg)