diff --git a/tests/test_upload_ftp_additional.py b/tests/test_upload_ftp_additional.py index 86d1225c..d4b71c7b 100644 --- a/tests/test_upload_ftp_additional.py +++ b/tests/test_upload_ftp_additional.py @@ -18,14 +18,18 @@ class TestUploadToFtp: assert callable(upload_to_ftp) + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") @patch("builtins.open", create=True) - def test_uploads_file_with_ftps(self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls): + def test_uploads_file_with_ftps( + self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_basename + ): """Test uploads file using FTPS (FTP with TLS).""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -47,6 +51,7 @@ class TestUploadToFtp: mock_ftp.login.assert_called_once() mock_ftp.prot_p.assert_called_once() + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @@ -54,10 +59,11 @@ class TestUploadToFtp: @patch("app.tasks.upload_to_ftp.settings") @patch("builtins.open", create=True) def test_falls_back_to_plaintext_ftp( - self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_ftp + self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_ftp, mock_basename ): """Test falls back to plaintext FTP when FTPS fails.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -83,15 +89,17 @@ class TestUploadToFtp: assert result["status"] == "Completed" assert result["used_tls"] is False + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") def test_raises_error_when_ftps_fails_and_plaintext_forbidden( - self, mock_settings, mock_exists, mock_log, mock_ftp_tls + self, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_basename ): """Test raises error when FTPS fails and plaintext is forbidden.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -110,11 +118,13 @@ class TestUploadToFtp: with pytest.raises(Exception, match="FTPS connection failed and plaintext FTP is forbidden"): upload_to_ftp(mock_self, "/tmp/test.pdf") + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") - def test_raises_error_when_file_not_found(self, mock_exists, mock_log): + def test_raises_error_when_file_not_found(self, mock_exists, mock_log, mock_basename): """Test raises error when file not found.""" mock_exists.return_value = False + mock_basename.return_value = "file.pdf" mock_self = Mock() mock_self.request.id = "test-task-id" @@ -122,12 +132,14 @@ class TestUploadToFtp: with pytest.raises(FileNotFoundError): upload_to_ftp(mock_self, "/nonexistent/file.pdf") + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") - def test_raises_error_when_ftp_host_not_configured(self, mock_settings, mock_exists, mock_log): + def test_raises_error_when_ftp_host_not_configured(self, mock_settings, mock_exists, mock_log, mock_basename): """Test raises error when FTP host not configured.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = None mock_self = Mock() @@ -136,14 +148,18 @@ class TestUploadToFtp: with pytest.raises(ValueError, match="FTP host is not configured"): upload_to_ftp(mock_self, "/tmp/test.pdf") + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") @patch("builtins.open", create=True) - def test_creates_directory_structure(self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls): + def test_creates_directory_structure( + self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_basename + ): """Test creates directory structure if it doesn't exist.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -163,14 +179,18 @@ class TestUploadToFtp: assert result["status"] == "Completed" mock_ftp.mkd.assert_called() + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") @patch("builtins.open", create=True) - def test_uses_plaintext_ftp_when_tls_disabled(self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp): + def test_uses_plaintext_ftp_when_tls_disabled( + self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp, mock_basename + ): """Test uses plaintext FTP when TLS is explicitly disabled.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -190,12 +210,16 @@ class TestUploadToFtp: assert result["status"] == "Completed" assert result["used_tls"] is False + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") - def test_raises_error_when_plaintext_forbidden_and_tls_disabled(self, mock_settings, mock_exists, mock_log): + def test_raises_error_when_plaintext_forbidden_and_tls_disabled( + self, mock_settings, mock_exists, mock_log, mock_basename + ): """Test raises error when plaintext is forbidden and TLS is disabled.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_use_tls = False @@ -207,14 +231,18 @@ class TestUploadToFtp: with pytest.raises(Exception, match="Plaintext FTP is forbidden"): upload_to_ftp(mock_self, "/tmp/test.pdf") + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") @patch("builtins.open", create=True) - def test_removes_leading_slash_from_folder(self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls): + def test_removes_leading_slash_from_folder( + self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_basename + ): """Test removes leading slash from folder path.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -233,13 +261,15 @@ class TestUploadToFtp: # Verify cwd was called with folder without leading slash mock_ftp.cwd.assert_called_with("uploads") + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") - def test_handles_directory_creation_error(self, mock_settings, mock_exists, mock_log, mock_ftp_tls): + def test_handles_directory_creation_error(self, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_basename): """Test handles directory creation error.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" @@ -258,14 +288,18 @@ class TestUploadToFtp: with pytest.raises(Exception, match="Failed to change/create directory"): upload_to_ftp(mock_self, "/tmp/test.pdf") + @patch("app.tasks.upload_to_ftp.os.path.basename") @patch("app.tasks.upload_to_ftp.ftplib.FTP_TLS") @patch("app.tasks.upload_to_ftp.log_task_progress") @patch("app.tasks.upload_to_ftp.os.path.exists") @patch("app.tasks.upload_to_ftp.settings") @patch("builtins.open", create=True) - def test_returns_ftp_path_in_result(self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls): + def test_returns_ftp_path_in_result( + self, mock_open, mock_settings, mock_exists, mock_log, mock_ftp_tls, mock_basename + ): """Test returns FTP path in result.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.ftp_host = "ftp.example.com" mock_settings.ftp_port = 21 mock_settings.ftp_username = "user" diff --git a/tests/test_upload_google_drive.py b/tests/test_upload_google_drive.py index 6b1882b9..7d76faa4 100644 --- a/tests/test_upload_google_drive.py +++ b/tests/test_upload_google_drive.py @@ -219,6 +219,7 @@ class TestTruncatePropertyValue: class TestUploadToGoogleDriveTask: """Tests for upload_to_google_drive task.""" + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.get_google_drive_service") @patch("app.tasks.upload_to_google_drive.extract_metadata_from_file") @patch("app.tasks.upload_to_google_drive.log_task_progress") @@ -226,10 +227,11 @@ class TestUploadToGoogleDriveTask: @patch("app.tasks.upload_to_google_drive.MediaFileUpload") @patch("app.tasks.upload_to_google_drive.settings") def test_uploads_file_successfully( - self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service + self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service, mock_basename ): """Test uploads file to Google Drive successfully.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.google_drive_folder_id = "folder_123" mock_extract.return_value = {} @@ -259,11 +261,13 @@ class TestUploadToGoogleDriveTask: assert result["google_drive_file_id"] == "file_123" assert "webViewLink" in result["google_drive_web_link"] + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.log_task_progress") @patch("app.tasks.upload_to_google_drive.os.path.exists") - def test_raises_error_when_file_not_found(self, mock_exists, mock_log): + def test_raises_error_when_file_not_found(self, mock_exists, mock_log, mock_basename): """Test raises error when file not found.""" mock_exists.return_value = False + mock_basename.return_value = "file.pdf" mock_self = Mock() mock_self.request.id = "test-task-id" @@ -271,12 +275,14 @@ class TestUploadToGoogleDriveTask: with pytest.raises(FileNotFoundError): upload_to_google_drive(mock_self, "/nonexistent/file.pdf") + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.get_google_drive_service") @patch("app.tasks.upload_to_google_drive.log_task_progress") @patch("app.tasks.upload_to_google_drive.os.path.exists") - def test_raises_error_when_service_init_fails(self, mock_exists, mock_log, mock_service): + def test_raises_error_when_service_init_fails(self, mock_exists, mock_log, mock_service, mock_basename): """Test raises error when service initialization fails.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_service.return_value = None mock_self = Mock() @@ -285,6 +291,7 @@ class TestUploadToGoogleDriveTask: with pytest.raises(Exception, match="Failed to initialize Google Drive service"): upload_to_google_drive(mock_self, "/tmp/test.pdf") + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.get_google_drive_service") @patch("app.tasks.upload_to_google_drive.extract_metadata_from_file") @patch("app.tasks.upload_to_google_drive.log_task_progress") @@ -292,10 +299,11 @@ class TestUploadToGoogleDriveTask: @patch("app.tasks.upload_to_google_drive.MediaFileUpload") @patch("app.tasks.upload_to_google_drive.settings") def test_includes_metadata_in_upload( - self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service + self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service, mock_basename ): """Test includes metadata in upload.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.google_drive_folder_id = None metadata = {"document_type": "invoice", "amount": "100.00", "date": "2024-01-01"} @@ -324,6 +332,7 @@ class TestUploadToGoogleDriveTask: assert result["metadata_included"] is True + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.get_google_drive_service") @patch("app.tasks.upload_to_google_drive.extract_metadata_from_file") @patch("app.tasks.upload_to_google_drive.log_task_progress") @@ -331,10 +340,11 @@ class TestUploadToGoogleDriveTask: @patch("app.tasks.upload_to_google_drive.MediaFileUpload") @patch("app.tasks.upload_to_google_drive.settings") def test_skips_nested_metadata_objects( - self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service + self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service, mock_basename ): """Test skips nested objects in metadata.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.google_drive_folder_id = None metadata = {"simple_field": "value", "nested_object": {"key": "value"}, "nested_list": [1, 2, 3]} @@ -370,14 +380,18 @@ class TestUploadToGoogleDriveTask: assert "nested_object" not in file_metadata["properties"] assert "nested_list" not in file_metadata["properties"] + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.get_google_drive_service") @patch("app.tasks.upload_to_google_drive.log_task_progress") @patch("app.tasks.upload_to_google_drive.os.path.exists") @patch("app.tasks.upload_to_google_drive.MediaFileUpload") @patch("app.tasks.upload_to_google_drive.settings") - def test_handles_upload_exception(self, mock_settings, mock_media, mock_exists, mock_log, mock_service): + def test_handles_upload_exception( + self, mock_settings, mock_media, mock_exists, mock_log, mock_service, mock_basename + ): """Test handles upload exception.""" mock_exists.return_value = True + mock_basename.return_value = "test.pdf" mock_settings.google_drive_folder_id = None mock_drive_service = Mock() @@ -392,6 +406,7 @@ class TestUploadToGoogleDriveTask: with pytest.raises(Exception, match="Failed to upload"): upload_to_google_drive(mock_self, "/tmp/test.pdf") + @patch("app.tasks.upload_to_google_drive.os.path.basename") @patch("app.tasks.upload_to_google_drive.get_google_drive_service") @patch("app.tasks.upload_to_google_drive.extract_metadata_from_file") @patch("app.tasks.upload_to_google_drive.log_task_progress") @@ -399,9 +414,10 @@ class TestUploadToGoogleDriveTask: @patch("app.tasks.upload_to_google_drive.MediaFileUpload") @patch("app.tasks.upload_to_google_drive.settings") def test_sets_parent_folder_when_configured( - self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service + self, mock_settings, mock_media, mock_exists, mock_log, mock_extract, mock_service, mock_basename ): """Test sets parent folder when configured.""" + mock_basename.return_value = "test.pdf" mock_exists.return_value = True mock_settings.google_drive_folder_id = "parent_folder_123" mock_extract.return_value = {}