diff --git a/external_resources/tasks.py b/external_resources/tasks.py index 0dc8286ac..b9cdfefac 100644 --- a/external_resources/tasks.py +++ b/external_resources/tasks.py @@ -58,20 +58,24 @@ def check_external_resources(resources: list[int]): log.debug(ex) state.status = ExternalResourceState.Status.CHECK_FAILED else: + # Status and flag should be updated if codes are not in ignored cases if ( url_status not in RESOURCE_UNCHECKED_STATUSES or backup_url_status not in RESOURCE_UNCHECKED_STATUSES ): - if is_url_broken and is_backup_url_broken: + is_broken = is_url_broken and ( + backup_url_status is None or is_backup_url_broken + ) + if is_broken: # both external_url and backup_url are broken. state.status = ExternalResourceState.Status.BROKEN else: # Either external_url or backup_url is valid. state.status = ExternalResourceState.Status.VALID - if is_url_broken and not resource.metadata.get("is_broken", False): - resource.metadata["is_broken"] = True - resource.save() + if resource.metadata.get("is_broken") != is_broken: + resource.metadata["is_broken"] = is_broken + resource.save() finally: state.last_checked = timezone.now() diff --git a/external_resources/tasks_test.py b/external_resources/tasks_test.py index d48801bcd..4f31835b6 100644 --- a/external_resources/tasks_test.py +++ b/external_resources/tasks_test.py @@ -10,6 +10,7 @@ HTTP_401_UNAUTHORIZED, ) +from external_resources.constants import RESOURCE_UNCHECKED_STATUSES from external_resources.exceptions import CheckFailedError from external_resources.factories import ExternalResourceStateFactory from external_resources.models import ExternalResourceState @@ -148,7 +149,6 @@ def test_check_external_resources( # noqa: PLR0913 updated_state = ExternalResourceState.objects.get(id=external_resource_state.id) - assert updated_state.status == resource_status assert updated_state.last_checked is not None assert updated_state.is_external_url_broken is url_status @@ -157,7 +157,15 @@ def test_check_external_resources( # noqa: PLR0913 assert updated_state.external_url_response_code == url_status_code assert updated_state.backup_url_response_code == backup_url_status_code - assert updated_state.content.metadata.get("is_broken", False) is url_status + # Status and flag are updated if codes are not in ignored cases + if ( + url_status_code not in RESOURCE_UNCHECKED_STATUSES + or backup_url_status_code not in RESOURCE_UNCHECKED_STATUSES + ): + assert updated_state.status == resource_status + assert updated_state.content.metadata.get("is_broken", False) == ( + url_status and (backup_url_status_code is None or backup_url_status) + ) @pytest.mark.django_db()