def test_eventclient(self):
        client = EventClient(access_key=access_key,
                             url="http://127.0.0.1:7070")

        # Check status
        print("Check status")
        print(client.get_status())
        self.assertEqual(client.get_status(), {'status': 'alive'})

        # First event
        first_event_properties = {
            "prop1": 1,
            "prop2": "value2",
            "prop3": [1, 2, 3],
            "prop4": True,
            "prop5": ["a", "b", "c"],
            "prop6": 4.56,
        }
        first_event_time = datetime(2004, 12, 13, 21, 39, 45, 618000,
                                    pytz.timezone('US/Mountain'))
        first_event_response = client.create_event(
            event="my_event",
            entity_type="user",
            entity_id="uid",
            properties=first_event_properties,
            event_time=first_event_time,
        )
        print("First Event response")
        print(first_event_response)
        self.assertEqual(first_event_response.status, 201)

        # Second event
        second_event_properties = {
            "someProperty": "value1",
            "anotherProperty": "value2",
        }
        second_event_response = client.create_event(
            event="my_event",
            entity_type="user",
            entity_id="uid",
            target_entity_type="item",
            target_entity_id="iid",
            properties=second_event_properties,
            event_time=datetime(2014, 12, 13, 21, 38, 45, 618000, pytz.utc))
        print("Second Event response")
        print(second_event_response)
        self.assertEqual(second_event_response.status, 201)

        # Get the first event from Event Server
        first_event_id = first_event_response.json_body["eventId"]
        print("Get Event")
        event = client.get_event(first_event_id)
        print(event)
        self.assertEqual(event.get('eventId'), first_event_id)

        # Delete the first event from Event Server
        print("Delete Event")
        delete_response = client.delete_event(first_event_id)
        print(delete_response)
        self.assertEqual(delete_response.decode('utf-8'),
                         '{"message":"Found"}')

        # Delete the first event from Event Server again should yield exception.
        print("Delete Event Again")
        try:
            delete_response = client.delete_event(first_event_id)
            self.fail()
        except NotFoundError as ex:
            print("The expected error: {0}".format(ex))

        # "user"-helper methods

        # Set user properties implicitly create a user
        # This call creates a user "foo", and set the properties of "foo".
        print("Create user foo")
        foo_properties = {"city": "sunnyvale", "car": "honda fit"}
        response = client.set_user("foo", properties=foo_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call overrides the existing properties for user "foo", setting "car" to
        # a new "honda odyssey" and create a new property "food" to "seafood".
        print("Set new properties")
        foo_properties = {"car": "honda odyssey", "food": "seafood"}
        response = client.set_user("foo", properties=foo_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call removes the specified properties. It ignores the value of the dict.
        # After this call, the "city" will become an unset field.
        print("Unset properties")
        foo_properties = {"city": "x"}
        response = client.unset_user("foo", properties=foo_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call deletes a user
        print("Delete user")
        response = client.delete_user("foo")
        print(response)
        self.assertEqual(response.status, 201)

        # The SDK also support specifying the eventTime. It is useful for importing
        # events happened in the past.
        foo_time = datetime(2014,
                            8,
                            31,
                            4,
                            56,
                            tzinfo=pytz.timezone('US/Pacific'))
        print("Create user at " + str(foo_time))
        response = client.set_user("Jarvis", {}, foo_time)
        print(response)
        self.assertEqual(response.status, 201)

        # "item"-helper methods

        # Set item properties implicitly create a item
        # This call creates a item "bar", and set the properties of "bar".
        print("Create item bar")
        bar_properties = {"city": "santa clara", "weight": 6.9}
        response = client.set_item("bar", properties=bar_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # Similar to user-methods, we can do the same thing with item
        print("Set new properties")
        bar_properties = {"weight": 6.2}
        response = client.set_item("bar", properties=bar_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call removes the specified properties. It ignores the value of the dict.
        # After this call, the "city" will become an unset field.
        print("Unset properties")
        bar_properties = {"city": None}
        response = client.unset_item("bar", properties=bar_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call deletes a item
        print("Delete item")
        response = client.delete_item("bar")
        print(response)
        self.assertEqual(response.status, 201)

        # "record" action helper functions

        # This call creates a event between a user and an item. In particular, this set
        # the price of the action
        print("Record user action")
        action_properties = {"price": 10.0}
        response = client.record_user_action_on_item("buy", "foo", "bar",
                                                     action_properties)
        print(response)
        self.assertEqual(response.status, 201)
    def test_eventclient(self):
        client = EventClient(access_key=access_key, url="http://127.0.0.1:7070")

        # Check status
        print("Check status")
        print(client.get_status())
        self.assertEqual(client.get_status(), {'status': 'alive'})

        # First event
        first_event_properties = {
            "prop1": 1,
            "prop2": "value2",
            "prop3": [1, 2, 3],
            "prop4": True,
            "prop5": ["a", "b", "c"],
            "prop6": 4.56,
        }
        first_event_time = datetime(
            2004, 12, 13, 21, 39, 45, 618000, pytz.timezone('US/Mountain'))
        first_event_response = client.create_event(
            event="my_event",
            entity_type="user",
            entity_id="uid",
            properties=first_event_properties,
            event_time=first_event_time,
        )
        print("First Event response")
        print(first_event_response)
        self.assertEqual(first_event_response.status, 201)

        # Second event
        second_event_properties = {
            "someProperty": "value1",
            "anotherProperty": "value2",
        }
        second_event_response = client.create_event(
            event="my_event",
            entity_type="user",
            entity_id="uid",
            target_entity_type="item",
            target_entity_id="iid",
            properties=second_event_properties,
            event_time=datetime(2014, 12, 13, 21, 38, 45, 618000, pytz.utc))
        print("Second Event response")
        print(second_event_response)
        self.assertEqual(second_event_response.status, 201)


        # Get the first event from Event Server
        first_event_id = first_event_response.json_body["eventId"]
        print("Get Event")
        event = client.get_event(first_event_id)
        print(event)
        self.assertEqual(event.get('eventId'), first_event_id)


        # Delete the first event from Event Server
        print("Delete Event")
        delete_response = client.delete_event(first_event_id)
        print(delete_response)
        self.assertEqual(delete_response.decode('utf-8'), '{"message":"Found"}')


        # Delete the first event from Event Server again should yield exception.
        print("Delete Event Again")
        try:
            delete_response = client.delete_event(first_event_id)
            self.fail()
        except NotFoundError as ex:
            print("The expected error: {0}".format(ex))


        # "user"-helper methods

        # Set user properties implicitly create a user
        # This call creates a user "foo", and set the properties of "foo".
        print("Create user foo")
        foo_properties = {"city": "sunnyvale", "car": "honda fit"}
        response = client.set_user("foo", properties=foo_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call overrides the existing properties for user "foo", setting "car" to
        # a new "honda odyssey" and create a new property "food" to "seafood".
        print("Set new properties")
        foo_properties = {"car": "honda odyssey", "food": "seafood"}
        response = client.set_user("foo", properties=foo_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call removes the specified properties. It ignores the value of the dict.
        # After this call, the "city" will become an unset field.
        print("Unset properties")
        foo_properties = {"city": "x"}
        response = client.unset_user("foo", properties=foo_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call deletes a user
        print("Delete user")
        response = client.delete_user("foo")
        print(response)
        self.assertEqual(response.status, 201)

        # The SDK also support specifying the eventTime. It is useful for importing
        # events happened in the past.
        foo_time = datetime(2014, 8, 31, 4, 56, tzinfo=pytz.timezone('US/Pacific'))
        print("Create user at " + str(foo_time))
        response = client.set_user("Jarvis", {}, foo_time)
        print(response)
        self.assertEqual(response.status, 201)

        # "item"-helper methods

        # Set item properties implicitly create a item
        # This call creates a item "bar", and set the properties of "bar".
        print("Create item bar")
        bar_properties = {"city": "santa clara", "weight": 6.9}
        response = client.set_item("bar", properties=bar_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # Similar to user-methods, we can do the same thing with item
        print("Set new properties")
        bar_properties = {"weight": 6.2}
        response = client.set_item("bar", properties=bar_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call removes the specified properties. It ignores the value of the dict.
        # After this call, the "city" will become an unset field.
        print("Unset properties")
        bar_properties = {"city": None}
        response = client.unset_item("bar", properties=bar_properties)
        print(response)
        self.assertEqual(response.status, 201)

        # This call deletes a item
        print("Delete item")
        response = client.delete_item("bar")
        print(response)
        self.assertEqual(response.status, 201)


        # "record" action helper functions

        # This call creates a event between a user and an item. In particular, this set
        # the price of the action
        print("Record user action")
        action_properties = {"price": 10.0}
        response = client.record_user_action_on_item("buy", "foo", "bar", action_properties)
        print(response)
        self.assertEqual(response.status, 201)
# Set item properties implicitly create a item
# This call creates a item "bar", and set the properties of "bar".
print("Create item bar")
bar_properties = {"city": "santa clara", "weight": 6.9}
print(client.set_item("bar", properties=bar_properties))

# Similar to user-methods, we can do the same thing with item
print("Set new properties")
bar_properties = {"weight": 6.2}
print(client.set_item("bar", properties=bar_properties))

# This call removes the specified properties. It ignores the value of the dict.
# After this call, the "city" will become an unset field.
print("Unset properties")
bar_properties = {"city": None}
print(client.unset_item("bar", properties=bar_properties))

# This call deletes a item
print("Delete item")
print(client.delete_item("bar"))


# "record" action helper functions

# This call creates a event between a user and an item. In particular, this set
# the price of the action
print("Record user action")
action_properties = {"price": 10.0}
print(client.record_user_action_on_item("buy", "foo", "bar", action_properties))
# Set item properties implicitly create a item
# This call creates a item "bar", and set the properties of "bar".
print("Create item bar")
bar_properties = {"city": "santa clara", "weight": 6.9}
print(client.set_item("bar", properties=bar_properties))

# Similar to user-methods, we can do the same thing with item
print("Set new properties")
bar_properties = {"weight": 6.2}
print(client.set_item("bar", properties=bar_properties))

# This call removes the specified properties. It ignores the value of the dict.
# After this call, the "city" will become an unset field.
print("Unset properties")
bar_properties = {"city": None}
print(client.unset_item("bar", properties=bar_properties))

# This call deletes a item
print("Delete item")
print(client.delete_item("bar"))

# "record" action helper functions

# This call creates a event between a user and an item. In particular, this set
# the price of the action
print("Record user action")
action_properties = {"price": 10.0}
print(client.record_user_action_on_item("buy", "foo", "bar",
                                        action_properties))