def test_send():
    """
    MessageSenderMixin._send() Test plan:
        -ensure events named transaction raise error
        -ensure callback is set on success
        -ensure that a response is received
    """

    test_payload = {"item": "shoe"}

    httpretty.register_uri(
        httpretty.POST,
        "https://www.hpit-project.org/message",
        body='{"message_id":"4"}',
    )

    subject = MessageSenderMixin()

    subject.send.when.called_with(
        "transaction", test_payload,
        None).should.throw(InvalidMessageNameException)

    response = subject.send("test_event", test_payload, send_callback)
    subject.response_callbacks["4"].should.equal(globals()["send_callback"])

    response.should.equal({"message_id": "4"})
def test_poll_responses():
    """
    MessageSenderMixin._poll_responses() Test plan:
        -Ensure False returned if pre_poll_responses hook returns false
        -Ensure False returned if post_poll_responses hook returns false
        -Ensure a collection of responses returned on success
    """

    httpretty.register_uri(
        httpretty.GET,
        "https://www.hpit-project.org/response/list",
        body='{"responses":"4"}',
    )

    def returnFalse():
        return False

    def returnTrue():
        return True

    test_message_sender_mixin = MessageSenderMixin()

    setattr(test_message_sender_mixin, "pre_poll_responses", returnFalse)
    setattr(test_message_sender_mixin, "post_poll_responses", returnTrue)
    test_message_sender_mixin._poll_responses().should.equal(False)

    setattr(test_message_sender_mixin, "pre_poll_responses", returnTrue)
    setattr(test_message_sender_mixin, "post_poll_responses", returnFalse)
    test_message_sender_mixin._poll_responses().should.equal(False)

    setattr(test_message_sender_mixin, "pre_poll_responses", returnTrue)
    setattr(test_message_sender_mixin, "post_poll_responses", returnTrue)
    test_message_sender_mixin._poll_responses().should.equal("4")
