Merge pull request #587 from christianlouis/copilot/add-apple-drive-icloud-support
feat(storage): add Apple iCloud Drive storage provider
This commit is contained in:
@@ -665,6 +665,7 @@ def _all_should_upload_false():
|
||||
"email",
|
||||
"onedrive",
|
||||
"s3",
|
||||
"icloud",
|
||||
]
|
||||
return [patch(f"app.tasks.send_to_all._should_upload_to_{s}", return_value=False) for s in services]
|
||||
|
||||
@@ -693,6 +694,7 @@ class TestSendToAllCoverage:
|
||||
patch("app.tasks.send_to_all._should_upload_to_email", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_onedrive", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_s3", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_icloud", return_value=False),
|
||||
patch("app.tasks.send_to_all.SessionLocal") as mock_session_cls,
|
||||
):
|
||||
ms.workdir = str(tmp_path)
|
||||
@@ -804,6 +806,7 @@ class TestSendToAllCoverage:
|
||||
patch("app.tasks.send_to_all._should_upload_to_email", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_onedrive", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_s3", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_icloud", return_value=False),
|
||||
patch("app.tasks.send_to_all.SessionLocal"),
|
||||
):
|
||||
ms.workdir = str(tmp_path)
|
||||
@@ -863,6 +866,7 @@ class TestSendToAllCoverage:
|
||||
patch("app.tasks.send_to_all._should_upload_to_email", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_onedrive", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_s3", return_value=False),
|
||||
patch("app.tasks.send_to_all._should_upload_to_icloud", return_value=False),
|
||||
patch("app.tasks.send_to_all.SessionLocal"),
|
||||
):
|
||||
ms.workdir = str(tmp_path)
|
||||
|
||||
@@ -9,6 +9,7 @@ from app.tasks.send_to_all import (
|
||||
_should_upload_to_email,
|
||||
_should_upload_to_ftp,
|
||||
_should_upload_to_google_drive,
|
||||
_should_upload_to_icloud,
|
||||
_should_upload_to_nextcloud,
|
||||
_should_upload_to_onedrive,
|
||||
_should_upload_to_paperless,
|
||||
@@ -145,6 +146,22 @@ class TestShouldUploadFunctions:
|
||||
|
||||
assert _should_upload_to_s3() is True
|
||||
|
||||
@patch("app.tasks.send_to_all.settings")
|
||||
def test_should_upload_to_icloud_configured(self, mock_settings):
|
||||
"""Test iCloud upload check."""
|
||||
mock_settings.icloud_username = "user@example.com"
|
||||
mock_settings.icloud_password = "app-specific-password"
|
||||
|
||||
assert _should_upload_to_icloud() is True
|
||||
|
||||
@patch("app.tasks.send_to_all.settings")
|
||||
def test_should_upload_to_icloud_not_configured(self, mock_settings):
|
||||
"""Test iCloud upload check when not configured."""
|
||||
mock_settings.icloud_username = None
|
||||
mock_settings.icloud_password = None
|
||||
|
||||
assert _should_upload_to_icloud() is False
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
class TestGetConfiguredServicesFromValidator:
|
||||
@@ -204,12 +221,14 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all.upload_to_dropbox")
|
||||
def test_queues_single_configured_service(
|
||||
self,
|
||||
mock_upload,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -239,6 +258,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
mock_upload.delay.return_value = MagicMock(id="task-123")
|
||||
|
||||
result = send_to_all_destinations.apply(args=[str(test_file), False, 1])
|
||||
@@ -250,6 +270,7 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all.log_task_progress")
|
||||
@patch("app.tasks.send_to_all.settings")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_dropbox")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_nextcloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_paperless")
|
||||
@@ -274,6 +295,7 @@ class TestSendToAllDestinations:
|
||||
mock_paperless,
|
||||
mock_nextcloud,
|
||||
mock_should_s3,
|
||||
mock_icloud,
|
||||
mock_should_dropbox,
|
||||
mock_settings,
|
||||
mock_log,
|
||||
@@ -295,6 +317,7 @@ class TestSendToAllDestinations:
|
||||
mock_sftp.return_value = False
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
mock_dropbox_upload.delay.return_value = MagicMock(id="dropbox-task")
|
||||
mock_s3_upload.delay.return_value = MagicMock(id="s3-task")
|
||||
|
||||
@@ -316,10 +339,12 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
def test_skips_unconfigured_services(
|
||||
self,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -349,6 +374,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
|
||||
result = send_to_all_destinations.apply(args=[str(test_file), False, 1])
|
||||
|
||||
@@ -369,12 +395,14 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all.upload_to_dropbox")
|
||||
def test_with_file_id_parameter(
|
||||
self,
|
||||
mock_upload,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -404,6 +432,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
mock_upload.delay.return_value = MagicMock(id="task-123")
|
||||
|
||||
result = send_to_all_destinations.apply(args=[str(test_file), False, 42])
|
||||
@@ -425,6 +454,7 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all.get_configured_services_from_validator")
|
||||
@patch("app.tasks.send_to_all.upload_to_dropbox")
|
||||
@@ -433,6 +463,7 @@ class TestSendToAllDestinations:
|
||||
mock_upload,
|
||||
mock_validator,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -463,6 +494,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
mock_upload.delay.return_value = MagicMock(id="task-123")
|
||||
|
||||
result = send_to_all_destinations.apply(args=[str(test_file), True, 1])
|
||||
@@ -482,12 +514,14 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all.get_configured_services_from_validator")
|
||||
def test_validator_exception_fallback(
|
||||
self,
|
||||
mock_validator,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -518,6 +552,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
|
||||
# Should not raise, should fall back to individual checks
|
||||
result = send_to_all_destinations.apply(args=[str(test_file), True, 1])
|
||||
@@ -536,12 +571,14 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all.upload_to_dropbox")
|
||||
def test_handles_upload_task_queue_error(
|
||||
self,
|
||||
mock_upload,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -571,6 +608,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
mock_upload.delay.side_effect = Exception("Queue error")
|
||||
|
||||
# Should not raise, should log error
|
||||
@@ -580,6 +618,7 @@ class TestSendToAllDestinations:
|
||||
# Error should be recorded in results
|
||||
assert "dropbox_error" in result.result["tasks"]
|
||||
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@@ -608,6 +647,7 @@ class TestSendToAllDestinations:
|
||||
mock_email,
|
||||
mock_onedrive,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
tmp_path,
|
||||
):
|
||||
"""Test file_id lookup fallback when not provided."""
|
||||
@@ -629,6 +669,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
|
||||
# Mock database session
|
||||
mock_db = MagicMock()
|
||||
@@ -656,10 +697,12 @@ class TestSendToAllDestinations:
|
||||
@patch("app.tasks.send_to_all._should_upload_to_sftp")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_email")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_onedrive")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_icloud")
|
||||
@patch("app.tasks.send_to_all._should_upload_to_s3")
|
||||
def test_should_upload_check_exception_handling(
|
||||
self,
|
||||
mock_s3,
|
||||
mock_icloud,
|
||||
mock_onedrive,
|
||||
mock_email,
|
||||
mock_sftp,
|
||||
@@ -689,6 +732,7 @@ class TestSendToAllDestinations:
|
||||
mock_email.return_value = False
|
||||
mock_onedrive.return_value = False
|
||||
mock_s3.return_value = False
|
||||
mock_icloud.return_value = False
|
||||
|
||||
# Should not raise, should treat as not configured
|
||||
result = send_to_all_destinations.apply(args=[str(test_file), False, 1])
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
"""Unit tests for the iCloud Drive upload task and helper functions.
|
||||
|
||||
Tests cover the global upload task (``upload_to_icloud``) as well as the
|
||||
per-user integration handler (``_upload_icloud`` in
|
||||
``upload_to_user_integration``). All external calls to ``pyicloud`` are
|
||||
mocked so tests are fast, hermetic, and free of network access.
|
||||
"""
|
||||
|
||||
import os
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Shared helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
TASK_ID = "test-icloud-task-id"
|
||||
|
||||
|
||||
def _write_file(path, content: bytes = b"PDF content") -> None:
|
||||
"""Write *content* to *path*, creating parent dirs as needed."""
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
with open(path, "wb") as fh:
|
||||
fh.write(content)
|
||||
|
||||
|
||||
def _mock_pyicloud_module(mock_api):
|
||||
"""Return a mock ``pyicloud`` module whose ``PyiCloudService`` returns *mock_api*."""
|
||||
mock_mod = MagicMock()
|
||||
mock_mod.PyiCloudService.return_value = mock_api
|
||||
return mock_mod
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# _get_icloud_api
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
class TestGetIcloudApi:
|
||||
"""Tests for the _get_icloud_api helper."""
|
||||
|
||||
def test_returns_authenticated_api(self):
|
||||
mock_api = MagicMock()
|
||||
mock_api.requires_2sa = False
|
||||
mock_api.requires_2fa = False
|
||||
|
||||
with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}):
|
||||
from app.tasks.upload_to_icloud import _get_icloud_api
|
||||
|
||||
result = _get_icloud_api("user@example.com", "secret")
|
||||
|
||||
assert result is mock_api
|
||||
|
||||
def test_passes_cookie_directory(self):
|
||||
mock_api = MagicMock()
|
||||
mock_api.requires_2sa = False
|
||||
mock_api.requires_2fa = False
|
||||
mock_mod = _mock_pyicloud_module(mock_api)
|
||||
|
||||
with patch.dict("sys.modules", {"pyicloud": mock_mod}):
|
||||
from app.tasks.upload_to_icloud import _get_icloud_api
|
||||
|
||||
_get_icloud_api("user@example.com", "secret", "/tmp/cookies")
|
||||
|
||||
mock_mod.PyiCloudService.assert_called_once_with("user@example.com", "secret", cookie_directory="/tmp/cookies")
|
||||
|
||||
def test_raises_on_2fa_required(self):
|
||||
mock_api = MagicMock()
|
||||
mock_api.requires_2sa = False
|
||||
mock_api.requires_2fa = True
|
||||
|
||||
with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}):
|
||||
from app.tasks.upload_to_icloud import _get_icloud_api
|
||||
|
||||
with pytest.raises(ValueError, match="two-factor authentication"):
|
||||
_get_icloud_api("user@example.com", "secret")
|
||||
|
||||
def test_raises_on_2sa_required(self):
|
||||
mock_api = MagicMock()
|
||||
mock_api.requires_2sa = True
|
||||
mock_api.requires_2fa = False
|
||||
|
||||
with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}):
|
||||
from app.tasks.upload_to_icloud import _get_icloud_api
|
||||
|
||||
with pytest.raises(ValueError, match="two-factor authentication"):
|
||||
_get_icloud_api("user@example.com", "secret")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# _navigate_to_folder
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
class TestNavigateToFolder:
|
||||
"""Tests for the _navigate_to_folder helper."""
|
||||
|
||||
def test_empty_path_returns_root(self):
|
||||
from app.tasks.upload_to_icloud import _navigate_to_folder
|
||||
|
||||
root = MagicMock()
|
||||
result = _navigate_to_folder(root, "")
|
||||
assert result is root
|
||||
|
||||
def test_navigates_existing_folders(self):
|
||||
from app.tasks.upload_to_icloud import _navigate_to_folder
|
||||
|
||||
# Build a mock folder tree: root -> Documents -> Uploads
|
||||
uploads_node = MagicMock()
|
||||
uploads_node.name = "Uploads"
|
||||
|
||||
docs_node = MagicMock()
|
||||
docs_node.name = "Documents"
|
||||
docs_node.dir.return_value = [uploads_node]
|
||||
|
||||
root = MagicMock()
|
||||
root.dir.return_value = [docs_node]
|
||||
|
||||
result = _navigate_to_folder(root, "Documents/Uploads")
|
||||
assert result is uploads_node
|
||||
|
||||
def test_creates_missing_folder(self):
|
||||
from app.tasks.upload_to_icloud import _navigate_to_folder
|
||||
|
||||
new_folder = MagicMock()
|
||||
root = MagicMock()
|
||||
root.dir.return_value = [] # No children
|
||||
root.mkdir.return_value = new_folder
|
||||
|
||||
result = _navigate_to_folder(root, "NewFolder")
|
||||
root.mkdir.assert_called_once_with("NewFolder")
|
||||
assert result is new_folder
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# _upload_icloud (user integration handler)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
class TestUploadIcloudHandler:
|
||||
"""Tests for _upload_icloud handler in upload_to_user_integration."""
|
||||
|
||||
def _call(self, file_path: str, cfg: dict, creds: dict) -> dict:
|
||||
from app.tasks.upload_to_user_integration import _upload_icloud
|
||||
|
||||
return _upload_icloud(file_path, cfg, creds, TASK_ID)
|
||||
|
||||
def test_raises_when_credentials_missing(self, tmp_path):
|
||||
fp = str(tmp_path / "doc.pdf")
|
||||
_write_file(fp)
|
||||
with pytest.raises(ValueError, match="username or password"):
|
||||
self._call(fp, {}, {})
|
||||
|
||||
def test_raises_when_password_missing(self, tmp_path):
|
||||
fp = str(tmp_path / "doc.pdf")
|
||||
_write_file(fp)
|
||||
with pytest.raises(ValueError, match="username or password"):
|
||||
self._call(fp, {}, {"username": "user@example.com"})
|
||||
|
||||
def test_successful_upload(self, tmp_path):
|
||||
fp = str(tmp_path / "doc.pdf")
|
||||
_write_file(fp)
|
||||
|
||||
mock_api = MagicMock()
|
||||
mock_api.requires_2sa = False
|
||||
mock_api.requires_2fa = False
|
||||
|
||||
# drive.dir() returns nothing -> mkdir will be called
|
||||
mock_folder = MagicMock()
|
||||
mock_api.drive.dir.return_value = []
|
||||
mock_api.drive.mkdir.return_value = mock_folder
|
||||
|
||||
with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}):
|
||||
result = self._call(
|
||||
fp,
|
||||
{"folder": "Documents"},
|
||||
{"username": "user@example.com", "password": "secret"},
|
||||
)
|
||||
|
||||
assert result["status"] == "Completed"
|
||||
assert result["icloud_folder"] == "Documents"
|
||||
mock_folder.upload.assert_called_once()
|
||||
|
||||
def test_upload_to_root_when_no_folder(self, tmp_path):
|
||||
fp = str(tmp_path / "doc.pdf")
|
||||
_write_file(fp)
|
||||
|
||||
mock_api = MagicMock()
|
||||
mock_api.requires_2sa = False
|
||||
mock_api.requires_2fa = False
|
||||
|
||||
with patch.dict("sys.modules", {"pyicloud": _mock_pyicloud_module(mock_api)}):
|
||||
result = self._call(
|
||||
fp,
|
||||
{},
|
||||
{"username": "user@example.com", "password": "secret"},
|
||||
)
|
||||
|
||||
assert result["status"] == "Completed"
|
||||
assert result["icloud_folder"] == "/"
|
||||
mock_api.drive.upload.assert_called_once()
|
||||
@@ -82,6 +82,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
assert result == []
|
||||
@@ -107,6 +109,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -133,6 +137,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -159,6 +165,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -185,6 +193,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -211,6 +221,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -237,6 +249,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -263,6 +277,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -289,6 +305,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = "user"
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -315,6 +333,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = "ftp.example.com"
|
||||
cfg.ftp_username = "user"
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
@@ -341,6 +361,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = "sftpuser"
|
||||
cfg.ftp_host = "ftp.example.com"
|
||||
cfg.ftp_username = "ftpuser"
|
||||
cfg.icloud_username = "user@example.com"
|
||||
cfg.icloud_password = "app-pass"
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
assert len(result) == len(_DESTINATION_META)
|
||||
@@ -366,6 +388,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
assert len(result) == 1
|
||||
@@ -393,6 +417,8 @@ class TestGetConfiguredDestinations:
|
||||
cfg.sftp_username = None
|
||||
cfg.ftp_host = None
|
||||
cfg.ftp_username = None
|
||||
cfg.icloud_username = None
|
||||
cfg.icloud_password = None
|
||||
|
||||
result = _get_configured_destinations(cfg)
|
||||
ids = [d["id"] for d in result]
|
||||
|
||||
Reference in New Issue
Block a user