Skip to content

Commit 759e4e2

Browse files
authored
fix TypeError and update tests (#222)
* fix TypeError and update tests * bump version to 7.3.1
1 parent 6f6a9e8 commit 759e4e2

File tree

3 files changed

+62
-18
lines changed

3 files changed

+62
-18
lines changed

tests/push/test_push.py

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -709,9 +709,7 @@ def test_local_scheduled_payload(self):
709709
sched = ua.ScheduledPush(None)
710710
sched.push = p
711711
sched.name = "a schedule in device local time"
712-
sched.schedule = ua.local_scheduled_time(
713-
datetime.datetime(2015, 1, 1, 12, 0, 0)
714-
)
712+
sched.schedule = ua.local_scheduled_time(datetime.datetime(2015, 1, 1, 12, 0, 0))
715713

716714
self.assertEqual(
717715
sched.payload,
@@ -751,6 +749,50 @@ def test_push_success(self):
751749
pr = push.send()
752750
self.assertEqual(pr.push_ids, ["0492662a-1b52-4343-a1f9-c6b0c72931c0"])
753751

752+
def test_push_with_message_only_no_notification(self):
753+
"""Test that sending a push with only a message (no notification) works correctly."""
754+
with mock.patch.object(ua.Airship, "_request") as mock_request:
755+
response = requests.Response()
756+
response._content = json.dumps(
757+
{
758+
"ok": True,
759+
"operation_id": "780f6697-6b4e-49ea-ac91-b5c184516a15",
760+
"push_ids": ["0b4b5180-b990-11f0-a452-000a1acef8dc"],
761+
"message_ids": ["C0tRgLmQEfCkUgAKGs743A"],
762+
"content_urls": [],
763+
"localized_ids": [],
764+
}
765+
).encode("utf-8")
766+
response.status_code = 202
767+
mock_request.return_value = response
768+
769+
airship = ua.Airship(TEST_KEY, TEST_SECRET)
770+
push = ua.Push(airship)
771+
push.audience = ua.named_user("123abc")
772+
push.device_types = ua.device_types("ios")
773+
push.message = ua.message(
774+
"Hello",
775+
"Hello World",
776+
content_type="plain/text",
777+
)
778+
# Verify the payload structure (notification should be omitted when None)
779+
self.assertEqual(
780+
push.payload,
781+
{
782+
"audience": {"named_user": "123abc"},
783+
"device_types": ["ios"],
784+
"message": {
785+
"title": "Hello",
786+
"body": "Hello World",
787+
"content_type": "plain/text",
788+
},
789+
},
790+
)
791+
# This should not raise a TypeError
792+
pr = push.send()
793+
self.assertEqual(pr.push_ids, ["0b4b5180-b990-11f0-a452-000a1acef8dc"])
794+
self.assertEqual(pr.payload.get("message_ids"), ["C0tRgLmQEfCkUgAKGs743A"])
795+
754796
def test_schedule_success(self):
755797
with mock.patch.object(ua.Airship, "_request") as mock_request:
756798
response = requests.Response()
@@ -803,9 +845,7 @@ def test_scheduled_template(self):
803845
sched.schedule = ua.scheduled_time(datetime.datetime.now())
804846

805847
template_push = ua.TemplatePush(airship)
806-
template_push.audience = ua.ios_channel(
807-
"780ba0c5-45be-4f29-befa-39135cb05b59"
808-
)
848+
template_push.audience = ua.ios_channel("780ba0c5-45be-4f29-befa-39135cb05b59")
809849
template_push.device_types = ua.device_types("ios")
810850
template_push.merge_data = ua.merge_data(
811851
template_id="780ba0c5-45be-4f29-befa-39135cb05b59",
@@ -880,8 +920,7 @@ def test_schedule_from_url(self):
880920
mock_request.return_value = response
881921

882922
url = (
883-
"https://go.urbanairship.com/api/schedules/"
884-
"0492662a-1b52-4343-a1f9-c6b0c72931c0"
923+
"https://go.urbanairship.com/api/schedules/" "0492662a-1b52-4343-a1f9-c6b0c72931c0"
885924
)
886925

887926
airship = ua.Airship(TEST_KEY, TEST_SECRET)
@@ -902,8 +941,7 @@ def test_cancel(self):
902941
mock_request.return_value = response
903942

904943
url = (
905-
"https://go.urbanairship.com/api/schedules/"
906-
"0492662a-1b52-4343-a1f9-c6b0c72931c0"
944+
"https://go.urbanairship.com/api/schedules/" "0492662a-1b52-4343-a1f9-c6b0c72931c0"
907945
)
908946
sched.url = url
909947

@@ -917,8 +955,7 @@ def test_update_schedule(self):
917955

918956
with mock.patch.object(ua.Airship, "_request") as mock_request:
919957
url = (
920-
"https://go.urbanairship.com/api/schedules/"
921-
"0492662a-1b52-4343-a1f9-c6b0c72931c0"
958+
"https://go.urbanairship.com/api/schedules/" "0492662a-1b52-4343-a1f9-c6b0c72931c0"
922959
)
923960

924961
response = requests.Response()
@@ -947,8 +984,12 @@ def test_update_schedule(self):
947984
sched.update()
948985

949986
def test_schedules_listing(self):
950-
self.url1 = "https://go.urbanairship.com/api/schedules/16153636-4434-441f-bad4-86ab0f1778bc"
951-
self.url2 = "https://go.urbanairship.com/api/schedules/ee03b71b-5b88-4b87-93cf-2d9dc8b87e7c"
987+
self.url1 = (
988+
"https://go.urbanairship.com/api/schedules/16153636-4434-441f-bad4-86ab0f1778bc"
989+
)
990+
self.url2 = (
991+
"https://go.urbanairship.com/api/schedules/ee03b71b-5b88-4b87-93cf-2d9dc8b87e7c"
992+
)
952993

953994
with mock.patch.object(ua.Airship, "_request") as mock_request:
954995
response = requests.Response()

urbanairship/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "7.3.0"
1+
__version__ = "7.3.1"

urbanairship/push/core.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ def __init__(self, airship: BaseClient) -> None:
5656
def payload(self) -> Dict[str, Any]:
5757
data: Dict[str, Any] = {
5858
"audience": self.audience,
59-
"notification": self.notification,
6059
"device_types": self.device_types,
6160
}
61+
if self.notification is not None:
62+
data["notification"] = self.notification
6263
if self.options is not None:
6364
data["options"] = self.options
6465
if self.campaigns is not None:
@@ -105,12 +106,14 @@ def send(self) -> PushResponse:
105106
:raises ValueError: Required keys missing or incorrect values included.
106107
:raises ConnectionFailure: Connection failed.
107108
"""
108-
if "email" in self.payload["notification"]:
109+
if self.notification is not None and "email" in self.notification:
109110
if self.payload["device_types"] == "all":
110111
raise ValueError("device_types cannot be all when including an email override")
111112
if "email" not in self.payload["device_types"]:
112113
raise ValueError("email must be in device_types if email override is included")
113-
if "email" in self.payload["device_types"] and "email" not in self.payload["notification"]:
114+
if "email" in self.payload["device_types"] and (
115+
self.notification is None or "email" not in self.notification
116+
):
114117
raise ValueError("email override must be included when email is in device_types")
115118

116119
body = json.dumps(self.payload)

0 commit comments

Comments
 (0)