1#include <gtest/gtest.h>
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
13USERVER_NAMESPACE_BEGIN
17struct MapFromJsonSuccessTestParam {
18 std::string input = {};
20 ReadOptions options = {};
23struct MapFromJsonFailureTestParam {
24 std::string input = {};
25 ReadErrorCode expected_errc = {};
26 std::string expected_path = {};
27 ReadOptions options = {};
30void PrintTo(
const MapFromJsonSuccessTestParam& param, std::ostream* os) {
31 *os << fmt::format(
"{{ input = '{}' }}", param.input);
34void PrintTo(
const MapFromJsonFailureTestParam& param, std::ostream* os) {
35 *os << fmt::format(
"{{ input = '{}' }}", param.input);
38class MapFromJsonSuccessTest :
public ::testing::TestWithParam<MapFromJsonSuccessTestParam> {};
39class MapFromJsonFailureTest :
public ::testing::TestWithParam<MapFromJsonFailureTestParam> {};
41INSTANTIATE_TEST_SUITE_P(
43 MapFromJsonSuccessTest,
45 MapFromJsonSuccessTestParam{R"({})", MapMessageData{}},
46 MapFromJsonSuccessTestParam{
47 R"({"field1":{},"field2":{},"field3":{},"field4":{},"field5":{},"field6":{},"field7":{}})",
50 MapFromJsonSuccessTestParam{
52 "field1":{"1":2,"3":4,"5":6},
53 "field2":{"10":1.5,"20":1.5},
54 "field3":{"100":true,"200":false},
55 "field4":{"1000":"hello","2000":"world"},
56 "field5":{"true":"TEST_ENUM_VALUE1","false":"TEST_ENUM_VALUE0"},
57 "field6":{"aaa":{"field1":true},"bbb":{}},
58 "field7":{"ccc":"10.000000999s"}
59 })",
61 .field1 = {{1, 2}, {3, 4}, {5, 6}},
62 .field2 = {{10, 1.5}, {20, 1.5}},
63 .field3 = {{100,
true}, {200,
false}},
64 .field4 = {{1000,
"hello"}, {2000,
"world"}},
66 {{
true, proto_json::messages::MapMessage::TEST_ENUM_VALUE1},
67 {
false, proto_json::messages::MapMessage::TEST_ENUM_VALUE0}},
68 .field6 = {{
"aaa", {
true}}, {
"bbb", {
false}}},
69 .field7 = {{
"ccc", {.seconds = 10, .nanos = 999}}}
72 MapFromJsonSuccessTestParam{
73 R"({"field5":{"true":0,"false":1}})",
76 {{
true, proto_json::messages::MapMessage::TEST_ENUM_VALUE0},
77 {
false, proto_json::messages::MapMessage::TEST_ENUM_VALUE1}}
83INSTANTIATE_TEST_SUITE_P(
85 MapFromJsonFailureTest,
87 MapFromJsonFailureTestParam{R"({"field1":[]})", ReadErrorCode::kInvalidType,
"field1"},
88 MapFromJsonFailureTestParam{R"({"field2":1})", ReadErrorCode::kInvalidType,
"field2"},
89 MapFromJsonFailureTestParam{R"({"field3":true})", ReadErrorCode::kInvalidType,
"field3"},
90 MapFromJsonFailureTestParam{R"({"field7":"test"})", ReadErrorCode::kInvalidType,
"field7"},
91 MapFromJsonFailureTestParam{R"({"field1":{"":1}})", ReadErrorCode::kInvalidValue,
"field1.''"},
92 MapFromJsonFailureTestParam{
93 R"({"field2":{"10":1.5,"-10":0,"0":0}})",
94 ReadErrorCode::kInvalidValue,
97 MapFromJsonFailureTestParam{
98 R"({"field3":{"10":true,"10x":false}})",
99 ReadErrorCode::kInvalidValue,
102 MapFromJsonFailureTestParam{R"({"field4":{"1.5":"hello"}})", ReadErrorCode::kInvalidValue,
"field4.'1.5'"},
103 MapFromJsonFailureTestParam{R"({"field5":{"TRUE":0}})", ReadErrorCode::kInvalidValue,
"field5.TRUE"},
104 MapFromJsonFailureTestParam{R"({"field7":{"aaa":"oops"}})", ReadErrorCode::kInvalidValue,
"field7.aaa"}
108TEST_P(MapFromJsonSuccessTest, Test) {
109 using Message = proto_json::messages::MapMessage;
110 const auto& param = GetParam();
112 Message message, expected_message, sample_message;
113 formats::json::Value input = PrepareJsonTestData(param.input);
114 expected_message = PrepareTestData(param.expected_message);
116 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, param.options)));
117 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
119 CheckMessageEqual(message, sample_message);
120 CheckMessageEqual(message, expected_message);
123TEST_P(MapFromJsonFailureTest, Test) {
124 using Message = proto_json::messages::MapMessage;
125 const auto& param = GetParam();
128 formats::json::Value input = PrepareJsonTestData(param.input);
130 EXPECT_READ_ERROR((
void)JsonToMessage<Message>(input, param.options), param.expected_errc, param.expected_path);
131 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample), SampleError);