|
3 | 3 | """ |
4 | 4 |
|
5 | 5 | from datetime import datetime, timezone |
| 6 | +from typing import Any |
6 | 7 |
|
7 | 8 | import pytest |
8 | | -from django.db import transaction |
9 | 9 |
|
10 | 10 | from openedx_content import api |
11 | | -from tests.utils import capture_events |
| 11 | +from tests.utils import abort_transaction, capture_events |
12 | 12 |
|
13 | 13 | pytestmark = pytest.mark.django_db(transaction=True) |
14 | 14 | now_time = datetime.now(tz=timezone.utc) |
@@ -64,14 +64,10 @@ def test_single_entity_changed_abort() -> None: |
64 | 64 | entity = api.create_publishable_entity(learning_package.id, key="entity1", created=now_time, created_by=None) |
65 | 65 |
|
66 | 66 | with capture_events(expected_count=0): |
67 | | - try: |
68 | | - with transaction.atomic(): |
69 | | - api.create_publishable_entity_version( |
70 | | - entity.id, version_num=1, title="Entity 1 V1", created=now_time, created_by=None |
71 | | - ) |
72 | | - raise DeliberateRollbackException() |
73 | | - except DeliberateRollbackException: |
74 | | - pass |
| 67 | + with abort_transaction(): |
| 68 | + api.create_publishable_entity_version( |
| 69 | + entity.id, version_num=1, title="Entity 1 V1", created=now_time, created_by=None |
| 70 | + ) |
75 | 71 |
|
76 | 72 |
|
77 | 73 | def test_multiple_entites_changed(admin_user) -> None: |
@@ -121,3 +117,33 @@ def test_multiple_entites_changed(admin_user) -> None: |
121 | 117 | api.signals.ChangeLogRecordData(entity_id=entity3.id, old_version=1, new_version=None), |
122 | 118 | ] |
123 | 119 | assert event.kwargs["metadata"].time == now_time |
| 120 | + |
| 121 | + |
| 122 | +def test_multiple_entites_change_aborted() -> None: |
| 123 | + """ |
| 124 | + Test that LEARNING_PACKAGE_ENTITIES_CHANGED is NOT emitted when we roll back |
| 125 | + a transaction that would have modified multiple entities in a bulk change. |
| 126 | + """ |
| 127 | + learning_package = api.create_learning_package(key="lp1", title="Test LP 📦") |
| 128 | + created_args: dict[str, Any] = {"created": now_time, "created_by": None} |
| 129 | + |
| 130 | + # Entity 1 will have no initial version: |
| 131 | + entity1 = api.create_publishable_entity(learning_package.id, key="entity1", **created_args) |
| 132 | + # Entity 2 will have an initial version: |
| 133 | + entity2 = api.create_publishable_entity(learning_package.id, key="entity2", **created_args) |
| 134 | + api.create_publishable_entity_version(entity2.id, version_num=1, title="Entity 2 V1", **created_args) |
| 135 | + # Entity 3 will have an initial version that later gets deleted: |
| 136 | + entity3 = api.create_publishable_entity(learning_package.id, key="entity3", **created_args) |
| 137 | + api.create_publishable_entity_version(entity3.id, version_num=1, title="Entity 3 V1", **created_args) |
| 138 | + |
| 139 | + with capture_events(expected_count=0): |
| 140 | + with abort_transaction(): |
| 141 | + with api.bulk_draft_changes_for(learning_package.id, changed_by=None, changed_at=now_time): |
| 142 | + # Note: the 'created_args' values below get ignored because of the bulk context. |
| 143 | + # Create two versions of entity1: |
| 144 | + api.create_publishable_entity_version(entity1.id, version_num=1, title="Entity 1 V1", **created_args) |
| 145 | + api.create_publishable_entity_version(entity1.id, version_num=2, title="Entity 1 V2", **created_args) |
| 146 | + # Create a version 2 of entity 2: |
| 147 | + api.create_publishable_entity_version(entity2.id, version_num=2, title="Entity 2 V2", **created_args) |
| 148 | + # Delete entity 3: |
| 149 | + api.set_draft_version(entity3.id, None, set_at=now_time, set_by=None) |
0 commit comments