From 982c222717700a3bdb117f33ecb0d83d212e2e98 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Mar 2026 14:51:11 +0000 Subject: [PATCH] test: improve test coverage for app/tasks/upload_to_icloud.py to 100% Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> Agent-Logs-Url: https://github.com/christianlouis/DocuElevate/sessions/7d047aa6-a27a-47aa-a75b-4d31440af584 --- tests/test_upload_to_icloud.py | 189 +++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/tests/test_upload_to_icloud.py b/tests/test_upload_to_icloud.py index 72e1e804..804fd1f3 100644 --- a/tests/test_upload_to_icloud.py +++ b/tests/test_upload_to_icloud.py @@ -203,3 +203,192 @@ class TestUploadIcloudHandler: assert result["status"] == "Completed" assert result["icloud_folder"] == "/" mock_api.drive.upload.assert_called_once() + + +# --------------------------------------------------------------------------- +# upload_to_icloud Celery task +# --------------------------------------------------------------------------- + + +@pytest.mark.unit +class TestUploadToIcloudTask: + """Tests for the upload_to_icloud Celery task.""" + + @patch("app.tasks.upload_to_icloud.log_task_progress") + def test_raises_file_not_found(self, mock_log): + """Task raises FileNotFoundError when the file does not exist.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + upload_to_icloud.request.id = TASK_ID + with pytest.raises(FileNotFoundError, match="File not found"): + upload_to_icloud.__wrapped__(file_path="/nonexistent/file.pdf") + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_raises_when_credentials_not_configured(self, mock_settings, mock_log, tmp_path): + """Task raises ValueError when iCloud credentials are absent.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = None + mock_settings.icloud_password = None + + fp = str(tmp_path / "doc.pdf") + _write_file(fp) + + upload_to_icloud.request.id = TASK_ID + with pytest.raises(ValueError, match="iCloud credentials are not configured"): + upload_to_icloud.__wrapped__(file_path=fp) + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_raises_when_password_not_configured(self, mock_settings, mock_log, tmp_path): + """Task raises ValueError when iCloud password is absent.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = "user@example.com" + mock_settings.icloud_password = None + + fp = str(tmp_path / "doc.pdf") + _write_file(fp) + + upload_to_icloud.request.id = TASK_ID + with pytest.raises(ValueError, match="iCloud credentials are not configured"): + upload_to_icloud.__wrapped__(file_path=fp) + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_successful_upload_with_folder(self, mock_settings, mock_log, tmp_path): + """Task uploads to the configured folder and returns success dict.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = "user@example.com" + mock_settings.icloud_password = "secret" # noqa: S105 + mock_settings.icloud_folder = "Documents" + mock_settings.icloud_cookie_directory = None + + fp = str(tmp_path / "report.pdf") + _write_file(fp) + + mock_api = MagicMock() + mock_api.requires_2sa = False + mock_api.requires_2fa = False + + mock_folder = MagicMock() + mock_api.drive.dir.return_value = [] + mock_api.drive.mkdir.return_value = mock_folder + + upload_to_icloud.request.id = TASK_ID + with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}): + result = upload_to_icloud.__wrapped__(file_path=fp, file_id=42) + + assert result["status"] == "Completed" + assert result["file"] == fp + assert result["icloud_folder"] == "Documents" + mock_folder.upload.assert_called_once() + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_successful_upload_to_root_when_no_folder_configured(self, mock_settings, mock_log, tmp_path): + """Task uploads to iCloud Drive root when ICLOUD_FOLDER is empty.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = "user@example.com" + mock_settings.icloud_password = "secret" # noqa: S105 + mock_settings.icloud_folder = "" + mock_settings.icloud_cookie_directory = None + + fp = str(tmp_path / "doc.pdf") + _write_file(fp) + + mock_api = MagicMock() + mock_api.requires_2sa = False + mock_api.requires_2fa = False + + upload_to_icloud.request.id = TASK_ID + with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}): + result = upload_to_icloud.__wrapped__(file_path=fp) + + assert result["status"] == "Completed" + assert result["icloud_folder"] == "/" + mock_api.drive.upload.assert_called_once() + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_folder_override_takes_precedence_over_settings(self, mock_settings, mock_log, tmp_path): + """folder_override replaces the value from settings.icloud_folder.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = "user@example.com" + mock_settings.icloud_password = "secret" # noqa: S105 + mock_settings.icloud_folder = "DefaultFolder" + mock_settings.icloud_cookie_directory = None + + fp = str(tmp_path / "doc.pdf") + _write_file(fp) + + mock_api = MagicMock() + mock_api.requires_2sa = False + mock_api.requires_2fa = False + + mock_folder = MagicMock() + mock_api.drive.dir.return_value = [] + mock_api.drive.mkdir.return_value = mock_folder + + upload_to_icloud.request.id = TASK_ID + with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}): + result = upload_to_icloud.__wrapped__(file_path=fp, folder_override="OverrideFolder") + + assert result["icloud_folder"] == "OverrideFolder" + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_exception_during_upload_raises_runtime_error(self, mock_settings, mock_log, tmp_path): + """Any exception from pyicloud is wrapped in RuntimeError.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = "user@example.com" + mock_settings.icloud_password = "secret" # noqa: S105 + mock_settings.icloud_folder = "" + mock_settings.icloud_cookie_directory = None + + fp = str(tmp_path / "doc.pdf") + _write_file(fp) + + mock_api = MagicMock() + mock_api.requires_2sa = False + mock_api.requires_2fa = False + mock_api.drive.upload.side_effect = OSError("disk full") + + upload_to_icloud.request.id = TASK_ID + with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}): + with pytest.raises(RuntimeError, match="Error uploading"): + upload_to_icloud.__wrapped__(file_path=fp) + + @patch("app.tasks.upload_to_icloud.log_task_progress") + @patch("app.tasks.upload_to_icloud.settings") + def test_cookie_directory_passed_to_api(self, mock_settings, mock_log, tmp_path): + """Task forwards icloud_cookie_directory to _get_icloud_api.""" + from app.tasks.upload_to_icloud import upload_to_icloud + + mock_settings.icloud_username = "user@example.com" + mock_settings.icloud_password = "secret" # noqa: S105 + mock_settings.icloud_folder = "" + mock_settings.icloud_cookie_directory = "/tmp/icloud_cookies" + + fp = str(tmp_path / "doc.pdf") + _write_file(fp) + + mock_api = MagicMock() + mock_api.requires_2sa = False + mock_api.requires_2fa = False + mock_mod = _mock_pyicloud_module(mock_api) + + upload_to_icloud.request.id = TASK_ID + with patch.dict("sys.modules", {"pyicloud": mock_mod}): + upload_to_icloud.__wrapped__(file_path=fp) + + mock_mod.PyiCloudService.assert_called_once_with( + "user@example.com", + "secret", + cookie_directory="/tmp/icloud_cookies", + )