def test_response_received(self):

        publish_urn = 'rho:instances.owner'

        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)

        promise = self.rdf_publisher.send_out_request(payload)

        args, kwargs = self.roster_plugin.send_message.call_args
        payload = kwargs['payload']
        thread_id = kwargs['thread_id']

        response_payload = ResultCollectionPayload()
        response_payload.append(ResultPayload(about=publish_urn, types=[FOAF.Person, RHO.Owner]))

        self.rdf_publisher._send_message(RDFStanzaType.RESPONSE, response_payload, thread_id)
        response_args, response_kwargs = self.roster_plugin.send_message.call_args

        payload = response_kwargs['payload']
        response_message = Message()
        response_message.append(payload)
        response_message['thread'] = response_kwargs['thread_id']

        with mock.patch.object(promise, attribute='resolved') as mock_promise_resolve:
            self.rdf_publisher._receive_message(response_message)

            self.assertEqual(1, mock_promise_resolve.call_count)
            args, kwargs = mock_promise_resolve.call_args

            result = [rdf.about for rdf in args[0].results]

            self.assertEqual(result, [publish_urn])
    def test_sources_retrieved(self):

        publish_urn = 'rho:instances.owner'

        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)

        promise = self.rdf_publisher.send_out_request(payload, allow_multiple=True)

        args, kwargs = self.roster_plugin.send_message.call_args
        payload = kwargs['payload']
        thread_id = kwargs['thread_id']

        args, kwargs = self.scheduler_plugin.schedule_task.call_args
        callback = kwargs['callback']

        response_payload = ResultCollectionPayload()
        response_payload.append(ResultPayload(about=publish_urn, types=[FOAF.Person, RHO.Owner]))

        search_command_node = 'xmpp:[email protected]/bot?command;node=search_command'

        rdf_payload = self.rdf_publisher.create_rdf(mtype=RDFStanzaType.SEARCH_RESPONSE,
                                                    payload=response_payload, source_name='Search Command',
                                                    source_command=search_command_node)

        response_message = Message()
        response_message.append(rdf_payload)
        response_message['thread'] = thread_id

        with mock.patch.object(promise, attribute='resolved') as mock_promise_resolve:
            self.rdf_publisher._receive_message(response_message)

            mock_promise_resolve.assert_not_called()

        with mock.patch.object(promise, attribute='resolved') as mock_promise_resolve:

            callback()

            self.assertEqual(1, mock_promise_resolve.call_count)
            args, kwargs = mock_promise_resolve.call_args

            result_payload = args[0]

            result = [rdf.about for rdf in result_payload.results]

            self.assertEqual(result, [publish_urn, ])

            self.assertTrue(hasattr(result_payload, 'sources'))

            sources = list(result_payload.sources)

            self.assertEqual(1, len(sources))

            self.assertEqual('Search Command', sources[0][0])
            self.assertEqual('xmpp:[email protected]/bot?command;node=search_command', sources[0][1])
    def test_retrieve_all(self):

        publish_urn = 'rho:instances.owner'

        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)

        promise = self.rdf_publisher.send_out_request(payload, allow_multiple=True)

        args, kwargs = self.roster_plugin.send_message.call_args
        payload = kwargs['payload']
        thread_id = kwargs['thread_id']

        args, kwargs = self.scheduler_plugin.schedule_task.call_args
        callback = kwargs['callback']

        response_payload = ResultCollectionPayload()
        response_payload.append(ResultPayload(about=publish_urn, types=[FOAF.Person, RHO.Owner]))

        self.rdf_publisher._send_message(RDFStanzaType.RESPONSE, response_payload, thread_id)
        response_args, response_kwargs = self.roster_plugin.send_message.call_args

        payload = response_kwargs['payload']
        response_message = Message()
        response_message.append(payload)
        response_message['thread'] = response_kwargs['thread_id']

        with mock.patch.object(promise, attribute='resolved') as mock_promise_resolve:
            self.rdf_publisher._receive_message(response_message)

            mock_promise_resolve.assert_not_called()

        with mock.patch.object(promise, attribute='resolved') as mock_promise_resolve:
            self.rdf_publisher._receive_message(response_message)

            mock_promise_resolve.assert_not_called()

        with mock.patch.object(promise, attribute='resolved') as mock_promise_resolve:

            callback()

            self.assertEqual(1, mock_promise_resolve.call_count)
            args, kwargs = mock_promise_resolve.call_args

            result = [rdf.about for rdf in args[0].results]

            self.assertEqual(result, [publish_urn, publish_urn])

            # Should not have any sources defined.
            callback_results = args[0]

            self.assertFalse(hasattr(callback_results, 'sources'))
    def test_multiple_responses(self):

        publish_urn = "rho:instances.owner"

        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)

        promise = self.rdf_publisher.send_out_request(payload, allow_multiple=True)

        args, kwargs = self.roster_plugin.send_message.call_args
        payload = kwargs["payload"]
        thread_id = kwargs["thread_id"]

        args, kwargs = self.scheduler_plugin.schedule_task.call_args
        callback = kwargs["callback"]

        response_payload = ResultCollectionPayload()
        response_payload.append(ResultPayload(about=publish_urn, types=[FOAF.Person, RHO.Owner]))

        self.rdf_publisher._send_message(RDFStanzaType.RESPONSE, response_payload, thread_id)
        response_args, response_kwargs = self.roster_plugin.send_message.call_args

        payload = response_kwargs["payload"]
        response_message = Message()
        response_message.append(payload)
        response_message["thread"] = response_kwargs["thread_id"]

        with mock.patch.object(promise, attribute="resolved") as mock_promise_resolve:
            self.rdf_publisher._receive_message(response_message)

            mock_promise_resolve.assert_not_called()

        with mock.patch.object(promise, attribute="resolved") as mock_promise_resolve:
            self.rdf_publisher._receive_message(response_message)

            mock_promise_resolve.assert_not_called()

        with mock.patch.object(promise, attribute="resolved") as mock_promise_resolve:

            callback()

            self.assertEqual(1, mock_promise_resolve.call_count)
            args, kwargs = mock_promise_resolve.call_args

            result = [rdf.about for rdf in args[0].results]

            self.assertEqual(result, [publish_urn, publish_urn])
    def test_empty_handle_request(self):

        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)

        self.rdf_publisher.send_out_request(payload)

        # Verify the payload request.
        self.assertEqual(1, self.roster_plugin.send_message.call_count)

        args, kwargs = self.roster_plugin.send_message.call_args
        payload = kwargs['payload']

        message = Message()
        message.append(payload)
        message['thread'] = kwargs['thread_id']

        # Test empty request.
        self.rdf_publisher._receive_message(message)
    def test_no_result(self):
        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)

        self.rdf_publisher.send_out_request(payload)

        # Verify the payload request.
        self.assertEqual(1, self.roster_plugin.send_message.call_count)

        args, kwargs = self.roster_plugin.send_message.call_args
        payload = kwargs['payload']

        message = Message()
        message.append(payload)
        message['thread'] = kwargs['thread_id']

        handler_mock = mock.Mock(return_value=None)
        self.rdf_publisher.add_request_handler(handler_mock)

        self.rdf_publisher._receive_message(message)
    def test_create_handler(self):

        publish_urn = 'rho:instances.owner'

        payload = StoragePayload()
        payload.add_type(FOAF.Person, RHO.Owner)
        payload.about = publish_urn

        self.rdf_publisher.publish_create(payload)
        args, kwargs = self.roster_plugin.send_message.call_args

        payload = kwargs['payload']

        message = Message()
        message.append(payload)

        self.rdf_publisher._receive_message(message)

        create_handler = mock.MagicMock()
        self.rdf_publisher.add_create_handler(create_handler)

        self.rdf_publisher._receive_message(message)
        self.assertEqual(self.scheduler_plugin.defer.call_args[0][0], create_handler)
        self.assertEqual(str(self.scheduler_plugin.defer.call_args[0][1]), str(message['rdf']))