userver: /data/code/userver/libraries/protobuf/tests/json/map_from_json_test.cpp Source File
Loading...
Searching...
No Matches
map_from_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <ostream>
4#include <string>
5
6#include <fmt/format.h>
7
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
10
11#include "utils.hpp"
12
13USERVER_NAMESPACE_BEGIN
14
15namespace protobuf::json::tests {
16
17struct MapFromJsonSuccessTestParam {
18 std::string input = {};
19 MapMessageData expected_message = {};
20 ReadOptions options = {};
21};
22
23struct MapFromJsonFailureTestParam {
24 std::string input = {};
25 ReadErrorCode expected_errc = {};
26 std::string expected_path = {};
27 ReadOptions options = {};
28};
29
30void PrintTo(const MapFromJsonSuccessTestParam& param, std::ostream* os) {
31 *os << fmt::format("{{ input = '{}' }}", param.input);
32}
33
34void PrintTo(const MapFromJsonFailureTestParam& param, std::ostream* os) {
35 *os << fmt::format("{{ input = '{}' }}", param.input);
36}
37
38class MapFromJsonSuccessTest : public ::testing::TestWithParam<MapFromJsonSuccessTestParam> {};
39class MapFromJsonFailureTest : public ::testing::TestWithParam<MapFromJsonFailureTestParam> {};
40
41INSTANTIATE_TEST_SUITE_P(
42 ,
43 MapFromJsonSuccessTest,
44 ::testing::Values(
45 MapFromJsonSuccessTestParam{R"({})", MapMessageData{}},
46 MapFromJsonSuccessTestParam{
47 R"({"field1":{},"field2":{},"field3":{},"field4":{},"field5":{},"field6":{},"field7":{}})",
48 MapMessageData{}
49 },
50 MapFromJsonSuccessTestParam{
51 R"({
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 })",
60 MapMessageData{
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"}},
65 .field5 =
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}}}
70 }
71 },
72 MapFromJsonSuccessTestParam{
73 R"({"field5":{"true":0,"false":1}})",
74 MapMessageData{
75 .field5 =
76 {{true, proto_json::messages::MapMessage::TEST_ENUM_VALUE0},
77 {false, proto_json::messages::MapMessage::TEST_ENUM_VALUE1}}
78 }
79 }
80 )
81);
82
83INSTANTIATE_TEST_SUITE_P(
84 ,
85 MapFromJsonFailureTest,
86 ::testing::Values(
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,
95 "field2.-10"
96 },
97 MapFromJsonFailureTestParam{
98 R"({"field3":{"10":true,"10x":false}})",
99 ReadErrorCode::kInvalidValue,
100 "field3.10x"
101 },
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"}
105 )
106);
107
108TEST_P(MapFromJsonSuccessTest, Test) {
109 using Message = proto_json::messages::MapMessage;
110 const auto& param = GetParam();
111
112 Message message, expected_message, sample_message;
113 formats::json::Value input = PrepareJsonTestData(param.input);
114 expected_message = PrepareTestData(param.expected_message);
115
116 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, param.options)));
117 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
118
119 CheckMessageEqual(message, sample_message);
120 CheckMessageEqual(message, expected_message);
121}
122
123TEST_P(MapFromJsonFailureTest, Test) {
124 using Message = proto_json::messages::MapMessage;
125 const auto& param = GetParam();
126
127 Message sample;
128 formats::json::Value input = PrepareJsonTestData(param.input);
129
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);
132}
133
134} // namespace protobuf::json::tests
135
136USERVER_NAMESPACE_END