summaryrefslogtreecommitdiff
path: root/tests/test_installation.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_installation.py')
-rw-r--r--tests/test_installation.py150
1 files changed, 150 insertions, 0 deletions
diff --git a/tests/test_installation.py b/tests/test_installation.py
new file mode 100644
index 0000000..2b3690e
--- /dev/null
+++ b/tests/test_installation.py
@@ -0,0 +1,150 @@
+"""
+Tests for the installation service.
+"""
+
+import os
+import tempfile
+import zipfile
+from pathlib import Path
+from unittest.mock import Mock, patch
+
+import pytest
+from pyfakefs.fake_filesystem_unittest import TestCase
+
+from lsfg_vk.installation import InstallationService
+from lsfg_vk.constants import LIB_FILENAME, JSON_FILENAME, ZIP_FILENAME
+
+
+class TestInstallationService(TestCase):
+ """Test cases for InstallationService using pyfakefs"""
+
+ def setUp(self):
+ """Set up fake filesystem"""
+ self.setUpPyfakefs()
+ self.mock_logger = Mock()
+
+ # Create a test home directory
+ self.test_home = Path("/home/testuser")
+ self.fs.create_dir(self.test_home)
+
+ # Patch Path.home() to return our test home
+ with patch('lsfg_vk.base_service.Path.home', return_value=self.test_home):
+ self.service = InstallationService(logger=self.mock_logger)
+
+ def test_check_installation_no_files(self):
+ """Test installation check when no files are installed"""
+ result = self.service.check_installation()
+
+ assert result["installed"] is False
+ assert result["lib_exists"] is False
+ assert result["json_exists"] is False
+ assert result["script_exists"] is False
+ assert result["error"] is None
+
+ def test_check_installation_all_files_exist(self):
+ """Test installation check when all files exist"""
+ # Create the files
+ self.service.lib_file.parent.mkdir(parents=True, exist_ok=True)
+ self.service.lib_file.touch()
+
+ self.service.json_file.parent.mkdir(parents=True, exist_ok=True)
+ self.service.json_file.touch()
+
+ self.service.lsfg_script_path.touch()
+
+ result = self.service.check_installation()
+
+ assert result["installed"] is True
+ assert result["lib_exists"] is True
+ assert result["json_exists"] is True
+ assert result["script_exists"] is True
+ assert result["error"] is None
+
+ def test_create_zip_for_testing(self):
+ """Helper to create a test zip file"""
+ # Create temp directory for zip contents
+ zip_content_dir = Path("/tmp/zip_content")
+ self.fs.create_dir(zip_content_dir)
+
+ # Create test files
+ lib_file = zip_content_dir / LIB_FILENAME
+ json_file = zip_content_dir / JSON_FILENAME
+
+ lib_file.write_text("fake library content")
+ json_file.write_text('{"layer": {"name": "VK_LAYER_LS_frame_generation"}}')
+
+ # Create zip file
+ zip_path = Path("/tmp/test.zip")
+ with zipfile.ZipFile(zip_path, 'w') as zip_file:
+ zip_file.write(lib_file, LIB_FILENAME)
+ zip_file.write(json_file, JSON_FILENAME)
+
+ return zip_path
+
+ @patch('lsfg_vk.installation.Path.home')
+ def test_install_success(self, mock_home):
+ """Test successful installation"""
+ mock_home.return_value = self.test_home
+
+ # Create the plugin directory and zip file
+ plugin_dir = Path("/plugin")
+ bin_dir = plugin_dir / "bin"
+ self.fs.create_dir(bin_dir)
+
+ # Create a test zip file
+ zip_path = self.test_create_zip_for_testing()
+ zip_dest = bin_dir / ZIP_FILENAME
+
+ # Copy our test zip to the expected location
+ with open(zip_path, 'rb') as src, open(zip_dest, 'wb') as dst:
+ dst.write(src.read())
+
+ # Mock the plugin directory detection
+ with patch('lsfg_vk.installation.Path.__file__', f"{plugin_dir}/lsfg_vk/installation.py"):
+ result = self.service.install()
+
+ assert result["success"] is True
+ assert "successfully" in result["message"]
+ assert result["error"] is None
+
+ # Check that files were created
+ assert self.service.lib_file.exists()
+ assert self.service.json_file.exists()
+ assert self.service.lsfg_script_path.exists()
+
+ def test_uninstall_no_files(self):
+ """Test uninstall when no files exist"""
+ result = self.service.uninstall()
+
+ assert result["success"] is True
+ assert "No lsfg-vk files found" in result["message"]
+ assert result["removed_files"] is None
+
+ def test_uninstall_with_files(self):
+ """Test uninstall when files exist"""
+ # Create the files
+ self.service.lib_file.parent.mkdir(parents=True, exist_ok=True)
+ self.service.lib_file.touch()
+
+ self.service.json_file.parent.mkdir(parents=True, exist_ok=True)
+ self.service.json_file.touch()
+
+ self.service.lsfg_script_path.touch()
+
+ result = self.service.uninstall()
+
+ assert result["success"] is True
+ assert "uninstalled successfully" in result["message"]
+ assert len(result["removed_files"]) == 3
+
+ # Check that files were removed
+ assert not self.service.lib_file.exists()
+ assert not self.service.json_file.exists()
+ assert not self.service.lsfg_script_path.exists()
+
+
+def test_installation_service_with_mock_logger():
+ """Test that InstallationService accepts a mock logger"""
+ mock_logger = Mock()
+ service = InstallationService(logger=mock_logger)
+ assert service.log == mock_logger