Mercurial > libervia-backend
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) |