| """Notification channels tests.""" |
| from __future__ import absolute_import |
| |
| __author__ = '[email protected] (Joe Gregorio)' |
| |
| import unittest2 as unittest |
| import datetime |
| |
| 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' |