From 82e3be020b871ca51b4fdf69e2abf04f876e4ea9 Mon Sep 17 00:00:00 2001
From: Sam Kagan <skagan@nrao.edu>
Date: Mon, 20 May 2024 10:22:14 -0600
Subject: [PATCH] Added failing tests for updated restore CLI and
 multiple-code-path error

---
 .../casa_envoy/test/test_casa_envoy.py        | 86 +++++++++++++------
 1 file changed, 62 insertions(+), 24 deletions(-)

diff --git a/apps/cli/executables/pexable/casa_envoy/test/test_casa_envoy.py b/apps/cli/executables/pexable/casa_envoy/test/test_casa_envoy.py
index 0b9302aa9..d88f477ad 100644
--- a/apps/cli/executables/pexable/casa_envoy/test/test_casa_envoy.py
+++ b/apps/cli/executables/pexable/casa_envoy/test/test_casa_envoy.py
@@ -19,9 +19,11 @@
 Tests for casa_envoy.palaver
 """
 import argparse
+import itertools
 from unittest.mock import MagicMock, patch
 
 import casa_envoy.palaver as palaver
+import pytest
 from casa_envoy.launchers import CalibrationLauncher, ImagingLauncher
 from pycapo import CapoConfig
 
@@ -35,18 +37,21 @@ expected_settings = {
     "ppr": "test/input_files/PPR.xml",
     "product_type": "standard-cal",
 }
-args = argparse.Namespace()
+
+
+@pytest.fixture
+def args() -> argparse.Namespace:
+    return palaver.arg_parser().parse_args([])
 
 
 class TestPalaver:
-    def test_get_settings(self):
+    def test_get_settings(self, args):
         """
         verifies correct determination of needed settings
 
         :return:
         """
         args.standard_cal = ["test/input_files/test.json", "test/input_files/PPR.xml"]
-        args.restore = False
 
         with patch(
             "casa_envoy.palaver.CapoConfig",
@@ -56,16 +61,14 @@ class TestPalaver:
                 "pathlib.Path.cwd",
                 MagicMock(return_value="/lustre/aoc/cluster/pipeline/docker/workspaces/spool/tmpo1ca1pp_"),
             ) as cwd:
-                settings = palaver._get_settings(cwd, args.standard_cal)
+                settings = palaver._get_settings(cwd, ["test/input_files/test.json", "test/input_files/PPR.xml"])
                 assert settings["useCasa"] == expected_settings["useCasa"]
                 assert settings["homeForReprocessing"] == expected_settings["homeForReprocessing"]
                 assert settings["metadata"] == expected_settings["metadata"]
                 assert settings["ppr"] == expected_settings["ppr"]
 
-        args.standard_cal = None
-
     @patch("json.loads")
-    def test_setup_launcher(self, mock_json):
+    def test_setup_launcher(self, mock_json, args):
         """
         Verifies that the correct type of launcher is created
 
@@ -75,11 +78,7 @@ class TestPalaver:
             "pathlib.Path.cwd",
             MagicMock(return_value="/lustre/aoc/cluster/pipeline/docker/workspaces/spool/tmpo1ca1pp_"),
         ) as cwd:
-            args.parallel = None
-
             args.standard_cal = ["test/input_files/test.json", "test/input_files/PPR.xml"]
-            args.vlass_cal = None
-            args.restore = False
             launcher = palaver._setup_launcher(cwd, args)
             assert isinstance(launcher, CalibrationLauncher)
             args.standard_cal = None
@@ -88,11 +87,38 @@ class TestPalaver:
                 "test/input_files/image-metadata.json",
                 "test/input_files/cmsimage-PPR.xml",
             ]
-            args.vlass_img = None
-            args.integrated = False
             launcher = palaver._setup_launcher(cwd, args)
             assert isinstance(launcher, ImagingLauncher)
