Hide keyboard shortcuts

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/>. 

21 

22import abc 

23import click 

24import click.testing 

25import copy 

26import unittest 

27 

28from ..cli.utils import clickResultMsg, mockEnvVar, Mocker 

29from ..cli import butler 

30 

31 

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 """ 

36 

37 @classmethod 

38 @property 

39 @abc.abstractmethod 

40 def defaultExpected(cls): 

41 pass 

42 

43 def setUp(self): 

44 self.runner = click.testing.CliRunner(env=mockEnvVar) 

45 

46 def makeExpected(self, **kwargs): 

47 expected = copy.copy(self.defaultExpected) 

48 expected.update(kwargs) 

49 return expected 

50 

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. 

54 

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. 

60 

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) 

68 

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. 

73 

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) 

87 

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. 

92 

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)