From af565ef32fba88cfadbb2d941c144bc50d1d24ef Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Thu, 16 Dec 2021 22:03:22 -0800 Subject: [PATCH] beeminder: Strengthen types using WildValue. Signed-off-by: Anders Kaseorg --- zerver/webhooks/beeminder/tests.py | 7 +++---- zerver/webhooks/beeminder/view.py | 14 +++++++------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/zerver/webhooks/beeminder/tests.py b/zerver/webhooks/beeminder/tests.py index e44290776b..b9775ce63a 100644 --- a/zerver/webhooks/beeminder/tests.py +++ b/zerver/webhooks/beeminder/tests.py @@ -1,5 +1,4 @@ -from typing import Any -from unittest.mock import patch +from unittest.mock import MagicMock, patch from zerver.lib.test_classes import WebhookTestCase @@ -10,7 +9,7 @@ class BeeminderHookTests(WebhookTestCase): WEBHOOK_DIR_NAME = "beeminder" @patch("zerver.webhooks.beeminder.view.time.time") - def test_beeminder_derail(self, time: Any) -> None: + def test_beeminder_derail(self, time: MagicMock) -> None: time.return_value = 1517739100 # 5.6 hours from fixture value expected_topic = "beekeeper" expected_message = """ @@ -26,7 +25,7 @@ You are going to derail from goal **gainweight** in **5.6 hours**. You need **+2 ) @patch("zerver.webhooks.beeminder.view.time.time") - def test_beeminder_derail_worried(self, time: Any) -> None: + def test_beeminder_derail_worried(self, time: MagicMock) -> None: time.return_value = 1517739100 # 5.6 hours from fixture value expected_topic = "beekeeper" expected_message = """ diff --git a/zerver/webhooks/beeminder/view.py b/zerver/webhooks/beeminder/view.py index 40e3d7db0d..c06dc42e7c 100644 --- a/zerver/webhooks/beeminder/view.py +++ b/zerver/webhooks/beeminder/view.py @@ -1,12 +1,12 @@ # Webhooks for external integrations. import time -from typing import Any, Dict from django.http import HttpRequest, HttpResponse from zerver.decorator import webhook_view from zerver.lib.request import REQ, has_request_variables from zerver.lib.response import json_success +from zerver.lib.validator import WildValue, check_int, check_string, to_wild_value from zerver.lib.webhooks.common import check_send_webhook_message from zerver.models import UserProfile @@ -17,8 +17,8 @@ MESSAGE_TEMPLATE = ( ) -def get_time(payload: Dict[str, Any]) -> Any: - losedate = payload["goal"]["losedate"] +def get_time(payload: WildValue) -> float: + losedate = payload["goal"]["losedate"].tame(check_int) time_remaining = (losedate - time.time()) / 3600 return time_remaining @@ -28,12 +28,12 @@ def get_time(payload: Dict[str, Any]) -> Any: def api_beeminder_webhook( request: HttpRequest, user_profile: UserProfile, - payload: Dict[str, Any] = REQ(argument_type="body"), + payload: WildValue = REQ(argument_type="body", converter=to_wild_value), ) -> HttpResponse: - goal_name = payload["goal"]["slug"] - limsum = payload["goal"]["limsum"] - pledge = payload["goal"]["pledge"] + goal_name = payload["goal"]["slug"].tame(check_string) + limsum = payload["goal"]["limsum"].tame(check_string) + pledge = payload["goal"]["pledge"].tame(check_int) time_remain = get_time(payload) # time in hours # To show user's probable reaction by looking at pledge amount if pledge > 0: