1#include <gtest/gtest.h>
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
13USERVER_NAMESPACE_BEGIN
15namespace protobuf::json::tests {
17struct UnknownJsonFieldAcceptedTestParam {
18 std::string input = {};
22struct UnknownJsonFieldRejectedTestParam {
23 std::string input = {};
24 std::string expected_path = {};
27void PrintTo(
const UnknownJsonFieldAcceptedTestParam& param, std::ostream* os) {
28 *os << fmt::format(
"{{ input = '{}' }}", param.input);
31void PrintTo(
const UnknownJsonFieldRejectedTestParam& param, std::ostream* os) {
32 *os << fmt::format(
"{{ input = '{}' }}", param.input);
35class UnknownJsonFieldAcceptedTest :
public ::testing::TestWithParam<UnknownJsonFieldAcceptedTestParam> {};
36class UnknownJsonFieldRejectedTest :
public ::testing::TestWithParam<UnknownJsonFieldRejectedTestParam> {};
38INSTANTIATE_TEST_SUITE_P(
40 UnknownJsonFieldAcceptedTest,
42 UnknownJsonFieldAcceptedTestParam{
44 "field1":{"field1":"aaa"},
45 "field2":[{"field1":"item1"}],
46 "field3":{"1":{"field1":"value1"}}
47 })",
48 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
50 UnknownJsonFieldAcceptedTestParam{
52 "unknown_field": true,
53 "field1":{"field1":"aaa"},
54 "field2":[{"field1":"item1"}],
55 "field3":{"1":{"field1":"value1"}}
56 })",
57 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
59 UnknownJsonFieldAcceptedTestParam{
61 "field1":{"field1":"aaa","unknown_field":true},
62 "field2":[{"field1":"item1"}],
63 "field3":{"1":{"field1":"value1"}}
64 })",
65 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
67 UnknownJsonFieldAcceptedTestParam{
69 "field1":{"field1":"aaa"},
70 "field2":[{"field1":"item1","unknown_field":true}],
71 "field3":{"1":{"field1":"value1"}}
72 })",
73 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
75 UnknownJsonFieldAcceptedTestParam{
77 "field1":{"field1":"aaa"},
78 "field2":[{"field1":"item1"}],
79 "field3":{"1":{"field1":"value1","unknown_field":true}}
80 })",
81 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
86INSTANTIATE_TEST_SUITE_P(
88 UnknownJsonFieldRejectedTest,
90 UnknownJsonFieldRejectedTestParam{
92 "unknown.field": true,
93 "field1":{"field1":"aaa"},
94 "field2":[{"field1":"item1"}],
95 "field3":{"1":{"field1":"value1"}}
96 })",
99 UnknownJsonFieldRejectedTestParam{
101 "field1":{"field1":"aaa","unknown.field":true},
102 "field2":[{"field1":"item1"}],
103 "field3":{"1":{"field1":"value1"}}
104 })",
105 "field1.'unknown.field'"
107 UnknownJsonFieldRejectedTestParam{
109 "field1":{"field1":"aaa"},
110 "field2":[{"field1":"item1","unknown.field":true}],
111 "field3":{"1":{"field1":"value1"}}
112 })",
113 "field2[0].'unknown.field'",
115 UnknownJsonFieldRejectedTestParam{
117 "field1":{"field1":"aaa"},
118 "field2":[{"field1":"item1"}],
119 "field3":{"1":{"field1":"value1","unknown.field":true}}
120 })",
121 "field3.1.'unknown.field'"
126TEST_P(UnknownJsonFieldAcceptedTest, Test) {
127 using Message = proto_json::messages::UnknownFieldMessage;
128 const auto& param = GetParam();
131 Message expected_message;
132 Message sample_message;
133 formats::json::
Value input = PrepareJsonTestData(param.input);
134 expected_message = PrepareTestData(param.expected_message);
136 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, {.ignore_unknown_fields =
true})));
137 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, {.ignore_unknown_fields =
true}));
139 CheckMessageEqual(message, sample_message);
140 CheckMessageEqual(message, expected_message);
143TEST_P(UnknownJsonFieldRejectedTest, Test) {
144 using Message = proto_json::messages::UnknownFieldMessage;
145 const auto& param = GetParam();
148 formats::json::
Value input = PrepareJsonTestData(param.input);
151 (
void)JsonToMessage<proto_json::messages::UnknownFieldMessage>(input, {.ignore_unknown_fields =
false}),
152 ParseErrorCode::kUnknownField,
155 UEXPECT_THROW(InitSampleMessage(param.input, sample, {.ignore_unknown_fields =
false}), SampleError);