Coverage for python/lsst/daf/butler/tests/mockeredTest.py : 57%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of daf_butler.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (http://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 <http://www.gnu.org/licenses/>.
22import abc
23import click
24import click.testing
25import copy
26import unittest
28from ..cli.utils import clickResultMsg, mockEnvVar, Mocker
29from ..cli import butler
32class MockeredTestBase(unittest.TestCase, abc.ABC):
33 """A test case base that is used to verify click command functions import
34 and call their respective script fucntions correctly.
35 """
37 @classmethod
38 @property
39 @abc.abstractmethod
40 def defaultExpected(cls):
41 pass
43 def setUp(self):
44 self.runner = click.testing.CliRunner(env=mockEnvVar)
46 def makeExpected(self, **kwargs):
47 expected = copy.copy(self.defaultExpected)
48 expected.update(kwargs)
49 return expected
51 def run_command(self, inputs):
52 """Use the CliRunner with the mock environment variable set to execute
53 a butler subcommand and parameters specified in inputs.
55 Parameters
56 ----------
57 inputs : [`str`]
58 A list of strings that begins with the subcommand name and is
59 followed by arguments, option keys and option values.
61 Returns
62 -------
63 result : `click.testing.Result`
64 The Result object contains the results from calling
65 self.runner.invoke.
66 """
67 return self.runner.invoke(butler.cli, inputs)
69 def run_test(self, inputs, expectedKwargs):
70 """Run the subcommand specified in inputs and verify a successful
71 outcome where exit code = 0 and the mock object has been called with
72 the expected arguments.
74 Parameters
75 ----------
76 inputs : [`str`]
77 A list of strings that begins with the subcommand name and is
78 followed by arguments, option keys and option values.
79 expectedKwargs : `dict` [`str`, `str`]
80 The arguments that the subcommand function is expected to have been
81 called with. Keys are the argument name and values are the argument
82 value.
83 """
84 result = self.run_command(inputs)
85 self.assertEqual(result.exit_code, 0, clickResultMsg(result))
86 Mocker.mock.assert_called_with(**expectedKwargs)
88 def run_missing(self, inputs, expectedMsg):
89 """Run the subcommand specified in inputs and verify a failed outcome
90 where exit code != 0 and an expected message has been written to
91 stdout.
93 Parameters
94 ----------
95 inputs : [`str`]
96 A list of strings that begins with the subcommand name and is
97 followed by arguments, option keys and option values.
98 expectedMsg : `str`
99 An error message that should be present in stdout after running the
100 subcommand.
101 """
102 result = self.run_command(inputs)
103 self.assertNotEqual(result.exit_code, 0, clickResultMsg(result))
104 self.assertIn(expectedMsg, result.stdout)