1#include <gtest/gtest.h>
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
13USERVER_NAMESPACE_BEGIN
17struct RepeatedFromJsonSuccessTestParam {
18 std::string input = {};
20 ReadOptions options = {};
23struct RepeatedFromJsonFailureTestParam {
24 std::string input = {};
25 ReadErrorCode expected_errc = {};
26 std::string expected_path = {};
27 ReadOptions options = {};
32 bool skip_native_check =
false;
35void PrintTo(
const RepeatedFromJsonSuccessTestParam& param, std::ostream* os) {
36 *os << fmt::format(
"{{ input = '{}' }}", param.input);
39void PrintTo(
const RepeatedFromJsonFailureTestParam& param, std::ostream* os) {
40 *os << fmt::format(
"{{ input = '{}' }}", param.input);
43class RepeatedFromJsonSuccessTest :
public ::testing::TestWithParam<RepeatedFromJsonSuccessTestParam> {};
44class RepeatedFromJsonFailureTest :
public ::testing::TestWithParam<RepeatedFromJsonFailureTestParam> {};
46INSTANTIATE_TEST_SUITE_P(
48 RepeatedFromJsonSuccessTest,
50 RepeatedFromJsonSuccessTestParam{R"({})", RepeatedMessageData{}},
51 RepeatedFromJsonSuccessTestParam{R"({"field1":[],"field2":[],"field3":[]})", RepeatedMessageData{}},
52 RepeatedFromJsonSuccessTestParam{R"({"field1":null,"field2":null,"field3":null})", RepeatedMessageData{}},
53 RepeatedFromJsonSuccessTestParam{
55 "field1":[100,0,200],
56 "field2":[{"field1":true},{"field1":false}],
57 "field3":["123.987s","0s","-987s"]
58 })",
62 {{.seconds = 123, .nanos = 987'000'000}, {}, {.seconds = -987}}
68INSTANTIATE_TEST_SUITE_P(
70 RepeatedFromJsonFailureTest,
72 RepeatedFromJsonFailureTestParam{R"({"field1":{}})", ReadErrorCode::kInvalidType,
"field1"},
73 RepeatedFromJsonFailureTestParam{
75 ReadErrorCode::kInvalidType,
80 RepeatedFromJsonFailureTestParam{R"({"field2":true})", ReadErrorCode::kInvalidType,
"field2", {},
true},
81 RepeatedFromJsonFailureTestParam{R"({"field3":"test"})", ReadErrorCode::kInvalidType,
"field3", {},
true},
82 RepeatedFromJsonFailureTestParam{
83 R"({"field1":[1, null, 2]})",
84 ReadErrorCode::kInvalidValue,
89 RepeatedFromJsonFailureTestParam{R"({"field2":[null]})", ReadErrorCode::kInvalidValue,
"field2[0]", {},
true},
90 RepeatedFromJsonFailureTestParam{
91 R"({"field3":["123.100s", "-123.100s", null]})",
92 ReadErrorCode::kInvalidValue,
97 RepeatedFromJsonFailureTestParam{
98 R"({"field2":[{"field1":true},"oops"]})",
99 ReadErrorCode::kInvalidType,
102 RepeatedFromJsonFailureTestParam{
103 R"({"field3":["123.100s", "oops"]})",
104 ReadErrorCode::kInvalidValue,
110TEST_P(RepeatedFromJsonSuccessTest, Test) {
111 using Message = proto_json::messages::RepeatedMessage;
112 const auto& param = GetParam();
114 Message message, expected_message, sample_message;
115 formats::json::Value input = PrepareJsonTestData(param.input);
116 expected_message = PrepareTestData(param.expected_message);
118 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, param.options)));
119 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
121 CheckMessageEqual(message, sample_message);
122 CheckMessageEqual(message, expected_message);
125TEST_P(RepeatedFromJsonFailureTest, Test) {
126 using Message = proto_json::messages::RepeatedMessage;
127 const auto& param = GetParam();
130 formats::json::Value input = PrepareJsonTestData(param.input);
132 EXPECT_READ_ERROR((
void)JsonToMessage<Message>(input, param.options), param.expected_errc, param.expected_path);
134 if (!param.skip_native_check) {
135 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample), SampleError);