Files
workdock-platform/backend/workflows/tests/test_nextcloud_service.py
2026-03-19 10:22:20 +01:00

74 lines
2.9 KiB
Python

from pathlib import Path
from unittest.mock import patch
from django.test import TestCase, override_settings
from workflows.models import WorkflowConfig
from workflows.services import upload_to_nextcloud
class NextcloudServiceTests(TestCase):
@override_settings(NEXTCLOUD_ENABLED=False)
@patch('workflows.services.requests.put')
def test_upload_returns_false_when_disabled(self, mock_put):
result = upload_to_nextcloud(Path('/tmp/nonexistent.txt'), 'x.txt')
self.assertFalse(result)
mock_put.assert_not_called()
@override_settings(
NEXTCLOUD_ENABLED=True,
NEXTCLOUD_BASE_URL='https://cloud.example/remote.php/dav/files/test-user',
NEXTCLOUD_DIRECTORY='Onboarding',
NEXTCLOUD_USERNAME='u',
NEXTCLOUD_PASSWORD='p',
)
@patch('workflows.services.requests.put')
def test_upload_calls_webdav_and_accepts_201(self, mock_put):
temp_file = Path('/tmp/nextcloud_mock_upload.txt')
temp_file.write_text('hello', encoding='utf-8')
mock_put.return_value.status_code = 201
try:
result = upload_to_nextcloud(temp_file, 'target.txt')
finally:
temp_file.unlink(missing_ok=True)
self.assertTrue(result)
self.assertEqual(mock_put.call_count, 1)
called_url = mock_put.call_args.kwargs['url'] if 'url' in mock_put.call_args.kwargs else mock_put.call_args.args[0]
self.assertTrue(called_url.endswith('/Onboarding/target.txt'))
@override_settings(
NEXTCLOUD_ENABLED=True,
NEXTCLOUD_BASE_URL='https://cloud.example/remote.php/dav/files/env-user',
NEXTCLOUD_DIRECTORY='EnvFolder',
NEXTCLOUD_USERNAME='env-user',
NEXTCLOUD_PASSWORD='env-pass',
)
@patch('workflows.services.requests.put')
def test_upload_prefers_workflowconfig_overrides(self, mock_put):
WorkflowConfig.objects.update_or_create(
name='Default',
defaults={
'nextcloud_enabled_override': True,
'nextcloud_base_url_override': 'https://cloud.example/remote.php/dav/files/admin-user',
'nextcloud_directory_override': 'AdminFolder',
'nextcloud_username_override': 'admin-user',
'nextcloud_password_override': 'admin-pass',
},
)
temp_file = Path('/tmp/nextcloud_override_upload.txt')
temp_file.write_text('hello', encoding='utf-8')
mock_put.return_value.status_code = 201
try:
result = upload_to_nextcloud(temp_file, 'override.txt')
finally:
temp_file.unlink(missing_ok=True)
self.assertTrue(result)
called_url = mock_put.call_args.kwargs['url'] if 'url' in mock_put.call_args.kwargs else mock_put.call_args.args[0]
self.assertTrue(called_url.endswith('/AdminFolder/override.txt'))
auth = mock_put.call_args.kwargs.get('auth')
self.assertEqual(auth, ('admin-user', 'admin-pass'))