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

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
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 }
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"
95 def create_app(self):
96 app = create_app(testing=True)
97 app.secret_key = "secret_key"
98 app.config["WTF_CSRF_METHODS"] = []
100 return app
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 )
111 response = self.client.get(self.badge_url)
113 assert len(responses.calls) == 1
114 called = responses.calls[0]
115 assert called.request.url == self.api_url
117 assert response.status_code == 404
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 )
128 response = self.client.get(self.badge_url)
130 assert len(responses.calls) == 1
131 called = responses.calls[0]
132 assert called.request.url == self.api_url
134 assert response.status_code == 502
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 )
142 response = self.client.get(self.badge_url)
144 assert len(responses.calls) == 1
145 called = responses.calls[0]
146 assert called.request.url == self.api_url
148 assert response.status_code == 502
150 @responses.activate
151 def test_get_badge(self):
152 payload = self.snap_payload
154 responses.add(
155 responses.Response(
156 method="GET", url=self.api_url, json=payload, status=200
157 )
158 )
160 response = self.client.get(self.badge_url)
162 self.assertEqual(response.status_code, 200)
164 @responses.activate
165 def test_get_trending_empty(self):
166 payload = self.snap_payload
168 responses.add(
169 responses.Response(
170 method="GET", url=self.api_url, json=payload, status=200
171 )
172 )
174 response = self.client.get(self.trending_url)
175 svg = response.get_data(as_text=True)
177 self.assertEqual(response.status_code, 200)
178 self.assertTrue("Trending" not in svg)
180 @responses.activate
181 def test_get_trending_is_trending(self):
182 payload = self.snap_payload
183 payload["snap"]["trending"] = True
185 responses.add(
186 responses.Response(
187 method="GET", url=self.api_url, json=payload, status=200
188 )
189 )
191 response = self.client.get(self.trending_url)
192 svg = response.get_data(as_text=True)
194 self.assertEqual(response.status_code, 200)
195 self.assertTrue("Trending" in svg)
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
203 responses.add(
204 responses.Response(
205 method="GET", url=self.api_url, json=payload, status=200
206 )
207 )
209 preview_url = self.trending_url + "?preview=1"
210 response = self.client.get(preview_url)
211 svg = response.get_data(as_text=True)
213 self.assertEqual(response.status_code, 200)
214 self.assertTrue("Trending" not in svg)
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
222 responses.add(
223 responses.Response(
224 method="GET", url=self.api_url, json=payload, status=200
225 )
226 )
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"}}
236 preview_url = self.trending_url + "?preview=1"
237 response = self.client.get(preview_url)
238 svg = response.get_data(as_text=True)
240 self.assertEqual(response.status_code, 200)
241 self.assertTrue("Trending" in svg)