|
| 1 | +import unittest |
| 2 | +from flask import Request, request, Flask |
| 3 | +from src.webhook import verifyGithubRequest, verifyGitlabRequest, webhookBlueprint |
| 4 | +from src.functionWebhook import functionWebhookBlueprint |
| 5 | +import random |
| 6 | +from hmac import new as hmacNew |
| 7 | +from hashlib import sha256 |
| 8 | + |
| 9 | +VALID_TOKEN = "1234" |
| 10 | + |
| 11 | +class testingRequest(Request): |
| 12 | + def __init__(self, token:str): |
| 13 | + self.data = random.randbytes(50) |
| 14 | + hash_object = hmacNew(token.encode("utf-8"), msg=self.data, digestmod=sha256) |
| 15 | + self.headers = {"X-Hub-Signature-256": f"sha256={hash_object.hexdigest()}", "X-Gitlab-Token":token} |
| 16 | + def get_data(self): |
| 17 | + return self.data |
| 18 | + |
| 19 | +class TestVerification(unittest.TestCase): |
| 20 | + def setUp(self) -> None: |
| 21 | + self.validRequest = testingRequest(VALID_TOKEN) |
| 22 | + self.invalidRequest = testingRequest("12345") |
| 23 | + return super().setUp() |
| 24 | + def testVerifyGithubRequest(self): |
| 25 | + self.assertTrue(verifyGithubRequest(self.validRequest, VALID_TOKEN)) |
| 26 | + self.assertFalse(verifyGithubRequest(self.validRequest, "12345")) |
| 27 | + self.assertFalse(verifyGithubRequest(self.invalidRequest, VALID_TOKEN)) |
| 28 | + self.assertFalse(verifyGithubRequest(self.invalidRequest, "12346")) |
| 29 | + def testVerifyGitlabRequest(self): |
| 30 | + self.assertTrue(verifyGitlabRequest(self.validRequest, "1234")) |
| 31 | + self.assertFalse(verifyGitlabRequest(self.validRequest, "12345")) |
| 32 | + self.assertFalse(verifyGitlabRequest(self.invalidRequest, "1234")) |
| 33 | + |
| 34 | +class TestWehbookBlueprint(unittest.TestCase): |
| 35 | + def setUp(self) -> None: |
| 36 | + self.webhook = webhookBlueprint(VALID_TOKEN, name="valid") |
| 37 | + self.app = Flask(__name__) |
| 38 | + self.app.register_blueprint(self.webhook, url_prefix="/valid") |
| 39 | + self.webhookNoToken = webhookBlueprint(None, name="invalid") |
| 40 | + self.app.register_blueprint(self.webhookNoToken, url_prefix="/noToken") |
| 41 | + self.app.config.update({"TESTING": True}) |
| 42 | + self.client = self.app.test_client() |
| 43 | + return super().setUp() |
| 44 | + def testReceiveWebhookValid(self): |
| 45 | + request = testingRequest(VALID_TOKEN) |
| 46 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 47 | + self.assertEqual(resp.status_code, 415) |
| 48 | + request.headers["Content-Type"] = "application/json" |
| 49 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 50 | + self.assertEqual(resp.status_code, 400) #no json |
| 51 | + def testReceiveWebhookInvalidNoCheck(self): |
| 52 | + request = testingRequest("123") |
| 53 | + resp = self.client.post("/noToken/", headers=request.headers, data=request.data) |
| 54 | + self.assertEqual(resp.status_code, 415) |
| 55 | + request.headers["Content-Type"] = "application/json" |
| 56 | + resp = self.client.post("/noToken/", headers=request.headers, data=request.data) |
| 57 | + self.assertEqual(resp.status_code, 400) |
| 58 | + def testReceiveWebhookInvalidCheck(self): |
| 59 | + request = testingRequest("123") |
| 60 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 61 | + self.assertEqual(resp.status_code, 415) |
| 62 | + request.headers["Content-Type"] = "application/json" |
| 63 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 64 | + self.assertEqual(resp.status_code, 401) |
| 65 | + def testProcessWebhook(self): |
| 66 | + self.assertEqual(self.webhook.processWebhook({"test":"test"}), (200, "OK")) |
| 67 | + self.assertEqual(self.webhookNoToken.processWebhook({"test":"test"}), (200, "OK")) |
| 68 | + |
| 69 | +class TestFunctionWebhookBlueprint(unittest.TestCase): |
| 70 | + def setUp(self) -> None: |
| 71 | + func = lambda x: x != x |
| 72 | + self.webhook = functionWebhookBlueprint(VALID_TOKEN, name="valid", functions=[func]) |
| 73 | + self.app = Flask(__name__) |
| 74 | + self.app.register_blueprint(self.webhook, url_prefix="/valid") |
| 75 | + self.app.config.update({"TESTING": True}) |
| 76 | + self.client = self.app.test_client() |
| 77 | + return super().setUp() |
| 78 | + def testReceiveWebhookValid(self): |
| 79 | + request = testingRequest(VALID_TOKEN) |
| 80 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 81 | + self.assertEqual(resp.status_code, 415) |
| 82 | + request.headers["Content-Type"] = "application/json" |
| 83 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 84 | + self.assertEqual(resp.status_code, 400) #no json |
| 85 | + def testReceiveWebhookInvalidCheck(self): |
| 86 | + request = testingRequest("123") |
| 87 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 88 | + self.assertEqual(resp.status_code, 415) |
| 89 | + request.headers["Content-Type"] = "application/json" |
| 90 | + resp = self.client.post("/valid/", headers=request.headers, data=request.data) |
| 91 | + self.assertEqual(resp.status_code, 401) |
| 92 | + def testProcessWebhook(self): |
| 93 | + self.assertEqual(self.webhook.processWebhook({"test":"test"}), (400, "Function <lambda> returned false")) |
| 94 | + |
| 95 | +if __name__ == "__main__": |
| 96 | + unittest.main() |
0 commit comments