"""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'