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.request') @patch('workflows.services.requests.put') def test_upload_calls_webdav_and_accepts_201(self, mock_put, mock_request): temp_file = Path('/tmp/nextcloud_mock_upload.txt') temp_file.write_text('hello', encoding='utf-8') mock_request.return_value.status_code = 201 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.request') @patch('workflows.services.requests.put') def test_upload_prefers_workflowconfig_overrides(self, mock_put, mock_request): 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_request.return_value.status_code = 201 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'))