diff --git a/tests/test_elements_worker/test_worker.py b/tests/test_elements_worker/test_worker.py index f14a633226b9079335c072b5e2788a7510123170..185faac65daa86017dbdbd31fee0cfb49f5a880d 100644 --- a/tests/test_elements_worker/test_worker.py +++ b/tests/test_elements_worker/test_worker.py @@ -14,6 +14,23 @@ TEST_VERSION_ID = "test_123" TEST_SLUG = "some_slug" +def prepare_single_worker_element(responses, monkeypatch, worker): + """ + Mock a worker instance to list and retrieve a single element + """ + monkeypatch.setattr(worker, "list_elements", lambda: ["1234-deadbeef"]) + responses.add( + responses.GET, + "http://testserver/api/v1/element/1234-deadbeef/", + status=200, + json={ + "id": "1234-deadbeef", + "type": "page", + "name": "Test Page n°1", + }, + ) + + def test_get_worker_version(fake_dummy_worker): api_client = fake_dummy_worker.api_client @@ -166,24 +183,7 @@ def test_run( # Disable second configure call from run() monkeypatch.setattr(mock_elements_worker, "configure", lambda: None) - # Mock elements - monkeypatch.setattr( - mock_elements_worker, - "list_elements", - lambda: [ - "1234-deadbeef", - ], - ) - responses.add( - responses.GET, - "http://testserver/api/v1/element/1234-deadbeef/", - status=200, - json={ - "id": "1234-deadbeef", - "type": "page", - "name": "Test Page n°1", - }, - ) + prepare_single_worker_element(responses, monkeypatch, mock_elements_worker) assert mock_elements_worker.is_read_only is False # Mock exception in process_element @@ -230,7 +230,11 @@ def test_run( def test_run_cache( - monkeypatch, mocker, mock_elements_worker_with_cache, mock_cached_elements, mock_activity_calls, + monkeypatch, + mocker, + mock_elements_worker_with_cache, + mock_cached_elements, + mock_activity_calls, ): # Disable second configure call from run() monkeypatch.setattr(mock_elements_worker_with_cache, "configure", lambda: None) @@ -246,3 +250,57 @@ def test_run_cache( mocker.call(elt) for elt in CachedElement.select() ] + + +def test_activity_conflict(monkeypatch, responses, mocker, mock_elements_worker): + # Disable second configure call from run() + monkeypatch.setattr(mock_elements_worker, "configure", lambda: None) + prepare_single_worker_element(responses, monkeypatch, mock_elements_worker) + + # Mock a "normal" conflict during in activity update, which returns the Exception + mock_elements_worker.update_activity = mocker.MagicMock() + mock_elements_worker.update_activity.return_value = ErrorResponse( + title="conflict", + status_code=409, + content="Either this activity does not exists or this state is not allowed.", + ) + from arkindex_worker.worker import logger + + logger.warning = mocker.MagicMock() + + mock_elements_worker.run() + + assert mock_elements_worker.update_activity.call_args_list == [ + mocker.call("1234-deadbeef", ActivityState.Started) + ] + assert logger.warning.call_args_list == [ + mocker.call( + "Cannot start processing element 1234-deadbeef due to a conflict. " + "Another process could have processed it with the same version already." + ) + ] + + +def test_activity_error(monkeypatch, responses, mocker, mock_elements_worker): + # Disable second configure call from run() + monkeypatch.setattr(mock_elements_worker, "configure", lambda: None) + prepare_single_worker_element(responses, monkeypatch, mock_elements_worker) + + # Mock a "normal" conflict during in activity update, which returns the Exception + mock_elements_worker.update_activity = mocker.MagicMock() + mock_elements_worker.update_activity.return_value = Exception( + "A wild Petilil appears !" + ) + from arkindex_worker.worker import logger + + logger.error = mocker.MagicMock() + + with pytest.raises(SystemExit): + mock_elements_worker.run() + + assert mock_elements_worker.update_activity.call_args_list == [ + mocker.call("1234-deadbeef", ActivityState.Started) + ] + assert logger.error.call_args_list == [ + mocker.call("Ran on 1 elements: 0 completed, 1 failed") + ]