| 1495 | eq_(m4.mock_calls, [call("z")]) |
| 1496 | |
| 1497 | def test_once_unless_exception(self): |
| 1498 | Target = self._fixture() |
| 1499 | |
| 1500 | m1 = Mock() |
| 1501 | m2 = Mock() |
| 1502 | m3 = Mock() |
| 1503 | m4 = Mock() |
| 1504 | |
| 1505 | m1.side_effect = ValueError |
| 1506 | m2.side_effect = ValueError |
| 1507 | m3.side_effect = ValueError |
| 1508 | |
| 1509 | event.listen(Target, "event_one", m1) |
| 1510 | event.listen(Target, "event_one", m2, _once_unless_exception=True) |
| 1511 | event.listen(Target, "event_one", m3, _once_unless_exception=True) |
| 1512 | |
| 1513 | t1 = Target() |
| 1514 | |
| 1515 | # only m1 is called, raises |
| 1516 | assert_raises(ValueError, t1.dispatch.event_one, "x") |
| 1517 | |
| 1518 | # now m1 and m2 can be called but not m3 |
| 1519 | m1.side_effect = None |
| 1520 | |
| 1521 | assert_raises(ValueError, t1.dispatch.event_one, "y") |
| 1522 | |
| 1523 | # now m3 can be called |
| 1524 | m2.side_effect = None |
| 1525 | |
| 1526 | event.listen(Target, "event_one", m4, _once_unless_exception=True) |
| 1527 | assert_raises(ValueError, t1.dispatch.event_one, "z") |
| 1528 | |
| 1529 | assert_raises(ValueError, t1.dispatch.event_one, "q") |
| 1530 | |
| 1531 | eq_(m1.mock_calls, [call("x"), call("y"), call("z"), call("q")]) |
| 1532 | eq_(m2.mock_calls, [call("y"), call("z")]) |
| 1533 | eq_(m3.mock_calls, [call("z"), call("q")]) |
| 1534 | eq_(m4.mock_calls, []) # m4 never got called because m3 blocked it |
| 1535 | |
| 1536 | # now m4 can be called |
| 1537 | m3.side_effect = None |
| 1538 | |
| 1539 | t1.dispatch.event_one("p") |
| 1540 | eq_( |
| 1541 | m1.mock_calls, |
| 1542 | [call("x"), call("y"), call("z"), call("q"), call("p")], |
| 1543 | ) |
| 1544 | |
| 1545 | # m2 already got called, so no "p" |
| 1546 | eq_(m2.mock_calls, [call("y"), call("z")]) |
| 1547 | eq_(m3.mock_calls, [call("z"), call("q"), call("p")]) |
| 1548 | eq_(m4.mock_calls, [call("p")]) |
| 1549 | |
| 1550 | t1.dispatch.event_one("j") |
| 1551 | eq_( |
| 1552 | m1.mock_calls, |
| 1553 | [call("x"), call("y"), call("z"), call("q"), call("p"), call("j")], |
| 1554 | ) |