-            args.standard_img = None
+
+    @patch("json.loads")
+    def test_setup_launcher_multiple_code_paths_specified(self, mock_json):
+        """
+        Verifies that multiple code-paths can't all be specified at once
+
+        :return:
+        """
+        std_cal_args = ["--standard-cal", "test/input_files/test.json", "test/input_files/PPR.xml"]
+        vlass_cal_args = ["--vlass-cal", "file", "other-file"]
+        restore_args = ["--restore", "test/input_files/restore.json"]
+        std_img_args = [
+            "--standard-img",
+            "test/input_files/cmsimage-PPR.xml",
+            "test/input_files/image-metadata.json",
+        ]
+        vlass_img_args = ["--vlass-img", "file", "other-file"]
+
+        with patch(
+            "pathlib.Path.cwd",
+            MagicMock(return_value="/lustre/aoc/cluster/pipeline/docker/workspaces/spool/tmpo1ca1pp_"),
+        ) as cwd:
+            for one_codepath_args, two_codepath_args in itertools.combinations(
+                [std_cal_args, vlass_cal_args, restore_args, std_img_args, vlass_img_args], 2
+            ):
+                raw_args = one_codepath_args + two_codepath_args
+                parser = palaver.arg_parser()
+                real_args = parser.parse_args(raw_args)
+                with pytest.raises(ValueError, match="Expected exactly one"):
+                    palaver._setup_launcher(cwd, real_args)
 
     def test_parser(self):
         """
@@ -106,7 +132,7 @@ class TestPalaver:
     @patch("json.loads")
     @patch("os.chdir")
     @patch("os.getcwd")
-    def test_main_cal(self, mock_cwd, mock_chdir, mock_json):
+    def test_main_cal(self, mock_cwd, mock_chdir, mock_json, args):
         """
         verifies use of correct launcher for calibrations
 
@@ -116,21 +142,16 @@ class TestPalaver:
         :return:
         """
         args.standard_cal = ["test/input_files/test.json", "test/input_files/PPR.xml"]
-        args.integrated = False
-        args.vlass_cal = None
-        args.parallel = None
 
         with patch("argparse.ArgumentParser.parse_args", MagicMock(return_value=args)) as mock_args:
             with patch("casa_envoy.launchers.CalibrationLauncher.launch_casa") as cal_launcher:
                 palaver.main()
                 assert cal_launcher.call_count == 1
 
-        args.standard_cal = None
-
     @patch("json.loads")
     @patch("os.chdir")
     @patch("os.getcwd")
-    def test_main_img(self, mock_cwd, mock_chdir, mock_json):
+    def test_main_img(self, mock_cwd, mock_chdir, mock_json, args):
         """
         verifies use of correct launcher for images
 
@@ -143,12 +164,29 @@ class TestPalaver:
             "test/input_files/image-metadata.json",
             "test/input_files/cmsimage-PPR.xml",
         ]
-        args.vlass_img = None
-        args.parallel = None
 
         with patch("argparse.ArgumentParser.parse_args", MagicMock(return_value=args)) as mock_args:
             with patch("casa_envoy.launchers.ImagingLauncher.launch_casa") as img_launcher:
                 palaver.main()
                 assert img_launcher.call_count == 1
 
-        args.standard_img = None
+    @patch("json.loads")
+    @patch("os.chdir")
+    @patch("os.getcwd")
+    def test_main_restore(self, mock_cwd, mock_chdir, mock_json, args):
+        """
+        verifies use of correct launcher for restores
+
+        :param mock_cwd:
+        :param mock_chdir:
+        :param mock_json:
+        :return:
+        """
+        args.restore = [
+            "test/input_files/restore.json",
+        ]
+
+        with patch("argparse.ArgumentParser.parse_args", MagicMock(return_value=args)) as mock_args:
+            with patch("casa_envoy.launchers.CalibrationLauncher.launch_casa") as cal_launcher:
+                palaver.main()
+                assert cal_launcher.call_count == 1
-- 
GitLab