"""Notification channels tests.""" from __future__ import absolute_import __author__ = 'jcgregorio@google.com (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'