From 16f86e67225bea4be23b90ae7ead6a4f8da36a61 Mon Sep 17 00:00:00 2001 From: John Mulligan Date: Mon, 11 Apr 2022 14:38:52 -0400 Subject: [PATCH] pybind/mgr: add test cases for Responder type Signed-off-by: John Mulligan (cherry picked from commit 76492408dcf18197162bf9220300c2f70701528b) --- src/pybind/mgr/tests/test_object_format.py | 80 +++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/pybind/mgr/tests/test_object_format.py b/src/pybind/mgr/tests/test_object_format.py index 6587955d49cbe..4e8355100d21b 100644 --- a/src/pybind/mgr/tests/test_object_format.py +++ b/src/pybind/mgr/tests/test_object_format.py @@ -1,4 +1,11 @@ -from typing import Any, Dict, Type, TypeVar +from typing import ( + Any, + Dict, + Optional, + Tuple, + Type, + TypeVar, +) import pytest @@ -137,3 +144,74 @@ def test_valid_formats(): assert "yaml" in vf assert "xml" in vf assert "plain" in vf + + +def test_error_response_exceptions(): + err = object_format.ErrorResponseBase() + with pytest.raises(NotImplementedError): + err.format_response() + + err = object_format.UnsupportedFormat("cheese") + assert err.format_response() == (-22, "", "Unsupported format: cheese") + + err = object_format.UnknownFormat("chocolate") + assert err.format_response() == (-22, "", "Unknown format name: chocolate") + + +@pytest.mark.parametrize( + "value, format, result", + [ + ({}, None, (0, "{}", "")), + ({"blat": True}, "json", (0, '{\n "blat": true\n}', "")), + ({"blat": True}, "yaml", (0, "blat: true\n", "")), + ({"blat": True}, "toml", (-22, "", "Unknown format name: toml")), + ({"blat": True}, "xml", (-22, "", "Unsupported format: xml")), + ( + JSONer("hoop", "303"), + "yaml", + (0, "name: hoop\nvalue: '303'\nversion: 1\n", ""), + ), + ], +) +def test_responder_decorator_default( + value: Any, format: Optional[str], result: Tuple[int, str, str] +) -> None: + @object_format.Responder() + def orf_value(format: Optional[str] = None): + return value + + assert orf_value(format=format) == result + + +class PhonyMultiYAMLFormatAdapter(object_format.ObjectFormatAdapter): + """This adapter puts a yaml document/directive separator line + before all output. It doesn't actully support multiple documents. + """ + def format_yaml(self): + yml = super().format_yaml() + return "---\n{}".format(yml) + + +@pytest.mark.parametrize( + "value, format, result", + [ + ({}, None, (0, "{}", "")), + ({"blat": True}, "json", (0, '{\n "blat": true\n}', "")), + ({"blat": True}, "yaml", (0, "---\nblat: true\n", "")), + ({"blat": True}, "toml", (-22, "", "Unknown format name: toml")), + ({"blat": True}, "xml", (-22, "", "Unsupported format: xml")), + ( + JSONer("hoop", "303"), + "yaml", + (0, "---\nname: hoop\nvalue: '303'\nversion: 1\n", ""), + ), + ], +) +def test_responder_decorator_custom( + value: Any, format: Optional[str], result: Tuple[int, str, str] +) -> None: + @object_format.Responder(PhonyMultiYAMLFormatAdapter) + def orf_value(format: Optional[str] = None): + return value + + assert orf_value(format=format) == result -- 2.39.5