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