Changeset 153:bf4b940f3547
- Timestamp:
- Sep 2, 2011, 9:56:49 AM (11 years ago)
- Branch:
- wokkel-muc-client-support-24
- Location:
- wokkel
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
wokkel/iwokkel.py
r152 r153 779 779 """ 780 780 781 def receivedSubject(room, subject):781 def receivedSubject(room, user, subject): 782 782 """ 783 783 A subject is received when you join a room and when the subject is changed. This … … 786 786 @param room: The room the subject was accepted for. 787 787 @type room: L{muc.Room} 788 789 @param user: The user that set the subject. 790 @type user: L{muc.User} 788 791 789 792 @param subject: The subject of the given room. -
wokkel/muc.py
r152 r153 356 356 """ 357 357 358 statusCode = None 358 affiliation = None 359 role = None 360 entity = None 361 nick = None 362 363 statusCodes = None 359 364 360 365 childParsers = {(NS_MUC_USER, 'x'): '_childParser_mucUser'} 361 366 362 367 def _childParser_mucUser(self, element): 368 statusCodes = set() 369 363 370 for child in element.elements(): 364 371 if child.uri != NS_MUC_USER: 365 372 continue 373 366 374 elif child.name == 'status': 367 self.statusCode = child.getAttribute('code') 368 # TODO: item, destroy 369 375 try: 376 statusCode = int(child.getAttribute('code')) 377 except (TypeError, ValueError): 378 continue 379 380 statusCodes.add(statusCode) 381 382 elif child.name == 'item': 383 if child.hasAttribute('jid'): 384 self.entity = jid.JID(child['jid']) 385 386 self.nick = child.getAttribute('nick') 387 self.affiliation = child.getAttribute('affiliation') 388 self.role = child.getAttribute('role') 389 390 for reason in child.elements(NS_MUC_ADMIN, 'reason'): 391 self.reason = unicode(reason) 392 393 # TODO: destroy 394 395 if statusCodes: 396 self.statusCodes = statusCodes 370 397 371 398 … … 496 523 query = "/presence[@from='%s' or (@from='%s' and @type='error')]" % ( 497 524 stanza.recipient.full(), stanza.recipient.userhost()) 498 self.xmlstream.addOnetimeObserver(query, onResponse, priority= 1)525 self.xmlstream.addOnetimeObserver(query, onResponse, priority=-1) 499 526 self.xmlstream.send(stanza.toElement()) 500 527 return d … … 1041 1068 a client. 1042 1069 1043 @ivar roomIdentifier: The Room ID of the MUC room. 1044 @type roomIdentifier: C{unicode} 1045 1046 @ivar service: The server where the MUC room is located. 1047 @type service: C{unicode} 1070 @ivar roomJID: The Room JID of the MUC room. 1071 @type roomJID: L{JID} 1048 1072 1049 1073 @ivar nick: The nick name for the client in this room. … … 1054 1078 1055 1079 @ivar occupantJID: The JID of the occupant in the room. Generated from 1056 room Identifier, service,and nick.1080 roomJID and nick. 1057 1081 @type occupantJID: L{jid.JID} 1058 1082 """ 1059 1083 1060 1084 1061 def __init__(self, room Identifier, service, nick, state=None):1085 def __init__(self, roomJID, nick, state=None): 1062 1086 """ 1063 1087 Initialize the room. 1064 1088 """ 1065 self.roomIdentifier = roomIdentifier 1066 self.service = service 1089 self.roomJID = roomJID 1067 1090 self.setNick(nick) 1068 1091 self.state = state … … 1074 1097 1075 1098 def setNick(self, nick): 1076 self.occupantJID = jid.internJID(u"%s@%s/%s" % (self.roomIdentifier, 1077 self.service, 1078 nick)) 1099 self.occupantJID = jid.internJID(u"%s/%s" % (self.roomJID, nick)) 1079 1100 self.nick = nick 1080 1101 … … 1168 1189 1169 1190 1170 def _removeRoom(self, occupantJID):1191 def _removeRoom(self, roomJID): 1171 1192 """ 1172 1193 Delete a room from the room collection. 1173 1194 """ 1174 roomJID = occupantJID.userhostJID()1175 1195 if roomJID in self._rooms: 1176 1196 del self._rooms[roomJID] 1177 1197 1178 1198 1179 def unavailableReceived(self, presence): 1180 """ 1181 Unavailable presence was received. 1182 1183 If this was received from a MUC room occupant JID, that occupant has 1184 left the room. 1185 """ 1186 1187 occupantJID = presence.sender 1188 1189 if occupantJID: 1190 self._userLeavesRoom(occupantJID) 1191 1192 1193 def errorReceived(self, presence): 1194 """ 1195 Error presence was received. 1196 1197 If this was received from a MUC room occupant JID, we conclude the 1198 occupant has left the room. 1199 """ 1200 occupantJID = presence.sender 1201 1202 if occupantJID: 1203 self._userLeavesRoom(occupantJID) 1204 1205 1206 def _userLeavesRoom(self, occupantJID): 1199 def _getRoomUser(self, stanza): 1200 """ 1201 Lookup the room and user associated with the stanza's sender. 1202 """ 1203 occupantJID = stanza.sender 1204 1205 if not occupantJID: 1206 return None, None 1207 1207 1208 # when a user leaves a room we need to update it 1208 1209 room = self._getRoom(occupantJID.userhostJID()) 1209 1210 if room is None: 1210 1211 # not in the room yet 1212 return None, None 1213 1214 # Check if user is in roster 1215 nick = occupantJID.resource 1216 user = room.getUser(nick) 1217 1218 return room, user 1219 1220 1221 def unavailableReceived(self, presence): 1222 """ 1223 Unavailable presence was received. 1224 1225 If this was received from a MUC room occupant JID, that occupant has 1226 left the room. 1227 """ 1228 1229 room, user = self._getRoomUser(presence) 1230 1231 if room is None or user is None: 1211 1232 return 1212 # check if user is in roster 1213 user = room.getUser(occupantJID.resource) 1233 1234 room.removeUser(user) 1235 self.userLeftRoom(room, user) 1236 1237 1238 def availableReceived(self, presence): 1239 """ 1240 Available presence was received. 1241 """ 1242 1243 room, user = self._getRoomUser(presence) 1244 1245 if room is None: 1246 return 1247 1214 1248 if user is None: 1215 return 1249 nick = presence.sender.resource 1250 user = User(nick, presence.entity) 1251 1252 # Update user status 1253 user.status = presence.status 1254 user.show = presence.show 1255 1216 1256 if room.inRoster(user): 1217 room.removeUser(user) 1218 self.userLeftRoom(room, user) 1219 1220 1221 def availableReceived(self, presence): 1222 """ 1223 Available presence was received. 1224 """ 1225 1226 occupantJID = presence.sender 1227 1228 if not occupantJID: 1229 return 1230 1231 # grab room 1232 room = self._getRoom(occupantJID.userhostJID()) 1233 if room is None: 1234 # not in the room yet 1235 return 1236 1237 user = self._changeUserStatus(room, occupantJID, presence.status, 1238 presence.show) 1239 1240 if room.inRoster(user): 1241 # we changed status or nick 1242 if presence.statusCode: 1243 room.status = presence.statusCode # XXX 1244 else: 1245 self.userUpdatedStatus(room, user, presence.show, 1246 presence.status) 1257 self.userUpdatedStatus(room, user, presence.show, presence.status) 1247 1258 else: 1248 1259 room.addUser(user) … … 1257 1268 L{receivedGroupChat}, L{receivedHistory} or L{receivedHistory}. 1258 1269 """ 1259 occupantJID = message.sender 1260 if not occupantJID: 1270 room, user = self._getRoomUser(message) 1271 1272 if room is None: 1261 1273 return 1262 1263 roomJID = occupantJID.userhostJID()1264 1265 room = self._getRoom(roomJID)1266 if room is None:1267 # not in the room yet1268 return1269 1270 if occupantJID.resource:1271 user = room.getUser(occupantJID.resource)1272 else:1273 # This message is from the room itself.1274 user = None1275 1274 1276 1275 if message.subject: … … 1282 1281 1283 1282 1284 def _joinedRoom(self, presence):1285 """1286 We have presence that says we joined a room.1287 """1288 roomJID = presence.sender.userhostJID()1289 1290 # change the state of the room1291 room = self._getRoom(roomJID)1292 room.state = 'joined'1293 1294 # grab status1295 if presence.statusCode:1296 room.status = presence.statusCode1297 1298 return room1299 1300 1301 def _leftRoom(self, presence):1302 """1303 We have presence that says we left a room.1304 """1305 occupantJID = presence.sender1306 1307 # change the state of the room1308 self._removeRoom(occupantJID)1309 1310 return True1311 1312 1313 1283 def userJoinedRoom(self, room, user): 1314 1284 """ … … 1353 1323 1354 1324 1355 def receivedSubject(self, room, subject): 1356 """ 1325 def receivedSubject(self, room, user, subject): 1326 """ 1327 A (new) room subject has been received. 1328 1357 1329 This method will need to be modified inorder for clients to 1358 1330 do something when this event occurs. … … 1401 1373 def join(self, roomJID, nick, historyOptions=None, 1402 1374 password=None): 1403 room = Room(roomJID.user, roomJID.host, nick, state='joining') 1375 """ 1376 Join a MUC room by sending presence to it. 1377 1378 @param roomJID: The JID of the room the entity is joining. 1379 @type roomJID: L{jid.JID} 1380 1381 @param nick: The nick name for the entitity joining the room. 1382 @type nick: C{unicode} 1383 1384 @param historyOptions: Options for conversation history sent by the 1385 room upon joining. 1386 @type historyOptions: L{HistoryOptions} 1387 1388 @param password: Optional password for the room. 1389 @type password: C{unicode} 1390 1391 @return: A deferred that fires with the room when the entity is in the 1392 room, or with a failure if an error has occurred. 1393 """ 1394 def cb(presence): 1395 """ 1396 We have presence that says we joined a room. 1397 """ 1398 room.state = 'joined' 1399 return room 1400 1401 def eb(failure): 1402 self._removeRoom(roomJID) 1403 return failure 1404 1405 room = Room(roomJID, nick, state='joining') 1404 1406 self._addRoom(room) 1405 1407 1406 1408 d = MUCClientProtocol.join(self, roomJID, nick, historyOptions, 1407 1409 password) 1408 d.addCallback (self._joinedRoom)1410 d.addCallbacks(cb, eb) 1409 1411 return d 1410 1411 1412 def _changeUserStatus(self, room, occupantJID, status, show):1413 """1414 Change the user status in a room.1415 """1416 1417 # check if user is in roster1418 user = room.getUser(occupantJID.resource)1419 if user is None: # create a user that does not exist1420 user = User(occupantJID.resource)1421 1422 if status is not None:1423 user.status = unicode(status)1424 if show is not None:1425 user.show = unicode(show)1426 1427 return user1428 1429 1430 def _changed(self, presence, occupantJID):1431 """1432 Callback for changing the nick and status.1433 """1434 room = self._getRoom(occupantJID.userhostJID())1435 self._changeUserStatus(room, occupantJID, presence.status, presence.show)1436 1437 return room1438 1412 1439 1413 … … 1450 1424 @type nick: C{unicode} 1451 1425 """ 1426 def cb(presence): 1427 # Presence confirmation, change the nickname. 1428 room.setNick(nick) 1429 return room 1430 1452 1431 room = self._getRoom(roomJID) 1453 1432 1454 # Change the nickname1455 room.setNick(nick)1456 1457 1433 d = MUCClientProtocol.nick(self, roomJID, nick) 1458 d.addCallback( self._changed, room.occupantJID)1434 d.addCallback(cb) 1459 1435 return d 1460 1436 … … 1469 1445 @type roomJID: L{jid.JID} 1470 1446 """ 1447 def cb(presence): 1448 self._removeRoom(roomJID) 1449 1471 1450 d = MUCClientProtocol.leave(self, roomJID) 1472 d.addCallback( self._leftRoom)1451 d.addCallback(cb) 1473 1452 return d 1474 1453 … … 1492 1471 room = self._getRoom(roomJID) 1493 1472 d = MUCClientProtocol.status(self, roomJID, show, status) 1494 d.addCallback( self._changed, room.occupantJID)1473 d.addCallback(lambda _: room) 1495 1474 return d 1496 1475 -
wokkel/test/test_muc.py
r152 r153 121 121 122 122 123 class UserPresenceTest(unittest.TestCase): 124 """ 125 Tests for L{muc.UserPresence}. 126 """ 127 128 129 def test_toElementUnknownChild(self): 130 """ 131 Unknown child elements are ignored. 132 """ 133 xml = """ 134 <presence from='coven@chat.shakespeare.lit/thirdwitch' 135 id='026B3509-2CCE-4D69-96D6-25F41FFDC408' 136 to='hag66@shakespeare.lit/pda'> 137 <x xmlns='http://jabber.org/protocol/muc#user'> 138 <child xmlns='myns'/> 139 </x> 140 </presence> 141 """ 142 143 element = parseXml(xml) 144 presence = muc.UserPresence.fromElement(element) 145 146 147 def test_toElementStatusOne(self): 148 """ 149 Status codes are extracted. 150 """ 151 xml = """ 152 <presence from='coven@chat.shakespeare.lit/thirdwitch' 153 id='026B3509-2CCE-4D69-96D6-25F41FFDC408' 154 to='hag66@shakespeare.lit/pda'> 155 <x xmlns='http://jabber.org/protocol/muc#user'> 156 <item affiliation='member' role='participant'/> 157 <status code='110'/> 158 </x> 159 </presence> 160 """ 161 162 element = parseXml(xml) 163 presence = muc.UserPresence.fromElement(element) 164 165 self.assertIn(110, presence.statusCodes) 166 167 168 def test_toElementStatusMultiple(self): 169 """ 170 Multiple status codes are all extracted. 171 """ 172 xml = """ 173 <presence from='coven@chat.shakespeare.lit/thirdwitch' 174 id='026B3509-2CCE-4D69-96D6-25F41FFDC408' 175 to='hag66@shakespeare.lit/pda'> 176 <x xmlns='http://jabber.org/protocol/muc#user'> 177 <item affiliation='member' role='participant'/> 178 <status code='100'/> 179 <status code='110'/> 180 </x> 181 </presence> 182 """ 183 184 element = parseXml(xml) 185 presence = muc.UserPresence.fromElement(element) 186 187 self.assertIn(110, presence.statusCodes) 188 self.assertIn(100, presence.statusCodes) 189 190 191 def test_toElementStatusEmpty(self): 192 """ 193 Empty status elements are ignored. 194 """ 195 xml = """ 196 <presence from='coven@chat.shakespeare.lit/thirdwitch' 197 id='026B3509-2CCE-4D69-96D6-25F41FFDC408' 198 to='hag66@shakespeare.lit/pda'> 199 <x xmlns='http://jabber.org/protocol/muc#user'> 200 <item affiliation='member' role='participant'/> 201 <status/> 202 </x> 203 </presence> 204 """ 205 206 element = parseXml(xml) 207 presence = muc.UserPresence.fromElement(element) 208 209 self.assertIdentical(None, presence.statusCodes) 210 211 212 def test_toElementStatusBad(self): 213 """ 214 Bad status codes are ignored. 215 """ 216 xml = """ 217 <presence from='coven@chat.shakespeare.lit/thirdwitch' 218 id='026B3509-2CCE-4D69-96D6-25F41FFDC408' 219 to='hag66@shakespeare.lit/pda'> 220 <x xmlns='http://jabber.org/protocol/muc#user'> 221 <item affiliation='member' role='participant'/> 222 <status code="badvalue"/> 223 </x> 224 </presence> 225 """ 226 227 element = parseXml(xml) 228 presence = muc.UserPresence.fromElement(element) 229 230 self.assertIdentical(None, presence.statusCodes) 231 232 233 def test_toElementStatusUnknown(self): 234 """ 235 Unknown status codes are still recorded in C{statusCodes}. 236 """ 237 xml = """ 238 <presence from='coven@chat.shakespeare.lit/thirdwitch' 239 id='026B3509-2CCE-4D69-96D6-25F41FFDC408' 240 to='hag66@shakespeare.lit/pda'> 241 <x xmlns='http://jabber.org/protocol/muc#user'> 242 <item affiliation='member' role='participant'/> 243 <status code="999"/> 244 </x> 245 </presence> 246 """ 247 248 element = parseXml(xml) 249 presence = muc.UserPresence.fromElement(element) 250 251 self.assertIn(999, presence.statusCodes) 252 253 254 def test_toElementItem(self): 255 """ 256 Item attributes are parsed properly. 257 """ 258 xml = """ 259 <presence from='coven@chat.shakespeare.lit/thirdwitch' 260 to='crone1@shakespeare.lit/desktop'> 261 <x xmlns='http://jabber.org/protocol/muc#user'> 262 <item affiliation='member' 263 jid='hag66@shakespeare.lit/pda' 264 role='participant' 265 nick='thirdwitch'/> 266 </x> 267 </presence> 268 """ 269 270 element = parseXml(xml) 271 presence = muc.UserPresence.fromElement(element) 272 self.assertEqual(u'member', presence.affiliation) 273 self.assertEqual(u'participant', presence.role) 274 self.assertEqual(JID('hag66@shakespeare.lit/pda'), presence.entity) 275 self.assertEqual(u'thirdwitch', presence.nick) 276 277 123 278 124 279 class MUCClientProtocolTest(unittest.TestCase): … … 388 543 self.assertNotIdentical(None, element.x, 'No muc x element') 389 544 390 # send back user presence, nick changed545 # send back error presence, nick conflicted 391 546 xml = u""" 392 547 <presence from='%s/%s' type='error'> … … 1120 1275 """ 1121 1276 # create a room 1122 room = muc.Room(self.roomIdentifier, 1123 self.service, 1124 self.nick) 1277 room = muc.Room(self.roomJID, self.nick) 1125 1278 self.protocol._addRoom(room) 1279 return room 1126 1280 1127 1281 … … 1131 1285 """ 1132 1286 verify.verifyObject(iwokkel.IMUCClient, self.protocol) 1287 1288 1289 def _testPresence(self, sender='', available=True): 1290 """ 1291 Helper for presence tests. 1292 """ 1293 def userUpdatedStatus(room, user, show, status): 1294 self.fail("Unexpected call to userUpdatedStatus") 1295 1296 def userJoinedRoom(room, user): 1297 self.fail("Unexpected call to userJoinedRoom") 1298 1299 if available: 1300 available = "" 1301 else: 1302 available = " type='unavailable'" 1303 1304 if sender: 1305 sender = u" from='%s'" % sender 1306 1307 xml = u""" 1308 <presence to='%s'%s%s> 1309 <x xmlns='http://jabber.org/protocol/muc#user'> 1310 <item affiliation='member' role='participant'/> 1311 </x> 1312 </presence> 1313 """ % (self.userJID, sender, available) 1314 1315 self.protocol.userUpdatedStatus = userUpdatedStatus 1316 self.protocol.userJoinedRoom = userJoinedRoom 1317 self.stub.send(parseXml(xml)) 1318 1319 1320 def test_availableReceivedEmptySender(self): 1321 """ 1322 Availability presence from empty sender is ignored. 1323 """ 1324 self._testPresence(sender='') 1325 1326 1327 def test_availableReceivedNotInRoom(self): 1328 """ 1329 Availability presence from unknown entities is ignored. 1330 """ 1331 otherOccupantJID = JID(self.occupantJID.userhost()+'/OtherNick') 1332 self._testPresence(sender=otherOccupantJID) 1333 1334 1335 def test_unavailableReceivedEmptySender(self): 1336 """ 1337 Availability presence from empty sender is ignored. 1338 """ 1339 self._testPresence(sender='', available=False) 1340 1341 1342 def test_unavailableReceivedNotInRoom(self): 1343 """ 1344 Availability presence from unknown entities is ignored. 1345 """ 1346 otherOccupantJID = JID(self.occupantJID.userhost()+'/OtherNick') 1347 self._testPresence(sender=otherOccupantJID, available=False) 1348 1349 1350 def test_unavailableReceivedNotInRoster(self): 1351 """ 1352 Availability presence from unknown entities is ignored. 1353 """ 1354 room = self._createRoom() 1355 user = muc.User(self.nick) 1356 room.addUser(user) 1357 otherOccupantJID = JID(self.occupantJID.userhost()+'/OtherNick') 1358 self._testPresence(sender=otherOccupantJID, available=False) 1133 1359 1134 1360 … … 1149 1375 1150 1376 def userJoinedRoom(room, user): 1151 self.assertEquals(self.room Identifier, room.roomIdentifier,1377 self.assertEquals(self.roomJID, room.roomJID, 1152 1378 'Wrong room name') 1153 1379 self.assertTrue(room.inRoster(user), 'User not in roster') … … 1177 1403 def receivedSubject(room, user, subject): 1178 1404 self.assertEquals('test', subject, "Wrong group chat message") 1179 self.assertEquals(self.room Identifier, room.roomIdentifier,1405 self.assertEquals(self.roomJID, room.roomJID, 1180 1406 'Wrong room name') 1181 1407 self.assertEquals(self.nick, user.nick) … … 1184 1410 self.stub.send(parseXml(xml)) 1185 1411 return d 1412 1413 1414 def test_receivedSubjectNotOverridden(self): 1415 """ 1416 Not overriding receivedSubject is ok. 1417 """ 1418 xml = u""" 1419 <message to='%s' from='%s' type='groupchat'> 1420 <subject>test</subject> 1421 </message> 1422 """ % (self.userJID, self.occupantJID) 1423 1424 self._createRoom() 1425 self.stub.send(parseXml(xml)) 1186 1426 1187 1427 … … 1200 1440 def receivedGroupChat(room, user, message): 1201 1441 self.assertEquals('test', message.body, "Wrong group chat message") 1202 self.assertEquals(self.room Identifier, room.roomIdentifier,1442 self.assertEquals(self.roomJID, room.roomJID, 1203 1443 'Wrong room name') 1204 1444 … … 1228 1468 1229 1469 1470 def test_receivedGroupChatNotInRoom(self): 1471 """ 1472 Messages received from a room we're not in are ignored. 1473 """ 1474 xml = u""" 1475 <message to='test@test.com' from='%s' type='groupchat'> 1476 <body>test</body> 1477 </message> 1478 """ % (self.occupantJID) 1479 1480 def receivedGroupChat(room, user, message): 1481 self.fail("Unexpected call to receivedGroupChat") 1482 1483 self.protocol.receivedGroupChat = receivedGroupChat 1484 self.stub.send(parseXml(xml)) 1485 1486 1487 def test_receivedGroupChatNotOverridden(self): 1488 """ 1489 Not overriding receivedGroupChat is ok. 1490 """ 1491 xml = u""" 1492 <message to='test@test.com' from='%s' type='groupchat'> 1493 <body>test</body> 1494 </message> 1495 """ % (self.occupantJID) 1496 1497 self._createRoom() 1498 self.stub.send(parseXml(xml)) 1499 1500 1230 1501 def test_join(self): 1231 1502 """ … … 1234 1505 1235 1506 def cb(room): 1236 self.assertEquals(self.roomIdentifier, room.roomIdentifier) 1507 self.assertEqual(self.roomJID, room.roomJID) 1508 self.assertTrue('joined', room.state) 1237 1509 1238 1510 d = self.protocol.join(self.roomJID, self.nick) … … 1251 1523 1252 1524 1525 def test_joinForbidden(self): 1526 """ 1527 A forbidden error in response to a join errbacks with L{StanzaError}. 1528 """ 1529 1530 def cb(error): 1531 self.assertEquals('forbidden', error.condition, 1532 'Wrong muc condition') 1533 self.assertIdentical(None, self.protocol._getRoom(self.roomJID)) 1534 1535 1536 d = self.protocol.join(self.roomJID, self.nick) 1537 self.assertFailure(d, StanzaError) 1538 d.addCallback(cb) 1539 1540 # send back error, forbidden 1541 xml = u""" 1542 <presence from='%s' type='error'> 1543 <error type='auth'> 1544 <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> 1545 </error> 1546 </presence> 1547 """ % (self.occupantJID) 1548 self.stub.send(parseXml(xml)) 1549 return d 1550 1551 1253 1552 def test_userLeftRoom(self): 1254 1553 """ … … 1269 1568 1270 1569 def userLeftRoom(room, user): 1271 self.assertEquals(self.room Identifier, room.roomIdentifier,1570 self.assertEquals(self.roomJID, room.roomJID, 1272 1571 'Wrong room name') 1273 1572 self.assertFalse(room.inRoster(user), 'User in roster') … … 1304 1603 1305 1604 1306 def test_nick(self): 1307 """ 1308 Send a nick change to the server. 1309 """ 1310 newNick = 'newNick' 1605 def test_receivedHistoryNotOverridden(self): 1606 """ 1607 Not overriding receivedHistory is ok. 1608 """ 1609 xml = u""" 1610 <message to='test@test.com' from='%s' type='groupchat'> 1611 <body>test</body> 1612 <delay xmlns='urn:xmpp:delay' stamp="2002-10-13T23:58:37Z" 1613 from="%s"/> 1614 </message> 1615 """ % (self.occupantJID, self.userJID) 1311 1616 1312 1617 self._createRoom() 1313 1314 def cb(room): 1315 self.assertEquals(self.roomIdentifier, room.roomIdentifier) 1316 self.assertEquals(newNick, room.nick) 1317 1318 d = self.protocol.nick(self.roomJID, newNick) 1319 d.addCallback(cb) 1320 1321 # send back user presence, nick changed 1618 self.stub.send(parseXml(xml)) 1619 1620 1621 def test_nickConflict(self): 1622 """ 1623 If the server finds the new nick in conflict, the errback is called. 1624 """ 1625 1626 def cb(failure, room): 1627 user = room.getUser(otherNick) 1628 self.assertNotIdentical(None, user) 1629 self.assertEqual(otherJID, user.entity) 1630 1631 def joined(room): 1632 d = self.protocol.nick(room.roomJID, otherNick) 1633 self.assertFailure(d, StanzaError) 1634 d.addCallback(cb, room) 1635 1636 otherJID = JID('other@example.org/Home') 1637 otherNick = 'otherNick' 1638 1639 d = self.protocol.join(self.roomJID, self.nick) 1640 d.addCallback(joined) 1641 1642 # Send back other partipant's presence. 1643 xml = u""" 1644 <presence from='%s/%s'> 1645 <x xmlns='http://jabber.org/protocol/muc#user'> 1646 <item affiliation='member' role='participant' jid='%s'/> 1647 </x> 1648 </presence> 1649 """ % (self.roomJID, otherNick, otherJID) 1650 self.stub.send(parseXml(xml)) 1651 1652 # send back user presence, they joined 1322 1653 xml = u""" 1323 1654 <presence from='%s/%s'> … … 1326 1657 </x> 1327 1658 </presence> 1659 """ % (self.roomJID, self.nick) 1660 self.stub.send(parseXml(xml)) 1661 1662 room = self.protocol._getRoom(self.roomJID) 1663 1664 # send back error presence, nick conflicted 1665 xml = u""" 1666 <presence from='%s/%s' type='error'> 1667 <x xmlns='http://jabber.org/protocol/muc'/> 1668 <error type='cancel'> 1669 <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> 1670 </error> 1671 </presence> 1672 """ % (self.roomJID, otherNick) 1673 self.stub.send(parseXml(xml)) 1674 return d 1675 1676 1677 def test_nick(self): 1678 """ 1679 Send a nick change to the server. 1680 """ 1681 newNick = 'newNick' 1682 1683 room = self._createRoom() 1684 1685 def joined(room): 1686 self.assertEqual(self.roomJID, room.roomJID) 1687 self.assertEqual(newNick, room.nick) 1688 user = room.getUser(newNick) 1689 self.assertNotIdentical(None, user) 1690 self.assertEqual(newNick, user.nick) 1691 1692 d = self.protocol.nick(self.roomJID, newNick) 1693 d.addCallback(joined) 1694 1695 # Nick should not have been changed, yet, as we haven't gotten 1696 # confirmation, yet. 1697 1698 self.assertEquals(self.nick, room.nick) 1699 1700 # send back user presence, nick changed 1701 xml = u""" 1702 <presence from='%s/%s'> 1703 <x xmlns='http://jabber.org/protocol/muc#user'> 1704 <item affiliation='member' role='participant'/> 1705 </x> 1706 </presence> 1328 1707 """ % (self.roomJID, newNick) 1329 self.stub.send(parseXml(xml)) 1708 1709 self.stub.send(parseXml(xml)) 1710 return d 1711 1712 1713 def test_leave(self): 1714 """ 1715 Client leaves a room 1716 """ 1717 def joined(_): 1718 return self.protocol.leave(self.roomJID) 1719 1720 def left(_): 1721 self.assertIdentical(None, self.protocol._getRoom(self.roomJID)) 1722 1723 # Join the room 1724 d = self.protocol.join(self.roomJID, self.nick) 1725 d.addCallback(joined) 1726 d.addCallback(left) 1727 1728 # Receive presence back from the room: joined. 1729 xml = u""" 1730 <presence to='%s' from='%s'/> 1731 """ % (self.userJID, self.occupantJID) 1732 self.stub.send(parseXml(xml)) 1733 1734 # Receive presence back from the room: left. 1735 xml = u""" 1736 <presence to='%s' from='%s' type='unavailable'/> 1737 """ % (self.userJID, self.occupantJID) 1738 self.stub.send(parseXml(xml)) 1739 1330 1740 return d 1331 1741 … … 1341 1751 1342 1752 def statusChanged(room): 1343 self.assertEqual s(self.roomIdentifier, room.roomIdentifier)1753 self.assertEqual(self.roomJID, room.roomJID) 1344 1754 user = room.getUser(self.nick) 1345 1755 self.assertNotIdentical(None, user, 'User not found') 1346 self.assertEqual s('testing MUC', user.status, 'Wrong status')1347 self.assertEqual s('xa', user.show, 'Wrong show')1756 self.assertEqual('testing MUC', user.status, 'Wrong status') 1757 self.assertEqual('xa', user.show, 'Wrong show') 1348 1758 1349 1759 # Join the room … … 1367 1777 </presence> 1368 1778 """ % self.occupantJID 1369 self.stub.send(parseXml(xml)) 1370 1371 return d 1779 1780 self.stub.send(parseXml(xml)) 1781 return d 1782 1783 1784 def test_destroy(self): 1785 """ 1786 Destroy a room. 1787 """ 1788 def destroyed(_): 1789 self.assertIdentical(None, self.protocol._getRoom(self.roomJID)) 1790 1791 d = self.protocol.destroy(self.occupantJID, reason='Time to leave', 1792 alternate=JID('other@%s' % self.service), 1793 password='secret') 1794 d.addCallback(destroyed) 1795 1796 iq = self.stub.output[-1] 1797 response = toResponse(iq, 'result') 1798 self.stub.send(response) 1799 return d
Note: See TracChangeset
for help on using the changeset viewer.