source: wokkel/test/test_muc.py @ 110:ddf5580b7128

wokkel-muc-client-support-24
Last change on this file since 110:ddf5580b7128 was 110:ddf5580b7128, checked in by Christopher Zorn <tofu@…>, 14 years ago

add some history and other things, plus some test stubs

File size: 7.0 KB
Line 
1# Copyright (c) 2003-2008 Ralph Meijer
2# See LICENSE for details.
3
4"""
5Tests for L{wokkel.muc}
6"""
7
8from zope.interface import verify
9
10from twisted.trial import unittest
11from twisted.internet import defer
12from twisted.words.xish import domish, xpath
13from twisted.words.protocols.jabber import error
14from twisted.words.protocols.jabber.jid import JID
15
16from wokkel import data_form, iwokkel, muc, shim, disco
17from wokkel.generic import parseXml
18from wokkel.test.helpers import XmlStreamStub
19
20try:
21    from twisted.words.protocols.jabber.xmlstream import toResponse
22except ImportError:
23    from wokkel.compat import toResponse
24
25
26def calledAsync(fn):
27    """
28    Function wrapper that fires a deferred upon calling the given function.
29    """
30    d = defer.Deferred()
31
32    def func(*args, **kwargs):
33        try:
34            result = fn(*args, **kwargs)
35        except:
36            d.errback()
37        else:
38            d.callback(result)
39
40    return d, func
41
42
43class MucClientTest(unittest.TestCase):
44    timeout = 2
45
46    def setUp(self):
47        self.stub = XmlStreamStub()
48        self.protocol = muc.MUCClient()
49        self.protocol.xmlstream = self.stub.xmlstream
50        self.protocol.connectionInitialized()
51        self.test_room = 'test'
52        self.test_srv  = 'conference.example.org'
53        self.test_nick = 'Nick'
54
55        self.room_jid = JID(self.test_room+'@'+self.test_srv+'/'+self.test_nick)
56
57    def test_interface(self):
58        """
59        Do instances of L{muc.MUCClient} provide L{iwokkel.IMUCClient}?
60        """
61        verify.verifyObject(iwokkel.IMUCClient, self.protocol)
62
63
64    def test_presence(self):
65        """Test receiving room presence
66        """
67        p = muc.UserPresence()
68       
69        def userPresence(prs):
70            self.failUnless(len(prs.children)==1, 'Not enough children')
71            self.failUnless(getattr(prs,'x',None), 'No x element')
72                   
73       
74        d, self.protocol.receivedUserPresence = calledAsync(userPresence)
75        self.stub.send(p)
76        return d
77
78
79    def test_groupChat(self):
80        """Test receiving room presence
81        """
82        m = muc.GroupChat('test@test.com',body='test')
83       
84        def groupChat(elem):
85            self.failUnless(elem.name=='message','Wrong stanza')
86            self.failUnless(elem['type'] == 'groupchat', 'Wrong attribute')
87                           
88       
89        d, self.protocol.receivedGroupChat = calledAsync(groupChat)
90        self.stub.send(m)
91        return d
92
93
94    def test_discoServerSupport(self):
95        """Test for disco support from a server.
96        """
97        test_srv = 'shakespeare.lit'
98
99        def cb(query):
100            # check namespace
101            self.failUnless(query.uri==disco.NS_INFO, 'Wrong namespace')
102           
103
104        d = self.protocol.disco(test_srv)
105        d.addCallback(cb)
106
107        iq = self.stub.output[-1]
108       
109        # send back a response
110        response = toResponse(iq, 'result')
111        response.addElement('query', disco.NS_INFO)
112        # need to add information to response
113        response.query.addChild(disco.DiscoFeature(muc.NS))
114        response.query.addChild(disco.DiscoIdentity(category='conference',
115                                                    name='Macbeth Chat Service',
116                                                    type='text'))
117       
118        self.stub.send(response)
119        return d
120       
121
122       
123    def test_joinRoom(self):
124        """Test joining a room
125        """
126       
127
128        def cb(room):
129            self.assertEquals(self.test_room, room.name)
130
131        d = self.protocol.join(self.test_srv, self.test_room, self.test_nick)
132        d.addCallback(cb)
133
134        prs = self.stub.output[-1]
135        self.failUnless(prs.name=='presence', "Need to be presence")
136        self.failUnless(getattr(prs, 'x', None), 'No muc x element')
137
138        # send back user presence, they joined       
139        response = muc.UserPresence(frm=self.test_room+'@'+self.test_srv+'/'+self.test_nick)
140        self.stub.send(response)
141        return d
142
143
144    def test_joinRoomForbidden(self):
145        """Test joining a room and getting an error
146        """
147
148        def cb(error):
149            self.failUnless(isinstance(error.value,muc.PresenceError), 'Wrong type')
150            self.failUnless(error.value['type']=='error', 'Not an error returned')
151           
152           
153        d = self.protocol.join(self.test_srv, self.test_room, self.test_nick)
154        d.addBoth(cb)
155
156        prs = self.stub.output[-1]
157        self.failUnless(prs.name=='presence', "Need to be presence")
158        self.failUnless(getattr(prs, 'x', None), 'No muc x element')
159        # send back user presence, they joined
160       
161        response = muc.PresenceError(error=muc.MUCError('auth',
162                                                        'forbidden'
163                                                        ),
164                                     frm=self.room_jid.full())
165        self.stub.send(response)
166        return d       
167
168    def test_partRoom(self):
169        self.fail('Not Implemented')
170       
171
172    def test_ban(self):
173       
174        self.fail('Not Implemented')
175
176    def test_kick(self):
177        self.fail('Not Implemented')
178       
179
180    def test_password(self):
181        """Test sending a password via presence to a password protected room.
182        """
183       
184       
185        self.fail('Not Implemented')
186
187    def test_history(self):
188       
189        self.fail('Not Implemented')
190
191
192    def test_oneToOneChat(self):
193        """Test converting a one to one chat
194        """
195        archive = []
196        thread = "e0ffe42b28561960c6b12b944a092794b9683a38"
197        # create messages
198        msg = domish.Element((None, 'message'))
199        msg['to'] = 'testing@example.com'
200        msg['type'] = 'chat'
201        msg.addElement('body', None, 'test')
202        msg.addElement('thread', None, thread)
203
204        archive.append(msg)
205
206        msg = domish.Element((None, 'message'))
207        msg['to'] = 'testing2@example.com'
208        msg['type'] = 'chat'
209        msg.addElement('body', None, 'yo')
210        msg.addElement('thread', None, thread)
211
212        archive.append(msg)
213
214        self.protocol.history(self.room_jid.userhost(), archive)
215
216
217        while len(self.stub.output)>0:
218            m = self.stub.output.pop()
219            # check for delay element
220            self.failUnless(m.name=='message', 'Wrong stanza')
221            self.failUnless(xpath.matches("/message/delay", m), 'Invalid history stanza')
222       
223
224    def test_invite(self):
225        self.fail('Not Implemented')
226
227       
228    def test_privateMessage(self):
229        self.fail('Not Implemented')
230
231    def test_register(self):
232        self.fail('Not Implemented')
233
234    def test_voice(self):
235       
236        self.protocol.voice(self.room_jid.userhost())
237
238        m = self.stub.output[-1]
239        self.failUnless(m.name=='message', "Need to be message stanza")
240        self.failUnless(getattr(m, 'x', None), 'No muc x element')
241
242        self.failUnless(xpath.matches("/message/x[@type='submit']/field/value[text()='%s']" % (muc.NS_REQUEST,), m), 'Invalid voice message stanza')
243
244
245    def test_roomConfigure(self):
246
247        self.fail('Not Implemented')
248       
249
Note: See TracBrowser for help on using the repository browser.