| """Notification channels tests.""" | |
| from __future__ import absolute_import | |
| __author__ = "jcgregorio@google.com (Joe Gregorio)" | |
| import datetime | |
| import unittest | |
| from googleapiclient import channel | |
| from googleapiclient import errors | |
| class TestChannel(unittest.TestCase): | |
| def test_basic(self): | |
| ch = channel.Channel( | |
| "web_hook", | |
| "myid", | |
| "mytoken", | |
| "http://example.org/callback", | |
| expiration=0, | |
| params={"extra": "info"}, | |
| resource_id="the_resource_id", | |
| resource_uri="http://example.com/resource_1", | |
| ) | |
| # Converting to a body. | |
| body = ch.body() | |
| self.assertEqual("http://example.org/callback", body["address"]) | |
| self.assertEqual("myid", body["id"]) | |
| self.assertEqual("missing", body.get("expiration", "missing")) | |
| self.assertEqual("info", body["params"]["extra"]) | |
| self.assertEqual("the_resource_id", body["resourceId"]) | |
| self.assertEqual("http://example.com/resource_1", body["resourceUri"]) | |
| self.assertEqual("web_hook", body["type"]) | |
| # Converting to a body with expiration set. | |
| ch.expiration = 1 | |
| body = ch.body() | |
| self.assertEqual(1, body.get("expiration", "missing")) | |
| # Converting to a body after updating with a response body. | |
| ch.update( | |
| { | |
| "resourceId": "updated_res_id", | |
| "resourceUri": "updated_res_uri", | |
| "some_random_parameter": 2, | |
| } | |
| ) | |
| body = ch.body() | |
| self.assertEqual("http://example.org/callback", body["address"]) | |
| self.assertEqual("myid", body["id"]) | |
| self.assertEqual(1, body.get("expiration", "missing")) | |
| self.assertEqual("info", body["params"]["extra"]) | |
| self.assertEqual("updated_res_id", body["resourceId"]) | |
| self.assertEqual("updated_res_uri", body["resourceUri"]) | |
| self.assertEqual("web_hook", body["type"]) | |
| def test_new_webhook_channel(self): | |
| ch = channel.new_webhook_channel("http://example.com/callback") | |
| self.assertEqual(0, ch.expiration) | |
| self.assertEqual("http://example.com/callback", ch.address) | |
| self.assertEqual(None, ch.params) | |
| # New channel with an obviously wrong expiration time. | |
| ch = channel.new_webhook_channel( | |
| "http://example.com/callback", expiration=datetime.datetime(1965, 1, 1) | |
| ) | |
| self.assertEqual(0, ch.expiration) | |
| # New channel with an expiration time. | |
| ch = channel.new_webhook_channel( | |
| "http://example.com/callback", | |
| expiration=datetime.datetime(1970, 1, 1, second=5), | |
| ) | |
| self.assertEqual(5000, ch.expiration) | |
| self.assertEqual("http://example.com/callback", ch.address) | |
| self.assertEqual(None, ch.params) | |
| # New channel with an expiration time and params. | |
| ch = channel.new_webhook_channel( | |
| "http://example.com/callback", | |
| expiration=datetime.datetime(1970, 1, 1, second=5, microsecond=1000), | |
| params={"some": "stuff"}, | |
| ) | |
| self.assertEqual(5001, ch.expiration) | |
| self.assertEqual("http://example.com/callback", ch.address) | |
| self.assertEqual({"some": "stuff"}, ch.params) | |
| class TestNotification(unittest.TestCase): | |
| def test_basic(self): | |
| n = channel.Notification( | |
| 12, "sync", "http://example.org", "http://example.org/v1" | |
| ) | |
| self.assertEqual(12, n.message_number) | |
| self.assertEqual("sync", n.state) | |
| self.assertEqual("http://example.org", n.resource_uri) | |
| self.assertEqual("http://example.org/v1", n.resource_id) | |
| def test_notification_from_headers(self): | |
| headers = { | |
| "X-GoOG-CHANNEL-ID": "myid", | |
| "X-Goog-MESSAGE-NUMBER": "1", | |
| "X-Goog-rESOURCE-STATE": "sync", | |
| "X-Goog-reSOURCE-URI": "http://example.com/", | |
| "X-Goog-resOURCE-ID": "http://example.com/resource_1", | |
| } | |
| ch = channel.Channel( | |
| "web_hook", | |
| "myid", | |
| "mytoken", | |
| "http://example.org/callback", | |
| expiration=0, | |
| params={"extra": "info"}, | |
| resource_id="the_resource_id", | |
| resource_uri="http://example.com/resource_1", | |
| ) | |
| # Good test case. | |
| n = channel.notification_from_headers(ch, headers) | |
| self.assertEqual("http://example.com/resource_1", n.resource_id) | |
| self.assertEqual("http://example.com/", n.resource_uri) | |
| self.assertEqual("sync", n.state) | |
| self.assertEqual(1, n.message_number) | |
| # Detect id mismatch. | |
| ch.id = "different_id" | |
| try: | |
| n = channel.notification_from_headers(ch, headers) | |
| self.fail("Should have raised exception") | |
| except errors.InvalidNotificationError: | |
| pass | |
| # Set the id back to a correct value. | |
| ch.id = "myid" |