(
self, delete_cascade_configured, user_address_fixture
)
| 1464 | |
| 1465 | @testing.combinations(True, False, argnames="delete_cascade_configured") |
| 1466 | def test_delete_cascade( |
| 1467 | self, delete_cascade_configured, user_address_fixture |
| 1468 | ): |
| 1469 | addresses = self.tables.addresses |
| 1470 | User, Address = user_address_fixture( |
| 1471 | addresses_args={ |
| 1472 | "order_by": addresses.c.id, |
| 1473 | "backref": "user", |
| 1474 | "cascade": ( |
| 1475 | "save-update" |
| 1476 | if not delete_cascade_configured |
| 1477 | else "all, delete" |
| 1478 | ), |
| 1479 | } |
| 1480 | ) |
| 1481 | |
| 1482 | sess = fixture_session( |
| 1483 | autoflush=True, |
| 1484 | ) |
| 1485 | u = User(name="ed") |
| 1486 | u.addresses.add_all( |
| 1487 | [Address(email_address=letter) for letter in "abcdef"] |
| 1488 | ) |
| 1489 | sess.add(u) |
| 1490 | sess.commit() |
| 1491 | |
| 1492 | from sqlalchemy import case |
| 1493 | |
| 1494 | # the byzantine syntax here is so the query works on MSSQL |
| 1495 | isnull_stmt = select( |
| 1496 | case((addresses.c.user_id == None, True), else_=False), |
| 1497 | func.count("*"), |
| 1498 | ).group_by( |
| 1499 | case((addresses.c.user_id == None, True), else_=False), |
| 1500 | addresses.c.user_id, |
| 1501 | ) |
| 1502 | |
| 1503 | eq_( |
| 1504 | {isnull: count for isnull, count in sess.execute(isnull_stmt)}, |
| 1505 | {False: 6}, |
| 1506 | ) |
| 1507 | |
| 1508 | sess.delete(u) |
| 1509 | |
| 1510 | sess.commit() |
| 1511 | |
| 1512 | if not delete_cascade_configured: |
| 1513 | eq_( |
| 1514 | {isnull: count for isnull, count in sess.execute(isnull_stmt)}, |
| 1515 | {True: 6}, |
| 1516 | ) |
| 1517 | else: |
| 1518 | eq_( |
| 1519 | sess.connection() |
| 1520 | .execute(select(func.count("*")).select_from(addresses)) |
| 1521 | .scalar(), |
| 1522 | 0, |
| 1523 | ) |
nothing calls this directly
no test coverage detected