@@ -249,7 +249,7 @@ def test_create_or_update_external_course_page( # noqa: PLR0913, C901
249249 if not has_language :
250250 external_course_data .pop ("language" )
251251
252- external_course_page , course_page_created , course_page_updated = (
252+ external_course_page , course_page_created , course_page_updated , _ = (
253253 create_or_update_external_course_page (
254254 course_index_page ,
255255 course ,
@@ -908,9 +908,13 @@ def test_save_page_revision(is_draft_page, has_unpublished_changes):
908908
909909 latest_revision = external_course_page .get_latest_revision_as_object ()
910910 latest_revision .external_marketing_url = "https://test-external-course-sync-api.io/Internet-of-things-iot-design-and-applications"
911- save_page_revision (external_course_page , latest_revision )
911+ # The revision is published only when the page had no unpublished changes
912+ # before saving; otherwise it is kept as a draft.
913+ expected_draft = external_course_page .has_unpublished_changes
914+ published = save_page_revision (external_course_page , latest_revision )
912915
913916 assert external_course_page .live == (not is_draft_page )
917+ assert published is (not expected_draft )
914918
915919 if has_unpublished_changes :
916920 assert external_course_page .has_unpublished_changes
@@ -1214,13 +1218,16 @@ def test_create_or_update_external_course_page_field_override(
12141218
12151219 keymap = get_keymap (external_course_data ["course_run_code" ])
12161220
1217- external_course_page , course_page_created , course_page_updated = (
1218- create_or_update_external_course_page (
1219- course_index_page ,
1220- course ,
1221- ExternalCourse (external_course_data , keymap = keymap ),
1222- keymap = keymap ,
1223- )
1221+ (
1222+ external_course_page ,
1223+ course_page_created ,
1224+ course_page_updated ,
1225+ course_page_published ,
1226+ ) = create_or_update_external_course_page (
1227+ course_index_page ,
1228+ course ,
1229+ ExternalCourse (external_course_data , keymap = keymap ),
1230+ keymap = keymap ,
12241231 )
12251232
12261233 latest_revision = external_course_page .get_latest_revision_as_object ()
@@ -1231,6 +1238,8 @@ def test_create_or_update_external_course_page_field_override(
12311238 )
12321239 assert course_page_updated is True
12331240 assert course_page_created is False
1241+ # The page has no unpublished changes here, so the update is published.
1242+ assert course_page_published is True
12341243
12351244 # Check if fields were overridden based on whether they had existing values
12361245 if expected_fields_overridden :
@@ -1255,3 +1264,55 @@ def test_create_or_update_external_course_page_field_override(
12551264 assert latest_revision .description == existing_description
12561265 assert latest_revision .background_image == existing_image
12571266 assert latest_revision .thumbnail_image == existing_image
1267+
1268+
1269+ @pytest .mark .parametrize (
1270+ "external_course_data" ,
1271+ [{"platform" : EMERITUS_PLATFORM_NAME }],
1272+ indirect = True ,
1273+ )
1274+ @pytest .mark .django_db
1275+ def test_create_or_update_external_course_page_kept_as_draft (external_course_data ):
1276+ """
1277+ Test that when a course page already has unpublished (manual) changes, an API
1278+ update is saved as a draft and NOT published, and `is_published` is returned as False.
1279+ """
1280+ home_page = HomePageFactory .create (title = "Home Page" , subhead = "<p>subhead</p>" )
1281+ course_index_page = CourseIndexPageFactory .create (parent = home_page , title = "Courses" )
1282+ course = CourseFactory .create (is_external = True , page = None )
1283+ ImageFactory .create (title = external_course_data ["image_name" ])
1284+
1285+ external_course_page = ExternalCoursePageFactory .create (
1286+ parent = course_index_page ,
1287+ course = course ,
1288+ title = external_course_data ["program_name" ],
1289+ external_marketing_url = "https://old-url.com" ,
1290+ )
1291+ # Publish a baseline revision, then leave an unpublished (draft) manual change on top.
1292+ external_course_page .save_revision ().publish ()
1293+ external_course_page .refresh_from_db ()
1294+ external_course_page .title = "Manually edited title"
1295+ external_course_page .save_revision () # draft, not published
1296+ external_course_page .refresh_from_db ()
1297+ assert external_course_page .has_unpublished_changes
1298+
1299+ keymap = get_keymap (external_course_data ["course_run_code" ])
1300+
1301+ _ , course_page_created , course_page_updated , course_page_published = (
1302+ create_or_update_external_course_page (
1303+ course_index_page ,
1304+ course ,
1305+ ExternalCourse (external_course_data , keymap = keymap ),
1306+ keymap = keymap ,
1307+ )
1308+ )
1309+
1310+ assert course_page_created is False
1311+ assert course_page_updated is True
1312+ # The page had unpublished changes, so the API update is kept as a draft.
1313+ assert course_page_published is False
1314+
1315+ external_course_page .refresh_from_db ()
1316+ # The live (published) version still has the old marketing URL.
1317+ assert external_course_page .external_marketing_url == "https://old-url.com"
1318+ assert external_course_page .has_unpublished_changes
0 commit comments