|
19 | 19 |
|
20 | 20 | from mock import Mock, MagicMock, ANY |
21 | 21 |
|
22 | | -from cassandra import ConsistencyLevel |
| 22 | +from cassandra import ConsistencyLevel, Unavailable |
23 | 23 | from cassandra.cluster import Session, ResponseFuture, NoHostAvailable |
24 | 24 | from cassandra.connection import Connection, ConnectionException |
25 | 25 | from cassandra.protocol import (ReadTimeoutErrorMessage, WriteTimeoutErrorMessage, |
@@ -366,6 +366,63 @@ def test_errback(self): |
366 | 366 | # this should get called immediately now that the error is set |
367 | 367 | rf.add_errback(self.assertIsInstance, Exception) |
368 | 368 |
|
| 369 | + def test_multiple_callbacks(self): |
| 370 | + session = self.make_session() |
| 371 | + rf = self.make_response_future(session) |
| 372 | + rf.send_request() |
| 373 | + |
| 374 | + callback = Mock() |
| 375 | + expected_result = [{'col': 'val'}] |
| 376 | + arg = "positional" |
| 377 | + kwargs = {'one': 1, 'two': 2} |
| 378 | + rf.add_callback(callback, arg, **kwargs) |
| 379 | + |
| 380 | + callback2 = Mock() |
| 381 | + arg2 = "another" |
| 382 | + kwargs2 = {'three': 3, 'four': 4} |
| 383 | + rf.add_callback(callback2, arg2, **kwargs2) |
| 384 | + |
| 385 | + rf._set_result(self.make_mock_response(expected_result)) |
| 386 | + |
| 387 | + result = rf.result() |
| 388 | + self.assertEqual(result, expected_result) |
| 389 | + |
| 390 | + callback.assert_called_once_with(expected_result, arg, **kwargs) |
| 391 | + callback2.assert_called_once_with(expected_result, arg2, **kwargs2) |
| 392 | + |
| 393 | + def test_multiple_errbacks(self): |
| 394 | + session = self.make_session() |
| 395 | + pool = session._pools.get.return_value |
| 396 | + connection = Mock(spec=Connection) |
| 397 | + pool.borrow_connection.return_value = (connection, 1) |
| 398 | + |
| 399 | + query = SimpleStatement("INSERT INFO foo (a, b) VALUES (1, 2)") |
| 400 | + query.retry_policy = Mock() |
| 401 | + query.retry_policy.on_unavailable.return_value = (RetryPolicy.RETHROW, None) |
| 402 | + message = QueryMessage(query=query, consistency_level=ConsistencyLevel.ONE) |
| 403 | + |
| 404 | + rf = ResponseFuture(session, message, query) |
| 405 | + rf.send_request() |
| 406 | + |
| 407 | + callback = Mock() |
| 408 | + arg = "positional" |
| 409 | + kwargs = {'one': 1, 'two': 2} |
| 410 | + rf.add_errback(callback, arg, **kwargs) |
| 411 | + |
| 412 | + callback2 = Mock() |
| 413 | + arg2 = "another" |
| 414 | + kwargs2 = {'three': 3, 'four': 4} |
| 415 | + rf.add_errback(callback2, arg2, **kwargs2) |
| 416 | + |
| 417 | + expected_exception = Unavailable("message", 1, 2, 3) |
| 418 | + result = Mock(spec=UnavailableErrorMessage, info={'something': 'here'}) |
| 419 | + result.to_exception.return_value = expected_exception |
| 420 | + rf._set_result(result) |
| 421 | + self.assertRaises(Exception, rf.result) |
| 422 | + |
| 423 | + callback.assert_called_once_with(expected_exception, arg, **kwargs) |
| 424 | + callback2.assert_called_once_with(expected_exception, arg2, **kwargs2) |
| 425 | + |
369 | 426 | def test_add_callbacks(self): |
370 | 427 | session = self.make_session() |
371 | 428 | query = SimpleStatement("INSERT INFO foo (a, b) VALUES (1, 2)") |
|
0 commit comments