74 lines
2.9 KiB
Python
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'))
|