1#include <gtest/gtest.h>
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
13USERVER_NAMESPACE_BEGIN
17struct UnkownJsonFieldAcceptedTestParam {
18 std::string input = {};
22struct UnkownJsonFieldRejectedTestParam {
23 std::string input = {};
24 std::string expected_path = {};
27void PrintTo(
const UnkownJsonFieldAcceptedTestParam& param, std::ostream* os) {
28 *os << fmt::format(
"{{ input = '{}' }}", param.input);
31void PrintTo(
const UnkownJsonFieldRejectedTestParam& param, std::ostream* os) {
32 *os << fmt::format(
"{{ input = '{}' }}", param.input);
35class UnkownJsonFieldAcceptedTest :
public ::testing::TestWithParam<UnkownJsonFieldAcceptedTestParam> {};
36class UnkownJsonFieldRejectedTest :
public ::testing::TestWithParam<UnkownJsonFieldRejectedTestParam> {};
38INSTANTIATE_TEST_SUITE_P(
40 UnkownJsonFieldAcceptedTest,
42 UnkownJsonFieldAcceptedTestParam{
44 "field1":{"field1":"aaa"},
45 "field2":[{"field1":"item1"}],
46 "field3":{"1":{"field1":"value1"}}
47 })",
48 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
50 UnkownJsonFieldAcceptedTestParam{
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 UnkownJsonFieldAcceptedTestParam{
61 "field1":{"field1":"aaa","unknown_field":true},
62 "field2":[{"field1":"item1"}],
63 "field3":{"1":{"field1":"value1"}}
64 })",
65 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
67 UnkownJsonFieldAcceptedTestParam{
69 "field1":{"field1":"aaa"},
70 "field2":[{"field1":"item1","unknown_field":true}],
71 "field3":{"1":{"field1":"value1"}}
72 })",
73 UnknownFieldMessageData{{
"aaa"}, {{
"item1"}}, {{1, {
"value1"}}}}
75 UnkownJsonFieldAcceptedTestParam{
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 UnkownJsonFieldRejectedTest,
90 UnkownJsonFieldRejectedTestParam{
92 "unknown_field": true,
93 "field1":{"field1":"aaa"},
94 "field2":[{"field1":"item1"}],
95 "field3":{"1":{"field1":"value1"}}
96 })",
99 UnkownJsonFieldRejectedTestParam{
101 "field1":{"field1":"aaa","unknown_field":true},
102 "field2":[{"field1":"item1"}],
103 "field3":{"1":{"field1":"value1"}}
104 })",
105 "field1.unknown_field"
107 UnkownJsonFieldRejectedTestParam{
109 "field1":{"field1":"aaa"},
110 "field2":[{"field1":"item1","unknown_field":true}],
111 "field3":{"1":{"field1":"value1"}}
112 })",
113 "field2[0].unknown_field",
115 UnkownJsonFieldRejectedTestParam{
117 "field1":{"field1":"aaa"},
118 "field2":[{"field1":"item1"}],
119 "field3":{"1":{"field1":"value1","unknown_field":true}}
120 })",
121 "field3.1.unknown_field"
126TEST_P(UnkownJsonFieldAcceptedTest, Test) {
127 using Message = proto_json::messages::UnknownFieldMessage;
128 const auto& param = GetParam();
130 Message message, expected_message, sample_message;
131 formats::json::Value input = PrepareJsonTestData(param.input);
132 expected_message = PrepareTestData(param.expected_message);
134 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, {.ignore_unknown_fields =
true})));
135 UASSERT_NO_THROW(InitSampleMessage(param.input, {.ignore_unknown_fields =
true}, sample_message));
137 CheckMessageEqual(message, sample_message);
138 CheckMessageEqual(message, expected_message);
141TEST_P(UnkownJsonFieldRejectedTest, Test) {
142 using Message = proto_json::messages::UnknownFieldMessage;
143 const auto& param = GetParam();
146 formats::json::Value input = PrepareJsonTestData(param.input);
149 (
void)JsonToMessage<proto_json::messages::UnknownFieldMessage>(input, {.ignore_unknown_fields =
false}),
150 ReadErrorCode::kUnknownField,
153 UEXPECT_THROW(InitSampleMessage(param.input, {.ignore_unknown_fields =
false}, sample), SampleError);