Coverage for python/lsst/obs/base/cli/butler_cmd_test.py: 49%
31 statements
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-17 02:53 -0700
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-17 02:53 -0700
1# This file is part of obs_base.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
22"""Base class for writing CLI butler command tests.
23"""
25__all__ = ("ButlerCmdTestBase",)
27import abc
29from lsst.daf.butler.cli import butler
30from lsst.daf.butler.cli.utils import LogCliRunner
31from lsst.utils import doImportType
34class ButlerCmdTestBase(metaclass=abc.ABCMeta):
35 """Base class for tests of butler command line interface subcommands.
36 Subclass from this, then `unittest.TestCase` to get a working test suite.
37 """
39 @property
40 @abc.abstractmethod
41 def instrumentClassName(self):
42 """The fully qualified instrument class name.
44 Returns
45 -------
46 `str`
47 The fully qualified instrument class name.
48 """
49 pass
51 @property
52 def secondInstrumentClassName(self):
53 """Optional; if provided the register-instrument test will try to
54 register two instruments.
56 Returns
57 -------
58 `str` or `None`
59 The fully qualified instrument class name.
60 """
62 @property
63 def instrument(self):
64 """The instrument class."""
65 return doImportType(self.instrumentClassName)
67 @property
68 def instrumentName(self):
69 """The name of the instrument.
71 Returns
72 -------
73 `str`
74 The name of the instrument.
75 """
76 return self.instrument.getName()
78 def test_cli(self):
79 runner = LogCliRunner()
80 with runner.isolated_filesystem():
81 result = runner.invoke(butler.cli, ["create", "here"])
82 self.assertEqual(result.exit_code, 0, f"output: {result.output} exception: {result.exception}")
83 registerInstrumentArgs = ["register-instrument", "here", self.instrumentClassName]
84 if self.secondInstrumentClassName is not None:
85 registerInstrumentArgs.append(self.secondInstrumentClassName)
86 result = runner.invoke(butler.cli, registerInstrumentArgs)
87 self.assertEqual(result.exit_code, 0, f"output: {result.output} exception: {result.exception}")
88 result = runner.invoke(
89 butler.cli,
90 ["write-curated-calibrations", "here", self.instrumentName, "--collection", "collection"],
91 )
92 self.assertEqual(result.exit_code, 0, f"output: {result.output} exception: {result.exception}")