comparison src/test/test_plugin_xep_0033.py @ 1955:633b5c21aefd

backend, frontend: messages refactoring (huge commit, not finished): /!\ database schema has been modified, do a backup before updating message have been refactored, here are the main changes: - languages are now handled - all messages have an uid (internal to SàT) - message updating is anticipated - subject is now first class - new naming scheme is used newMessage => messageNew, getHistory => historyGet, sendMessage => messageSend - minimal compatibility refactoring in quick_frontend/Primitivus, better refactoring should follow - threads handling - delayed messages are saved into history - info messages may also be saved in history (e.g. to keep track of people joining/leaving a room) - duplicate messages should be avoided - historyGet return messages in right order, no need to sort again - plugins have been updated to follow new features, some of them need to be reworked (e.g. OTR) - XEP-0203 (Delayed Delivery) is now fully handled in core, the plugin just handle disco and creation of a delay element - /!\ jp and Libervia are currently broken, as some features of Primitivus It has been put in one huge commit to avoid breaking messaging between changes. This is the main part of message refactoring, other commits will follow to take profit of the new features/behaviour.
author Goffi <goffi@goffi.org>
date Tue, 24 May 2016 22:11:04 +0200
parents 2daf7b4c6756
children 8b37a62336c3
comparison
equal deleted inserted replaced
1943:ccfe45302a5c 1955:633b5c21aefd
25 from sat.plugins import plugin_xep_0033 as plugin 25 from sat.plugins import plugin_xep_0033 as plugin
26 from sat.core.exceptions import CancelError 26 from sat.core.exceptions import CancelError
27 from twisted.internet import defer 27 from twisted.internet import defer
28 from wokkel.generic import parseXml 28 from wokkel.generic import parseXml
29 from twisted.words.protocols.jabber.jid import JID 29 from twisted.words.protocols.jabber.jid import JID
30 from logging import ERROR
31 30
32 PROFILE_INDEX = 0 31 PROFILE_INDEX = 0
33 PROFILE = Const.PROFILE[PROFILE_INDEX] 32 PROFILE = Const.PROFILE[PROFILE_INDEX]
34 JID_STR_FROM = Const.JID_STR[1] 33 JID_STR_FROM = Const.JID_STR[1]
35 JID_STR_TO = Const.PROFILE_DICT[PROFILE].host 34 JID_STR_TO = Const.PROFILE_DICT[PROFILE].host
58 </addresses> 57 </addresses>
59 </message> 58 </message>
60 """ % (JID_STR_FROM, JID_STR_TO, JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC) 59 """ % (JID_STR_FROM, JID_STR_TO, JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC)
61 stanza = parseXml(xml.encode("utf-8")) 60 stanza = parseXml(xml.encode("utf-8"))
62 treatments = defer.Deferred() 61 treatments = defer.Deferred()
63 self.plugin.messageReceivedTrigger(stanza, treatments, PROFILE) 62 self.plugin.messageReceivedTrigger(self.host.getClient(PROFILE), stanza, treatments)
64 data = {'extra': {}} 63 data = {'extra': {}}
65 64
66 def cb(data): 65 def cb(data):
67 expected = ('to', JID_STR_X_TO, 'cc', JID_STR_X_CC, 'bcc', JID_STR_X_BCC) 66 expected = ('to', JID_STR_X_TO, 'cc', JID_STR_X_CC, 'bcc', JID_STR_X_BCC)
68 msg = 'Expected: %s\nGot: %s' % (expected, data['extra']['addresses']) 67 msg = 'Expected: %s\nGot: %s' % (expected, data['extra']['addresses'])
85 """ % (JID_STR_FROM, JID_STR_TO) 84 """ % (JID_STR_FROM, JID_STR_TO)
86 mess_data['xml'] = parseXml(original_stanza.encode("utf-8")) 85 mess_data['xml'] = parseXml(original_stanza.encode("utf-8"))
87 return mess_data 86 return mess_data
88 87
89 def _assertAddresses(self, mess_data): 88 def _assertAddresses(self, mess_data):
90 """The mess_data that we got here has been modified by self.plugin.sendMessageTrigger, 89 """The mess_data that we got here has been modified by self.plugin.messageSendTrigger,
91 check that the addresses element has been added to the stanza.""" 90 check that the addresses element has been added to the stanza."""
92 expected = self._get_mess_data()['xml'] 91 expected = self._get_mess_data()['xml']
93 addresses_extra = """ 92 addresses_extra = """
94 <addresses xmlns='http://jabber.org/protocol/address'> 93 <addresses xmlns='http://jabber.org/protocol/address'>
95 <address type='%s' jid='%s'/> 94 <address type='%s' jid='%s'/>
133 self.assertEqualUnsortedList(self.host.stored_messages, stored, msg) 132 self.assertEqualUnsortedList(self.host.stored_messages, stored, msg)
134 133
135 return defer.DeferredList(d_list).addCallback(cb_list) 134 return defer.DeferredList(d_list).addCallback(cb_list)
136 135
137 def _trigger(self, data): 136 def _trigger(self, data):
138 """Execute self.plugin.sendMessageTrigger with a different logging 137 """Execute self.plugin.messageSendTrigger with a different logging
139 level to not pollute the output, then check that the plugin did its 138 level to not pollute the output, then check that the plugin did its
140 job. It should abort sending the message or add the extended 139 job. It should abort sending the message or add the extended
141 addressing information to the stanza. 140 addressing information to the stanza.
142 @param data: the data to be processed by self.plugin.sendMessageTrigger 141 @param data: the data to be processed by self.plugin.messageSendTrigger
143 """ 142 """
144 pre_treatments = defer.Deferred() 143 pre_treatments = defer.Deferred()
145 post_treatments = defer.Deferred() 144 post_treatments = defer.Deferred()
146 helpers.muteLogging() 145 helpers.muteLogging()
147 self.plugin.sendMessageTrigger(data, pre_treatments, post_treatments, PROFILE) 146 self.plugin.messageSendTrigger(self.host.getClient[PROFILE], data, pre_treatments, post_treatments)
148 post_treatments.callback(data) 147 post_treatments.callback(data)
149 helpers.unmuteLogging() 148 helpers.unmuteLogging()
150 post_treatments.addCallbacks(self._assertAddresses, lambda failure: failure.trap(CancelError)) 149 post_treatments.addCallbacks(self._assertAddresses, lambda failure: failure.trap(CancelError))
151 return post_treatments 150 return post_treatments
152 151
153 def test_sendMessageTriggerFeatureNotSupported(self): 152 def test_messageSendTriggerFeatureNotSupported(self):
154 # feature is not supported, abort the message 153 # feature is not supported, abort the message
155 self.host.memory.reinit() 154 self.host.memory.reinit()
156 data = self._get_mess_data() 155 data = self._get_mess_data()
157 return self._trigger(data) 156 return self._trigger(data)
158 157
159 def test_sendMessageTriggerFeatureSupported(self): 158 def test_messageSendTriggerFeatureSupported(self):
160 # feature is supported by the main target server 159 # feature is supported by the main target server
161 self.host.reinit() 160 self.host.reinit()
162 self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE) 161 self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE)
163 data = self._get_mess_data() 162 data = self._get_mess_data()
164 d = self._trigger(data) 163 d = self._trigger(data)
165 return d.addCallback(lambda dummy: self._checkSentAndStored()) 164 return d.addCallback(lambda dummy: self._checkSentAndStored())
166 165
167 def test_sendMessageTriggerFeatureFullySupported(self): 166 def test_messageSendTriggerFeatureFullySupported(self):
168 # feature is supported by all target servers 167 # feature is supported by all target servers
169 self.host.reinit() 168 self.host.reinit()
170 self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE) 169 self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE)
171 for dest in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC): 170 for dest in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC):
172 self.host.addFeature(JID(JID(dest).host), plugin.NS_ADDRESS, PROFILE) 171 self.host.addFeature(JID(JID(dest).host), plugin.NS_ADDRESS, PROFILE)
173 data = self._get_mess_data() 172 data = self._get_mess_data()
174 d = self._trigger(data) 173 d = self._trigger(data)
175 return d.addCallback(lambda dummy: self._checkSentAndStored()) 174 return d.addCallback(lambda dummy: self._checkSentAndStored())
176 175
177 def test_sendMessageTriggerFixWrongEntity(self): 176 def test_messageSendTriggerFixWrongEntity(self):
178 # check that a wrong recipient entity is fixed by the backend 177 # check that a wrong recipient entity is fixed by the backend
179 self.host.reinit() 178 self.host.reinit()
180 self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE) 179 self.host.addFeature(JID(JID_STR_TO), plugin.NS_ADDRESS, PROFILE)
181 for dest in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC): 180 for dest in (JID_STR_X_TO, JID_STR_X_CC, JID_STR_X_BCC):
182 self.host.addFeature(JID(JID(dest).host), plugin.NS_ADDRESS, PROFILE) 181 self.host.addFeature(JID(JID(dest).host), plugin.NS_ADDRESS, PROFILE)