|
13 | 13 | pytestmark = pytest.mark.django_db(transaction=True) |
14 | 14 | now_time = datetime.now(tz=timezone.utc) |
15 | 15 |
|
16 | | - |
17 | | -class DeliberateRollbackException(Exception): |
18 | | - """Exception used to deliberately cancel and roll back a DB transaction""" |
| 16 | +# LEARNING_PACKAGE_ENTITIES_CHANGED |
19 | 17 |
|
20 | 18 |
|
21 | 19 | def test_single_entity_changed() -> None: |
@@ -147,3 +145,104 @@ def test_multiple_entites_change_aborted() -> None: |
147 | 145 | api.create_publishable_entity_version(entity2.id, version_num=2, title="Entity 2 V2", **created_args) |
148 | 146 | # Delete entity 3: |
149 | 147 | api.set_draft_version(entity3.id, None, set_at=now_time, set_by=None) |
| 148 | + |
| 149 | + |
| 150 | +# LEARNING_PACKAGE_ENTITIES_PUBLISHED |
| 151 | + |
| 152 | + |
| 153 | +def test_publish_events(admin_user) -> None: |
| 154 | + """ |
| 155 | + Test that LEARNING_PACKAGE_ENTITIES_PUBLISHED is emitted when we publish |
| 156 | + changes to entities in a learning package. |
| 157 | + """ |
| 158 | + learning_package = api.create_learning_package(key="lp1", title="Test LP 📦") |
| 159 | + created_args = {"created": now_time, "created_by": admin_user.id} |
| 160 | + |
| 161 | + # Entity 1 will have no initial version: |
| 162 | + entity1 = api.create_publishable_entity(learning_package.id, key="entity1", **created_args) |
| 163 | + # Entity 2 will have an initial version with some changes: |
| 164 | + entity2 = api.create_publishable_entity(learning_package.id, key="entity2", **created_args) |
| 165 | + api.create_publishable_entity_version(entity2.id, version_num=1, title="Entity 2 V1", **created_args) |
| 166 | + api.create_publishable_entity_version(entity2.id, version_num=2, title="Entity 2 V2", **created_args) |
| 167 | + # Entity 3 will have an initial version that later gets deleted: |
| 168 | + entity3 = api.create_publishable_entity(learning_package.id, key="entity3", **created_args) |
| 169 | + api.create_publishable_entity_version(entity3.id, version_num=1, title="Entity 3 V1", **created_args) |
| 170 | + |
| 171 | + # Publish these initial changes: |
| 172 | + first_publish_time = datetime.now(tz=timezone.utc) |
| 173 | + with capture_events(expected_count=1) as captured: |
| 174 | + first_log = api.publish_all_drafts( |
| 175 | + learning_package.id, published_at=first_publish_time, published_by=admin_user.id |
| 176 | + ) |
| 177 | + |
| 178 | + event = captured[0] |
| 179 | + assert event.signal is api.signals.LEARNING_PACKAGE_ENTITIES_PUBLISHED |
| 180 | + assert event.kwargs["learning_package"].id == learning_package.id |
| 181 | + assert event.kwargs["learning_package"].title == "Test LP 📦" |
| 182 | + assert event.kwargs["changed_by"].user_id is admin_user.id |
| 183 | + assert event.kwargs["change_log"].publish_log_id == first_log.id |
| 184 | + assert event.kwargs["change_log"].changes == [ |
| 185 | + # Entity 1 is not yet published, since it has no draft version. |
| 186 | + # Entity 2 is newly published, and now at v2: |
| 187 | + api.signals.ChangeLogRecordData(entity_id=entity2.id, old_version=None, new_version=2), |
| 188 | + # Entity 3 is newly published, and now at v1: |
| 189 | + api.signals.ChangeLogRecordData(entity_id=entity3.id, old_version=None, new_version=1), |
| 190 | + ] |
| 191 | + assert event.kwargs["metadata"].time == first_publish_time |
| 192 | + |
| 193 | + # Now modify the entities again: |
| 194 | + # Create a version of entity1: |
| 195 | + api.create_publishable_entity_version(entity1.id, version_num=1, title="Entity 1 V1", **created_args) |
| 196 | + # Create a version 3 of entity2: |
| 197 | + api.create_publishable_entity_version(entity2.id, version_num=3, title="Entity 2 V3", **created_args) |
| 198 | + # Delete entity 3: |
| 199 | + api.set_draft_version(entity3.id, None, set_at=now_time, set_by=admin_user.id) |
| 200 | + |
| 201 | + # Publish these new changes: |
| 202 | + second_publish_time = datetime.now(tz=timezone.utc) |
| 203 | + with capture_events(expected_count=1) as captured: |
| 204 | + second_log = api.publish_all_drafts( |
| 205 | + learning_package.id, published_at=second_publish_time, published_by=admin_user.id |
| 206 | + ) |
| 207 | + |
| 208 | + event = captured[0] |
| 209 | + assert event.signal is api.signals.LEARNING_PACKAGE_ENTITIES_PUBLISHED |
| 210 | + assert event.kwargs["learning_package"].id == learning_package.id |
| 211 | + assert event.kwargs["learning_package"].title == "Test LP 📦" |
| 212 | + assert event.kwargs["changed_by"].user_id is admin_user.id |
| 213 | + assert event.kwargs["change_log"].publish_log_id == second_log.id |
| 214 | + assert event.kwargs["change_log"].changes == [ |
| 215 | + # Entity 1 is newly published at v1: |
| 216 | + api.signals.ChangeLogRecordData(entity_id=entity1.id, old_version=None, new_version=1), |
| 217 | + # Entity 2 jumps v2 -> v3: |
| 218 | + api.signals.ChangeLogRecordData(entity_id=entity2.id, old_version=2, new_version=3), |
| 219 | + # Entity 3 gets deleted: |
| 220 | + api.signals.ChangeLogRecordData(entity_id=entity3.id, old_version=1, new_version=None), |
| 221 | + ] |
| 222 | + assert event.kwargs["metadata"].time == second_publish_time |
| 223 | + |
| 224 | + |
| 225 | +def test_publish_events_aborted(admin_user) -> None: |
| 226 | + """ |
| 227 | + Test that LEARNING_PACKAGE_ENTITIES_PUBLISHED is NOT emitted when we roll |
| 228 | + back a transaction that would have published some entities. |
| 229 | + """ |
| 230 | + learning_package = api.create_learning_package(key="lp1", title="Test LP 📦") |
| 231 | + created_args = {"created": now_time, "created_by": admin_user.id} |
| 232 | + |
| 233 | + # Create an entity with some initial version: |
| 234 | + entity1 = api.create_publishable_entity(learning_package.id, key="entity1", **created_args) |
| 235 | + api.create_publishable_entity_version(entity1.id, version_num=1, title="Entity 1 V1", **created_args) |
| 236 | + |
| 237 | + def do_publish(): |
| 238 | + draft_qset = api.get_all_drafts(learning_package.id).filter(entity=entity1) |
| 239 | + api.publish_from_drafts( |
| 240 | + learning_package.id, draft_qset=draft_qset, published_at=now_time, published_by=admin_user.id |
| 241 | + ) |
| 242 | + |
| 243 | + with capture_events(expected_count=0): |
| 244 | + with abort_transaction(): |
| 245 | + do_publish() |
| 246 | + |
| 247 | + with capture_events(expected_count=1): |
| 248 | + do_publish() |
0 commit comments