import sys from pathlib import Path # Add api directory to path api_dir = Path(__file__).parent.parent / 'api' sys.path.insert(0, str(api_dir)) import unittest import tempfile import shutil import os from unittest.mock import patch, MagicMock from file_manager import FileManager class TestFileManager(unittest.TestCase): def setUp(self): self.test_dir = tempfile.mkdtemp() self.data_dir = os.path.join(self.test_dir, 'data') self.config_dir = os.path.join(self.test_dir, 'config') os.makedirs(self.data_dir, exist_ok=True) os.makedirs(self.config_dir, exist_ok=True) self.manager = FileManager(data_dir=self.data_dir, config_dir=self.config_dir) def tearDown(self): shutil.rmtree(self.test_dir) def test_initialization(self): self.assertTrue(os.path.exists(self.manager.files_dir)) self.assertTrue(os.path.exists(self.manager.webdav_dir)) def test_create_and_delete_user(self): result = self.manager.create_user('testuser', 'password') self.assertTrue(result) result = self.manager.delete_user('testuser') self.assertTrue(result) def test_list_users_empty(self): users = self.manager.list_users() self.assertIsInstance(users, list) self.assertEqual(len(users), 0) def test_create_and_delete_folder(self): self.manager.create_user('testuser', 'password') result = self.manager.create_folder('testuser', 'TestFolder') self.assertTrue(result) result = self.manager.delete_folder('testuser', 'TestFolder') self.assertTrue(result) def test_upload_download_delete_file(self): self.manager.create_user('testuser', 'password') self.manager.create_folder('testuser', 'TestFolder') file_data = b'Hello, world!' result = self.manager.upload_file('testuser', 'TestFolder/hello.txt', file_data) self.assertTrue(result) downloaded = self.manager.download_file('testuser', 'TestFolder/hello.txt') self.assertEqual(downloaded, file_data) result = self.manager.delete_file('testuser', 'TestFolder/hello.txt') self.assertTrue(result) def test_list_files(self): self.manager.create_user('testuser', 'password') self.manager.create_folder('testuser', 'TestFolder') self.manager.upload_file('testuser', 'TestFolder/hello.txt', b'abc') files = self.manager.list_files('testuser', 'TestFolder') self.assertIsInstance(files, list) self.assertEqual(len(files), 1) self.assertEqual(files[0]['name'], 'hello.txt') @patch('subprocess.run') def test_get_webdav_status(self, mock_run): mock_run.return_value.stdout = 'cell-webdav\n' mock_run.return_value.returncode = 0 status = self.manager.get_webdav_status() self.assertIsInstance(status, dict) self.assertIn('webdav_running', status) @patch('requests.get') def test_test_webdav_connectivity(self, mock_get): mock_get.return_value.status_code = 200 result = self.manager.test_webdav_connectivity() self.assertIsInstance(result, dict) mock_get.side_effect = Exception('HTTP error') result = self.manager.test_webdav_connectivity() self.assertIn('http', result) @patch('subprocess.run') def test_get_webdav_logs(self, mock_run): mock_run.return_value.stdout = 'log line\n' mock_run.return_value.returncode = 0 logs = self.manager.get_webdav_logs(10) self.assertIsInstance(logs, str) self.assertIn('log line', logs) def test_backup_and_restore_user_files(self): self.manager.create_user('testuser', 'password') backup_path = os.path.join(self.test_dir, 'backup.zip') result = self.manager.backup_user_files('testuser', backup_path) self.assertTrue(result) result = self.manager.restore_user_files('testuser', backup_path) self.assertTrue(result) def test_get_status(self): status = self.manager.get_status() self.assertIsInstance(status, dict) self.assertIn('status', status) def test_error_handling(self): # Force errors by passing invalid arguments, should return False or empty/None self.assertFalse(self.manager.create_user('', '')) self.assertFalse(self.manager.delete_user('')) self.assertFalse(self.manager.create_folder('', '')) self.assertFalse(self.manager.delete_folder('', '')) self.assertFalse(self.manager.upload_file('', '', b'')) self.assertIsNone(self.manager.download_file('', '')) self.assertFalse(self.manager.delete_file('', '')) self.assertEqual(self.manager.list_files(''), []) self.assertFalse(self.manager.backup_user_files('', '')) self.assertFalse(self.manager.restore_user_files('', '')) if __name__ == '__main__': unittest.main()