From 5e4b78f9f55e452ab796ef5d8a6a08f83f124924 Mon Sep 17 00:00:00 2001
From: Jithu Murugan <j.murugan@fz-juelich.de>
Date: Fri, 21 Feb 2025 15:55:41 +0100
Subject: [PATCH] - Corrected the failing unit tests and minor refactorings.

---
 dedal/commands/bash_command_executor.py       |  4 +-
 dedal/spack_factory/SpackOperationUseCache.py |  4 +-
 .../unit_tests/test_bash_command_executor.py  | 42 +++++++------------
 .../unit_tests/test_build_cache_manager.py    |  4 +-
 4 files changed, 23 insertions(+), 31 deletions(-)

diff --git a/dedal/commands/bash_command_executor.py b/dedal/commands/bash_command_executor.py
index db464c67..aef9c576 100644
--- a/dedal/commands/bash_command_executor.py
+++ b/dedal/commands/bash_command_executor.py
@@ -7,9 +7,9 @@
 #  Created by: Murugan, Jithu <j.murugan@fz-juelich.de>
 #  Created on: 2025-02-17
 import logging
-import os
 import subprocess
 from logging import Logger
+from os import name as os_name
 
 from dedal.commands.command import Command
 from dedal.commands.command_sequence import CommandSequence
@@ -29,7 +29,7 @@ class BashCommandExecutor:
             "nt": ["wsl", "bash", "-c"],  # Works only if wsl is installed on windows
             "posix": ["bash", "-c"],
         }
-        self.bash_command: list[str] = command_map.get(os.name, ["undefined"])
+        self.bash_command: list[str] = command_map.get(os_name, ["undefined"])
 
     def add_command(self, command: Command) -> None:
         """Adds a command to the sequence.
diff --git a/dedal/spack_factory/SpackOperationUseCache.py b/dedal/spack_factory/SpackOperationUseCache.py
index 6575ba99..ce247ccd 100644
--- a/dedal/spack_factory/SpackOperationUseCache.py
+++ b/dedal/spack_factory/SpackOperationUseCache.py
@@ -33,14 +33,14 @@ class SpackOperationUseCache(SpackOperation):
         and adds the build cache mirror.
 
         Raises:
-            ValueError: If there is an issue with the build cache setup.
+            ValueError: If there is an issue with the build cache setup (mirror_name/mirror_path are empty).
             NoSpackEnvironmentException: If the spack environment is not set up.
         """
         super().setup_spack_env()
         try:
             # Download build cache from OCI Registry and add public key to trusted keys
             self.build_cache.download(self.spack_config.buildcache_dir)
-            cached_public_key = self.build_cache.get_public_key_from_cache(self.spack_config.buildcache_dir)
+            cached_public_key = self.build_cache.get_public_key_from_cache(str(self.spack_config.buildcache_dir))
             signed = cached_public_key is not None and self.trust_gpg_key(cached_public_key)
             if not signed:
                 self.logger.warning("Public key not found in cache or failed to trust pgp keys!")
diff --git a/dedal/tests/unit_tests/test_bash_command_executor.py b/dedal/tests/unit_tests/test_bash_command_executor.py
index f3624960..368d5136 100644
--- a/dedal/tests/unit_tests/test_bash_command_executor.py
+++ b/dedal/tests/unit_tests/test_bash_command_executor.py
@@ -33,14 +33,11 @@ class TestBashCommandExecutor:
     )
     def test_init_success_path(self, mocker, test_id, os_name, expected_bash_command):
         # Arrange
-        original_os = os.name
         mock_get_logger = mocker.patch("dedal.commands.bash_command_executor.logging.getLogger")
-        mocker.patch("dedal.commands.bash_command_executor.os.name", os_name)
-        # mock_os_name.return_value = os_name
+        mocker.patch("dedal.commands.bash_command_executor.os_name", os_name)
 
         # Act
         executor = BashCommandExecutor()
-        os.name = original_os  # Reset the os.name to the original value
 
         # Assert
         assert executor.bash_command == expected_bash_command
@@ -76,7 +73,7 @@ class TestBashCommandExecutor:
         # Assert
         assert str(except_info.value) == "Invalid command type. Use Command."
 
-    @patch("dedal.commands.bash_command_executor.os.name", "unknown")
+    @patch("dedal.commands.bash_command_executor.os_name", "unknown")
     def test_init_unknown_os(self):
 
         # Act
@@ -135,8 +132,7 @@ class TestBashCommandExecutor:
            side_effect=subprocess.CalledProcessError(1, "some_command", stderr="Mock stderr"))
     def test_execute_called_process_error(self, mock_subprocess_run, mocker):
         # Arrange
