Skip to content

Commit 8b8573c

Browse files
authored
Add class LandoWarnings to push warning messages to Lando (#187)
1 parent 13ac3c2 commit 8b8573c

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed

libmozdata/lando.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# -*- coding: utf-8 -*-
2+
# This Source Code Form is subject to the terms of the Mozilla Public
3+
# License, v. 2.0. If a copy of the MPL was not distributed with this
4+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
5+
6+
import requests
7+
8+
9+
class LandoWarnings(object):
10+
"""
11+
Encapsulates lando warning calls
12+
"""
13+
14+
def __init__(self, api_url, api_key):
15+
self.api_url = f"{api_url}/diff_warnings"
16+
self.api_key = api_key
17+
18+
def del_warnings(self, warnings):
19+
"""
20+
Deletes warnings from Lando based on a json warnings list
21+
"""
22+
for warning in warnings:
23+
warning_id = warning["id"]
24+
25+
response = requests.delete(
26+
f"{self.api_url}/{warning_id}",
27+
headers={"X-Phabricator-API-Key": self.api_key},
28+
)
29+
30+
if response.status_code != 200:
31+
raise Exception(f"Failed to delete warning with ID {warning_id}!")
32+
33+
def add_warning(self, warning, revision_id, diff_id):
34+
"""
35+
Adds a warning to Lando
36+
"""
37+
response = requests.post(
38+
self.api_url,
39+
json={
40+
"revision_id": revision_id,
41+
"diff_id": diff_id,
42+
"group": "LINT",
43+
"data": {"message": warning},
44+
},
45+
headers={"X-Phabricator-API-Key": self.api_key},
46+
)
47+
if response.status_code != 201:
48+
raise Exception(
49+
f"Failed to add warnings for revision_id {revision_id} and diff_id {diff_id}!"
50+
)
51+
52+
def get_warnings(self, revision_id, diff_id):
53+
"""
54+
Gets a list of warnings
55+
"""
56+
response = requests.get(
57+
self.api_url,
58+
params={
59+
"revision_id": revision_id,
60+
"diff_id": diff_id,
61+
"group": "LINT",
62+
},
63+
headers={"X-Phabricator-API-Key": self.api_key},
64+
)
65+
if response.status_code != 200:
66+
raise Exception(
67+
f"Failed to get warnings for revision_id {revision_id} and diff_id {diff_id}!"
68+
)
69+
70+
return response.json()
71+
72+
def del_all_warnings(self, revision_id, diff_id):
73+
"""
74+
Deletes all warnings
75+
"""
76+
current_warnings = self.get_warnings(revision_id, diff_id)
77+
78+
if len(current_warnings):
79+
return self.del_warnings(current_warnings)

tests/test_lando.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import unittest
2+
3+
import responses
4+
5+
from libmozdata.lando import LandoWarnings
6+
7+
MOCK_LANDO_API_URL = "http://api.lando.test"
8+
MOCK_LANDO_TOKEN = "Some Test Token"
9+
10+
MOCK_DIFF_ID = 0
11+
MOCK_REV_ID = 0
12+
MOCK_GROUP = "LINT"
13+
14+
MOCK_WARNINGS_ID = 100
15+
16+
MOCK_WARNING_MESSAGE = "There are still warnings"
17+
18+
MOCK_WARNINGS_DATA = [
19+
{
20+
"data": MOCK_WARNING_MESSAGE,
21+
"diff_id": MOCK_DIFF_ID,
22+
"revision_id": MOCK_REV_ID,
23+
"group": MOCK_GROUP,
24+
"id": MOCK_WARNINGS_ID,
25+
}
26+
]
27+
28+
MOCK_WARNINGS_DATA_PUT = {
29+
"revision_id": MOCK_REV_ID,
30+
"diff_id": MOCK_DIFF_ID,
31+
"group": MOCK_GROUP,
32+
"data": {"message": MOCK_WARNING_MESSAGE},
33+
}
34+
35+
36+
class Test_LandoWarnings(unittest.TestCase):
37+
@responses.activate
38+
def test_get_warnings(self):
39+
responses.add(
40+
responses.GET,
41+
f"{MOCK_LANDO_API_URL}/diff_warnings?revision_id={MOCK_REV_ID}&diff_id={MOCK_DIFF_ID}&group={MOCK_GROUP}",
42+
json=MOCK_WARNINGS_DATA,
43+
headers={"X-Phabricator-API-Key": MOCK_LANDO_TOKEN},
44+
status=200,
45+
)
46+
47+
mock_lando = LandoWarnings(MOCK_LANDO_API_URL, MOCK_LANDO_TOKEN)
48+
49+
self.assertEqual(
50+
mock_lando.get_warnings(MOCK_REV_ID, MOCK_DIFF_ID), MOCK_WARNINGS_DATA
51+
)
52+
self.assertEqual(
53+
responses.calls[0].request.headers["X-Phabricator-API-Key"],
54+
MOCK_LANDO_TOKEN,
55+
)
56+
57+
@responses.activate
58+
def test_get_warnings_fail(self):
59+
# Error code with 404
60+
responses.add(
61+
responses.GET,
62+
f"{MOCK_LANDO_API_URL}/diff_warnings?revision_id={MOCK_REV_ID}&diff_id={MOCK_DIFF_ID}&group={MOCK_GROUP}",
63+
json=MOCK_WARNINGS_DATA,
64+
headers={"X-Phabricator-API-Key": MOCK_LANDO_TOKEN},
65+
status=400,
66+
)
67+
mock_lando = LandoWarnings(MOCK_LANDO_API_URL, MOCK_LANDO_TOKEN)
68+
69+
try:
70+
mock_lando.get_warnings(MOCK_REV_ID, MOCK_DIFF_ID)
71+
except Exception as ex:
72+
self.assertEqual(
73+
str(ex), "Failed to get warnings for revision_id 0 and diff_id 0!"
74+
)
75+
76+
@responses.activate
77+
def test_add_warnings(self):
78+
responses.add(
79+
responses.POST,
80+
f"{MOCK_LANDO_API_URL}/diff_warnings",
81+
match=[responses.json_params_matcher(MOCK_WARNINGS_DATA_PUT)],
82+
headers={"X-Phabricator-API-Key": MOCK_LANDO_TOKEN},
83+
status=201,
84+
)
85+
86+
mock_lando = LandoWarnings(MOCK_LANDO_API_URL, MOCK_LANDO_TOKEN)
87+
88+
self.assertEqual(
89+
mock_lando.add_warning(MOCK_WARNING_MESSAGE, MOCK_REV_ID, MOCK_DIFF_ID),
90+
None,
91+
)
92+
93+
self.assertEqual(
94+
responses.calls[0].request.headers["X-Phabricator-API-Key"],
95+
MOCK_LANDO_TOKEN,
96+
)
97+
98+
@responses.activate
99+
def test_del_all_warnings(self):
100+
responses.add(
101+
responses.GET,
102+
f"{MOCK_LANDO_API_URL}/diff_warnings?revision_id={MOCK_REV_ID}&diff_id={MOCK_DIFF_ID}&group={MOCK_GROUP}",
103+
json=MOCK_WARNINGS_DATA,
104+
headers={"X-Phabricator-API-Key": MOCK_LANDO_TOKEN},
105+
status=200,
106+
)
107+
responses.add(
108+
responses.DELETE,
109+
f"{MOCK_LANDO_API_URL}/diff_warnings/{MOCK_WARNINGS_ID}",
110+
headers={"X-Phabricator-API-Key": MOCK_LANDO_TOKEN},
111+
status=200,
112+
)
113+
mock_lando = LandoWarnings(MOCK_LANDO_API_URL, MOCK_LANDO_TOKEN)
114+
115+
self.assertEqual(mock_lando.del_all_warnings(MOCK_REV_ID, MOCK_DIFF_ID), None)
116+
self.assertEqual(
117+
responses.calls[0].request.headers["X-Phabricator-API-Key"],
118+
MOCK_LANDO_TOKEN,
119+
)
120+
121+
122+
if __name__ == "__main__":
123+
unittest.main()

0 commit comments

Comments
 (0)