From: John Mulligan Date: Mon, 11 Apr 2022 19:16:48 +0000 (-0400) Subject: pybind/mgr: add tests to verify Responder decorator behavior X-Git-Tag: v18.0.0~841^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1800f30f04fcb24b3c02afb7122d7e1993c05cb3;p=ceph.git pybind/mgr: add tests to verify Responder decorator behavior Signed-off-by: John Mulligan --- diff --git a/src/pybind/mgr/tests/test_object_format.py b/src/pybind/mgr/tests/test_object_format.py index 4e8355100d21..47af1dc3499b 100644 --- a/src/pybind/mgr/tests/test_object_format.py +++ b/src/pybind/mgr/tests/test_object_format.py @@ -9,6 +9,7 @@ from typing import ( import pytest +from mgr_module import CLICommand import object_format @@ -215,3 +216,177 @@ def test_responder_decorator_custom( return value assert orf_value(format=format) == result + + +class FancyDemoAdapter(PhonyMultiYAMLFormatAdapter): + """This adapter demonstrates adding formatting for other formats + like xml and plain text. + """ + def format_xml(self) -> str: + name = self.obj.get("name") + size = self.obj.get("size") + return f'' + + def format_plain(self) -> str: + name = self.obj.get("name") + size = self.obj.get("size") + es = 'es' if size != 1 else '' + return f"{size} box{es} of {name}" + + +class DecoDemo: + """Class to stand in for a mgr module, used to test CLICommand integration.""" + + @CLICommand("alpha one", perm="rw") + @object_format.Responder() + def alpha_one(self, name: str = "default") -> Dict[str, str]: + return { + "alpha": "one", + "name": name, + "weight": 300, + } + + @CLICommand("beta two", perm="r") + @object_format.Responder() + def beta_two( + self, name: str = "default", format: Optional[str] = None + ) -> Dict[str, str]: + return { + "beta": "two", + "name": name, + "weight": 72, + } + + @CLICommand("gamma three", perm="rw") + @object_format.Responder(FancyDemoAdapter) + def gamma_three(self, size: int = 0) -> Dict[str, Any]: + return {"name": "funnystuff", "size": size} + + +@pytest.mark.parametrize( + "prefix, args, response", + [ + ( + "alpha one", + {"name": "moonbase"}, + ( + 0, + '{\n "alpha": "one",\n "name": "moonbase",\n "weight": 300\n}', + "", + ), + ), + # --- + ( + "alpha one", + {"name": "moonbase2", "format": "yaml"}, + ( + 0, + "alpha: one\nname: moonbase2\nweight: 300\n", + "", + ), + ), + # --- + ( + "alpha one", + {"name": "moonbase2", "format": "chocolate"}, + ( + -22, + "", + "Unknown format name: chocolate", + ), + ), + # --- + ( + "beta two", + {"name": "blocker"}, + ( + 0, + '{\n "beta": "two",\n "name": "blocker",\n "weight": 72\n}', + "", + ), + ), + # --- + ( + "beta two", + {"name": "test", "format": "yaml"}, + ( + 0, + "beta: two\nname: test\nweight: 72\n", + "", + ), + ), + # --- + ( + "beta two", + {"name": "test", "format": "plain"}, + ( + -22, + "", + "Unsupported format: plain", + ), + ), + # --- + ( + "gamma three", + {}, + ( + 0, + '{\n "name": "funnystuff",\n "size": 0\n}', + "", + ), + ), + # --- + ( + "gamma three", + {"size": 1, "format": "json"}, + ( + 0, + '{\n "name": "funnystuff",\n "size": 1\n}', + "", + ), + ), + # --- + ( + "gamma three", + {"size": 1, "format": "plain"}, + ( + 0, + "1 box of funnystuff", + "", + ), + ), + # --- + ( + "gamma three", + {"size": 2, "format": "plain"}, + ( + 0, + "2 boxes of funnystuff", + "", + ), + ), + # --- + ( + "gamma three", + {"size": 2, "format": "xml"}, + ( + 0, + '', + "", + ), + ), + # --- + ( + "gamma three", + {"size": 2, "format": "toml"}, + ( + -22, + "", + "Unknown format name: toml", + ), + ), + ], +) +def test_cli_command_responder(prefix, args, response): + dd = DecoDemo() + assert CLICommand.COMMANDS[prefix].call(dd, args, None) == response