-        original_os = os.name
-        mocker.patch("dedal.commands.bash_command_executor.os.name", "nt")
+        mocker.patch("dedal.commands.bash_command_executor.os_name", "nt")
         executor = BashCommandExecutor()
         executor.add_command(MockCommand("failing_command"))
 
@@ -149,9 +145,6 @@ class TestBashCommandExecutor:
         mock_subprocess_run.assert_called_once_with(['wsl', 'bash', '-c', 'failing_command'], capture_output=True,
                                                     text=True, check=True, timeout=172800)
 
-        # Cleanup
-        os.name = original_os
-
     @pytest.mark.parametrize(
         "test_id, exception, expected_error_message",
         [
@@ -169,8 +162,7 @@ class TestBashCommandExecutor:
     )
     def test_execute_other_errors(self, test_id, exception, expected_error_message, mocker):
         # Arrange
-        original_os = os.name
-        mocker.patch("dedal.commands.bash_command_executor.os.name", "nt")
+        mocker.patch("dedal.commands.bash_command_executor.os_name", "nt")
         with patch("dedal.commands.bash_command_executor.subprocess.run", side_effect=exception) as mock_subprocess_run:
             executor = BashCommandExecutor()
             executor.add_command(MockCommand("some_command"))
@@ -184,9 +176,6 @@ class TestBashCommandExecutor:
             mock_subprocess_run.assert_called_once_with(['wsl', 'bash', '-c', 'some_command'], capture_output=True,
                                                         text=True, check=True, timeout=172800)
 
-        # Cleanup
-        os.name = original_os
-
     def test_execute_no_commands(self):
         # Arrange
         executor = BashCommandExecutor()
@@ -197,12 +186,11 @@ class TestBashCommandExecutor:
 
         # Assert
         assert str(except_info.value) == "No commands to execute."
+
     @patch("dedal.commands.bash_command_executor.subprocess.run")
     def test_execute_happy_path_nt(self, mock_subprocess_run, mocker):
         # Arrange
-        original_os = os.name
-
-        mocker.patch("dedal.commands.bash_command_executor.os.name", "nt")
+        mocker.patch("dedal.commands.bash_command_executor.os_name", "nt")
         executor = BashCommandExecutor()
         executor.add_command(MockCommand("echo hello"))
         mock_subprocess_run.return_value.stdout = "hello\n"
@@ -217,19 +205,21 @@ class TestBashCommandExecutor:
         mock_subprocess_run.assert_called_once_with(['wsl', 'bash', '-c', 'echo hello'], capture_output=True, text=True,
                                                     check=True, timeout=172800)
 
-        # Cleanup
-        os.name = original_os
-
-    @patch("dedal.commands.bash_command_executor.os.name", "unknown")
-    def test_execute_unknown_os(self):
+    def test_execute_unknown_os(self, mocker):
         # Arrange
+        errors = {
+            "posix": "Error: Bash Command: ['undefined'] not found: [Errno 2] No such file or directory",
+            "nt": "Error: Bash Command: ['undefined'] not found: [WinError 2] The system cannot find the file "
+                  'specified'
+        }
+        original_os = os.name
+        expected_error = errors.get(original_os, "Error: Unknown OS")
+        mocker.patch("dedal.commands.bash_command_executor.os_name")
         executor = BashCommandExecutor()
         executor.add_command(MockCommand("echo hello"))
 
         # Act
-        assert executor.execute() == (None,
-                                      "Error: Bash Command: ['undefined'] not found: [WinError 2] The system cannot "
-                                      'find the file specified')
+        assert executor.execute() == (None, expected_error)
 
     def test_reset(self, mocker):
         # Test ID: reset
diff --git a/dedal/tests/unit_tests/test_build_cache_manager.py b/dedal/tests/unit_tests/test_build_cache_manager.py
index 29054b1a..2a80149b 100644
--- a/dedal/tests/unit_tests/test_build_cache_manager.py
+++ b/dedal/tests/unit_tests/test_build_cache_manager.py
@@ -60,7 +60,9 @@ class TestBuildCacheManager:
         result = mock_build_cache_manager.get_public_key_from_cache(str(build_cache_dir))
 
         # Assert
-        assert result == str(build_cache_dir / "project0" / "_pgp" / "key0.pub")
+        assert result in [str(build_cache_dir / "project0" / "_pgp" / "key0.pub"),
+                          str(build_cache_dir / "project0" / "_pgp" / "key1.pub"),
+                          str(build_cache_dir / "project1" / "_pgp" / "key0.pub")]
         log = (expected_log_message, pgp_folders, pgp_folders[0]) if test_id == "more_than_one_gpg_folder" else (
             expected_log_message, key_files, key_files[0])
         mock_build_cache_manager._logger.warning.assert_called_once_with(*log)
-- 
GitLab