def message(self, msg: Message) -> Optional[Future]: """Handle received message and submit the result to message worker. :param msg: Received message. :return: Optional Future instance that represent message sending result. """ if msg['delay']['stamp']: # Avoid answering to all past messages when joining the room. # xep_0203 plugin required. # http://xmpp.org/extensions/xep-0203.html # # FYI: When resource part of bot JabberID is 'bot' such as # [email protected]/bot, HipChat won't send us past messages return None if msg['type'] in ('normal', 'chat'): # msg.reply("Thanks for sending\n%(body)s" % msg).send() pass elif msg['type'] == 'groupchat': # Don't talk to yourself. It's freaking people out. group_plugin = self.client.plugin['xep_0045'] my_nick = group_plugin.ourNicks[msg.get_mucroom()] sender_nick = msg.get_mucnick() if my_nick == sender_nick: return None ret = self.respond(msg['from'], msg['body']) if ret: return self.enqueue_sending_message(lambda: msg.reply(ret).send())
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 testtransport_message_listener_with_announce_to_same_node(self): """ Test to check the message_listener method with announce to the same of the signal class. """ sig_dict, signal = self.setup_vars_mocks() transport = XmppTransport.factory( "1", sig_dict["Signal"]["Overlays"]["A0FB389"], signal, signal._presence_publisher, None, None) transport._jid_cache = JidCache(signal, 30) register_stanza_plugin(Message, IpopSignal) msg = Message() msg["from"] = "ipop" transport.boundjid.full = "edgevpn" msg["ipop"]["type"] = "announce" msg["ipop"]["payload"] = "123#456" sig_dict["Signal"]["NodeId"] = "456" transport.send_msg = MagicMock() transport._presence_publisher = Mock() transport._presence_publisher.post_update = MagicMock() transport.message_listener(msg) self.assertEqual(transport._jid_cache.lookup("456"), None) transport.send_msg.assert_not_called() transport._presence_publisher.post_update.assert_not_called() print( "Passed : testtransport_message_listener_with_announce_to_same_node" )
def testtransport_message_listener_with_uid(self): """ Test to check the message_listener method with uid of the signal class. """ sig_dict, signal = self.setup_vars_mocks() transport = XmppTransport.factory( "1", sig_dict["Signal"]["Overlays"]["A0FB389"], signal, signal._presence_publisher, None, None) transport._jid_cache = JidCache(signal, 30) register_stanza_plugin(Message, IpopSignal) msg = Message() msg["from"] = "ipop" transport.boundjid.full = "edgevpn" msg["ipop"]["type"] = "uid!" msg["ipop"]["payload"] = "123#456" item = {0: "invk", 1: {"ActionTag": "1"}, 2: 5} q = Queue() q.put_nowait(item) outgoing_rem_acts = {"456": q} transport._outgoing_rem_acts = outgoing_rem_acts transport.send_msg = MagicMock() transport.message_listener(msg) assert transport._jid_cache.lookup("456") == "123" transport.send_msg.assert_called_once() print("Passed : testtransport_presence_event_handler_with_uid")
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 send_xmpp_message(self, event): """Transmit a message to a user""" self.log('Transmitting XMPP message', lvl=debug) msg = Message() msg['type'] = event.msg_type msg['to'] = '%s@localhost' % event.username msg['from'] = self.config.jid msg['body'] = event.body msg['subject'] = event.subject self.send(msg)
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']))
def testtransport_message_listener_with_invk(self, mock_loads): """ Test to check the message_listener method with invk to a different node of the signal class. """ sig_dict, signal = self.setup_vars_mocks() mock_loads.return_value = MagicMock() transport = XmppTransport.factory( "1", sig_dict["Signal"]["Overlays"]["A0FB389"], signal, signal._presence_publisher, None, None) transport._jid_cache = JidCache(signal, 30) register_stanza_plugin(Message, IpopSignal) msg = Message() msg["from"] = "ipop" transport.boundjid.full = "edgevpn" msg["ipop"]["type"] = "invk" msg["ipop"]["payload"] = {"Action": "announce"} transport._sig.handle_remote_action = MagicMock() transport.message_listener(msg) mock_loads.assert_called_once() transport._sig.handle_remote_action.assert_called_once() print("Passed : testtransport_message_listener_with_invk")