def test_share_resource():
    subject = MessageSenderMixin()
    subject.send_log_entry = MagicMock()

    httpretty.register_uri(
        httpretty.POST,
        "https://www.hpit-project.org/share-resource",
        body='OK',
    )

    subject.share_resource.when.called_with(
        None, None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with(
        '', None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with(
        [], None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with(
        {}, None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with(
        'thing', None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with(
        'thing', '').should.throw(InvalidParametersError)
    subject.share_resource.when.called_with(
        'thing', []).should.throw(InvalidParametersError)
    subject.share_resource('thing', '4').should.equal(True)
    subject.share_resource('thing', ['4', '5', '6']).should.equal(True)
def test_poll_responses():
    """
    MessageSenderMixin._poll_responses() Test plan:
        -Ensure False returned if pre_poll_responses hook returns false
        -Ensure False returned if post_poll_responses hook returns false
        -Ensure a collection of responses returned on success
    """
    
    httpretty.register_uri(httpretty.GET,"https://www.hpit-project.org/response/list",
                            body='{"responses":"4"}',
                            )
    
    
    def returnFalse():
        return False
    def returnTrue():
        return True
    
    test_message_sender_mixin = MessageSenderMixin()
    
    setattr(test_message_sender_mixin,"pre_poll_responses",returnFalse)
    setattr(test_message_sender_mixin,"post_poll_responses",returnTrue)
    test_message_sender_mixin._poll_responses().should.equal(False)
    
    setattr(test_message_sender_mixin,"pre_poll_responses",returnTrue)
    setattr(test_message_sender_mixin,"post_poll_responses",returnFalse)
    test_message_sender_mixin._poll_responses().should.equal(False)
    
    setattr(test_message_sender_mixin,"pre_poll_responses",returnTrue)
    setattr(test_message_sender_mixin,"post_poll_responses",returnTrue)
    test_message_sender_mixin._poll_responses().should.equal("4")
def test_get_message_owner():

    subject = MessageSenderMixin()
    subject.send_log_entry = MagicMock()

    httpretty.register_uri(httpretty.GET,
        "https://www.hpit-project.org/message-owner/thing",
        body='{"owner":"4"}',
        content_type="application/json"
    )

    subject.get_message_owner.when.called_with(None).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with([]).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with({}).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with("").should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with(['thing']).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with({'thing': 1}).should.throw(InvalidParametersError)
    subject.get_message_owner('thing').should.equal('4')
def test_send_transaction():
    """
    MessageSenderMixin._send_transaction() Test plan:
        -ensure callback is set on success
        -ensure that a response is received
    """
    
    test_payload = {"item":"shoe"}
    
    httpretty.register_uri(httpretty.POST,"https://www.hpit-project.org/message",
                            body='{"message_id":"4"}',
                            )
    
    subject = MessageSenderMixin()
    
    response = subject.send("test_event",test_payload,send_callback)
    subject.response_callbacks["4"].should.equal(globals()["send_callback"])
    
    response.should.equal({"message_id":"4"})
def test_send_transaction():
    """
    MessageSenderMixin._send_transaction() Test plan:
        -ensure callback is set on success
        -ensure that a response is received
    """

    test_payload = {"item": "shoe"}

    httpretty.register_uri(
        httpretty.POST,
        "https://www.hpit-project.org/message",
        body='{"message_id":"4"}',
    )

    subject = MessageSenderMixin()

    response = subject.send("test_event", test_payload, send_callback)
    subject.response_callbacks["4"].should.equal(globals()["send_callback"])

    response.should.equal({"message_id": "4"})
def test_send():
    """
    MessageSenderMixin._send() Test plan:
        -ensure events named transaction raise error
        -ensure callback is set on success
        -ensure that a response is received
    """
    
    test_payload = {"item":"shoe"}
    
    httpretty.register_uri(httpretty.POST,"https://www.hpit-project.org/message",
                            body='{"message_id":"4"}',
                            )
    
    subject = MessageSenderMixin()
    
    subject.send.when.called_with("transaction",test_payload,None).should.throw(InvalidMessageNameException)
    
    response = subject.send("test_event",test_payload,send_callback)
    subject.response_callbacks["4"].should.equal(globals()["send_callback"])
    
    response.should.equal({"message_id":"4"})
def test_get_message_owner():

    subject = MessageSenderMixin()
    subject.send_log_entry = MagicMock()

    httpretty.register_uri(httpretty.GET,
                           "https://www.hpit-project.org/message-owner/thing",
                           body='{"owner":"4"}',
                           content_type="application/json")

    subject.get_message_owner.when.called_with(None).should.throw(
        InvalidParametersError)
    subject.get_message_owner.when.called_with(
        []).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with(
        {}).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with("").should.throw(
        InvalidParametersError)
    subject.get_message_owner.when.called_with(
        ['thing']).should.throw(InvalidParametersError)
    subject.get_message_owner.when.called_with({
        'thing': 1
    }).should.throw(InvalidParametersError)
    subject.get_message_owner('thing').should.equal('4')
def test_share_resource():
    subject = MessageSenderMixin()
    subject.send_log_entry = MagicMock()

    httpretty.register_uri(httpretty.POST,"https://www.hpit-project.org/share-resource",
        body='OK',
    )

    subject.share_resource.when.called_with(None, None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with('', None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with([], None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with({}, None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with('thing', None).should.throw(InvalidParametersError)
    subject.share_resource.when.called_with('thing', '').should.throw(InvalidParametersError)
    subject.share_resource.when.called_with('thing', []).should.throw(InvalidParametersError)
    subject.share_resource('thing', '4').should.equal(True)
    subject.share_resource('thing', ['4', '5', '6']).should.equal(True)
def test_dispatch_responses():
    """
    MessageSenderMixin._dispatch_responses() Test plan:
        -Ensure False returned if pre_dispatch_responses hook returns false
        -Ensure False returned if post_dispatch_responses hook returns false
        -Catch invalid response from hpit on [message][id]
        -Catch invaled response from hpit on [response]
        -Catch no callback exception
        -Catch not callable error
        -Ensure true returned on completions
     """

    bad_response = [{"bad_response": "boo"}]
    bad_response2 = [{"message":{"message_id":"4"}}]
    good_response = [{"message": {"message_id":"4"},"response":{"data":"2"}}]

    
    def returnFalse():
        return False
    def returnTrue():
        return True
    def callback1(payload):
        return True
    
    test_message_sender_mixin = MessageSenderMixin()
    test_message_sender_mixin.send_log_entry = MagicMock()
    
    test_message_sender_mixin.outstanding_responses["4"] = 1
    
    test_message_sender_mixin.response_callbacks["4"] = callback1
    setattr(test_message_sender_mixin,"pre_dispatch_responses",returnFalse)
    setattr(test_message_sender_mixin,"post_dispatch_responses",returnTrue)
    test_message_sender_mixin._dispatch_responses(good_response).should.equal(False)
    
    setattr(test_message_sender_mixin,"pre_dispatch_responses",returnTrue)
    setattr(test_message_sender_mixin,"post_dispatch_responses",returnFalse)
    test_message_sender_mixin._dispatch_responses(good_response).should.equal(False)
    
    setattr(test_message_sender_mixin,"pre_dispatch_responses",returnTrue)
    setattr(test_message_sender_mixin,"post_dispatch_responses",returnTrue)
   
    test_message_sender_mixin._dispatch_responses(bad_response)
    test_message_sender_mixin.send_log_entry.assert_called_once_with('Invalid response from HPIT. No message id supplied in response.')

    test_message_sender_mixin.send_log_entry.reset_mock()
    test_message_sender_mixin._dispatch_responses(bad_response2)
    test_message_sender_mixin.send_log_entry.assert_called_once_with('Invalid response from HPIT. No response payload supplied.')
    
    del test_message_sender_mixin.response_callbacks["4"]
    test_message_sender_mixin.send_log_entry.reset_mock()
    test_message_sender_mixin._dispatch_responses(good_response)
    test_message_sender_mixin.send_log_entry.assert_called_once_with('No callback registered for message id: 4')

    test_message_sender_mixin.response_callbacks["4"] = 5
    test_message_sender_mixin.send_log_entry.reset_mock()
    test_message_sender_mixin._dispatch_responses(good_response)
    test_message_sender_mixin.send_log_entry.assert_called_once_with("Callback registered for transcation id: 4 is not a callable.")
    
    test_message_sender_mixin.outstanding_responses["4"] = 1
    test_message_sender_mixin.response_callbacks["4"] = callback1
    test_message_sender_mixin._dispatch_responses(good_response).should.equal(True)
    test_message_sender_mixin.outstanding_responses.should.be.empty
def test_dispatch_responses():
    """
    MessageSenderMixin._dispatch_responses() Test plan:
        -Ensure False returned if pre_dispatch_responses hook returns false
        -Ensure False returned if post_dispatch_responses hook returns false
        -Catch invalid response from hpit on [message][id]
        -Catch invaled response from hpit on [response]
        -Catch no callback exception
        -Catch not callable error
        -Ensure true returned on completions
     """

    bad_response = [{"bad_response": "boo"}]
    bad_response2 = [{"message": {"message_id": "4"}}]
    good_response = [{"message": {"message_id": "4"}, "response": "2"}]

    def returnFalse():
        return False

    def returnTrue():
        return True

    def callback1(payload):
        return True

    test_message_sender_mixin = MessageSenderMixin()
    test_message_sender_mixin.send_log_entry = MagicMock()

    test_message_sender_mixin.response_callbacks["4"] = callback1
    setattr(test_message_sender_mixin, "pre_dispatch_responses", returnFalse)
    setattr(test_message_sender_mixin, "post_dispatch_responses", returnTrue)
    test_message_sender_mixin._dispatch_responses(good_response).should.equal(
        False)

    setattr(test_message_sender_mixin, "pre_dispatch_responses", returnTrue)
    setattr(test_message_sender_mixin, "post_dispatch_responses", returnFalse)
    test_message_sender_mixin._dispatch_responses(good_response).should.equal(
        False)

    setattr(test_message_sender_mixin, "pre_dispatch_responses", returnTrue)
    setattr(test_message_sender_mixin, "post_dispatch_responses", returnTrue)

    test_message_sender_mixin._dispatch_responses(bad_response)
    test_message_sender_mixin.send_log_entry.assert_called_once_with(
        'Invalid response from HPIT. No message id supplied in response.')

    test_message_sender_mixin.send_log_entry.reset_mock()
    test_message_sender_mixin._dispatch_responses(bad_response2)
    test_message_sender_mixin.send_log_entry.assert_called_once_with(
        'Invalid response from HPIT. No response payload supplied.')

    del test_message_sender_mixin.response_callbacks["4"]
    test_message_sender_mixin.send_log_entry.reset_mock()
    test_message_sender_mixin._dispatch_responses(good_response)
    test_message_sender_mixin.send_log_entry.assert_called_once_with(
        'No callback registered for message id: 4')

    test_message_sender_mixin.response_callbacks["4"] = 5
    test_message_sender_mixin.send_log_entry.reset_mock()
    test_message_sender_mixin._dispatch_responses(good_response)
    test_message_sender_mixin.send_log_entry.assert_called_once_with(
        "Callback registered for transcation id: 4 is not a callable.")

    test_message_sender_mixin.response_callbacks["4"] = callback1
    test_message_sender_mixin._dispatch_responses(good_response).should.equal(
        True)