def setUp(self):
     self.sc = Client(API_KEY, PROJECT_NUMBER)
class ClientTest(unittest.TestCase):
    def setUp(self):
        self.sc = Client(API_KEY, PROJECT_NUMBER)

    def test_client(self):
        with self.assertRaises(InvalidArgumentError) as ve:
            sc = Client(None, None)

        self.assertEqual(ve.exception.value, 'api_key must be a string')

        with self.assertRaises(InvalidArgumentError) as ve:
            sc = Client(1, None)

        self.assertEqual(ve.exception.value, 'api_key must be a string')

        with self.assertRaises(InvalidArgumentError) as ve:
            sc = Client(API_KEY, None)

        self.assertEqual(ve.exception.value, 'project_number must be a string')

        with self.assertRaises(InvalidArgumentError) as ve:
            sc = Client(API_KEY, 1)

        self.assertEqual(ve.exception.value, 'project_number must be a string')

        sc = Client(API_KEY, PROJECT_NUMBER)

        self.assertEqual(sc.api_key, API_KEY)
        self.assertEqual(sc.project_number, PROJECT_NUMBER)


    def test_send(self):
        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send()

        self.assertEqual(ve.exception.value, "'to' or 'registration_ids' parameter must be set")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(to=1)

        self.assertEqual(ve.exception.value, "to must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=1)

        self.assertEqual(ve.exception.value, "registration_Ids must be a list")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids='test')

        self.assertEqual(ve.exception.value, "registration_Ids must be a list")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=[])

        self.assertEqual(ve.exception.value, "registration_Ids must not be empty")

        test_list = []

        for x in range(1001):
            test_list.append(x)

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=test_list)

        self.assertEqual(ve.exception.value, "registration_Ids can have at most 1000 items")

        test_list = []

        for x in range(10):
            test_list.append(x)

        test_list.append('a')
        test_list.append('b')
        test_list.append('c')
        test_list.append('d')

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=test_list)

        self.assertEqual(ve.exception.value, "Items in registration_Ids must be strings")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], priority='test')

        self.assertEqual(ve.exception.value, "priority must be an integer between 0 - 10")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], priority=-1)

        self.assertEqual(ve.exception.value, "priority must be an integer between 0 - 10")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], priority=11)

        self.assertEqual(ve.exception.value, "priority must be an integer between 0 - 10")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], content_available='test')

        self.assertEqual(ve.exception.value, "content_available must be a boolean")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], collapse_key=1)

        self.assertEqual(ve.exception.value, "collapse_key must be an string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], delay_while_idle=1)

        self.assertEqual(ve.exception.value, "delay_while_idle must be a boolean")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], time_to_live='test')

        self.assertEqual(ve.exception.value, "time_to_live must be an integer measured in seconds")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], time_to_live=0)

        self.assertEqual(ve.exception.value, "time_to_live must be greater than zero")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], time_to_live=MAXIMUM_TIME_TO_LIVE+1)

        self.assertEqual(ve.exception.value, "time_to_live must be less than 4 weeks. The default is 4 weeks")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], restricted_package_name=1)

        self.assertEqual(ve.exception.value, "restricted_package_name must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], dry_run=1)

        self.assertEqual(ve.exception.value, "dry_run must be a boolean")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], data=1)

        self.assertEqual(ve.exception.value, "data must be a dictionary")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.send(registration_ids=['test'], notification=1)

        self.assertEqual(ve.exception.value, "notification must be a dictionary")

    def test_notify(self):
        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.notify()

        self.assertEqual(ve.exception.value, "'notification_key' is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.notify(notification_key=1)

        self.assertEqual(ve.exception.value, "'notification_key' must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.notify(notification_key='test', data='test')

        self.assertEqual(ve.exception.value, "data must be a dictionary")

    def test_create_notify_key(self):
        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.create_notify_key()

        self.assertEqual(ve.exception.value, "notification_key_name is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.create_notify_key(notification_key_name=1)

        self.assertEqual(ve.exception.value, "notification_key_name must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.create_notify_key(notification_key_name='test')

        self.assertEqual(ve.exception.value, "registration_Ids is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.create_notify_key(notification_key_name='test', registration_Ids=1)

        self.assertEqual(ve.exception.value, "registration_Ids must be a list")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.create_notify_key(notification_key_name='test', registration_Ids=[])

        self.assertEqual(ve.exception.value, "registration_Ids must not be empty")

        test_list = []

        for x in range(10):
            test_list.append(x)

        test_list.append('a')
        test_list.append('b')
        test_list.append('c')
        test_list.append('d')

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.create_notify_key(notification_key_name='test', registration_Ids=test_list)

        self.assertEqual(ve.exception.value, "Items in registration_Ids must be strings")

    def test_add_regIds_to_notify_key(self):
        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key()

        self.assertEqual(ve.exception.value, "notification_key_name is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(notification_key_name=1)

        self.assertEqual(ve.exception.value, "notification_key_name must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(notification_key_name='test')

        self.assertEqual(ve.exception.value, "notification_key is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(notification_key_name='test', notification_key=1)

        self.assertEqual(ve.exception.value, "notification_key must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(
                notification_key_name='test',
                notification_key='test')

        self.assertEqual(ve.exception.value, "registration_Ids is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(
                notification_key_name='test',
                notification_key='test',
                registration_Ids='1')

        self.assertEqual(ve.exception.value, "registration_Ids must be a list")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(
                notification_key_name='test',
                notification_key='test',
                registration_Ids=[])

        self.assertEqual(ve.exception.value, "registration_Ids must not be empty")

        test_list = []

        for x in range(10):
            test_list.append(x)

        test_list.append('a')
        test_list.append('b')
        test_list.append('c')
        test_list.append('d')

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.add_regids_to_notify_key(
                notification_key_name='test',
                notification_key='test',
                registration_Ids=test_list)

        self.assertEqual(ve.exception.value, "Items in registration_Ids must be strings")

    def test_remove_regIds_from_notify_key(self):
        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key()

        self.assertEqual(ve.exception.value, "notification_key_name is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(notification_key_name=1)

        self.assertEqual(ve.exception.value, "notification_key_name must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(notification_key_name='test')

        self.assertEqual(ve.exception.value, "notification_key is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(notification_key_name='test', notification_key=1)

        self.assertEqual(ve.exception.value, "notification_key must be a string")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(
                notification_key_name='test',
                notification_key='test')

        self.assertEqual(ve.exception.value, "registration_Ids is required")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(
                notification_key_name='test',
                notification_key='test',
                registration_Ids='1')

        self.assertEqual(ve.exception.value, "registration_Ids must be a list")

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(
                notification_key_name='test',
                notification_key='test',
                registration_Ids=[])

        self.assertEqual(ve.exception.value, "registration_Ids must not be empty")

        test_list = []

        for x in range(10):
            test_list.append(x)

        test_list.append('a')
        test_list.append('b')
        test_list.append('c')
        test_list.append('d')

        with self.assertRaises(InvalidArgumentError) as ve:
            self.sc.remove_regIds_from_notify_key(
                notification_key_name='test',
                notification_key='test',
                registration_Ids=test_list)

        self.assertEqual(ve.exception.value, "Items in registration_Ids must be strings")