1#include <gtest/gtest.h>
8#include <userver/formats/json/serialize.hpp>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
18struct PresenceToJsonTestParam {
20 std::string expected_json = {};
21 WriteOptions options = {};
24struct PresenceFromJsonTestParam {
25 std::string input = {};
29void PrintTo(
const PresenceFromJsonTestParam& param, std::ostream* os) {
30 *os << fmt::format(
"{{ input = '{}' }}", param.input);
33class PresenceToJsonTest :
public ::testing::TestWithParam<PresenceToJsonTestParam> {};
34class PresenceFromJsonTest :
public ::testing::TestWithParam<PresenceFromJsonTestParam> {};
36INSTANTIATE_TEST_SUITE_P(
40 PresenceToJsonTestParam{PresenceMessageData{}, R"({})"},
41 PresenceToJsonTestParam{
42 PresenceMessageData{},
43 R"({"field1":false,"field4":[],"field5":{}})",
44 {.always_print_fields_with_no_presence =
true}
46 PresenceToJsonTestParam{
47 PresenceMessageData{
true,
false, Int32MessageData{1, 2, 3}, {
false,
false}, {{1,
false}, {2,
false}}},
49 "field1":true,
50 "field2":false,
51 "field3":{"field1":1,"field2":2,"field3":3},
52 "field4":[false,false],
53 "field5":{"1":false,"2":false}
54 })"
56 PresenceToJsonTestParam{
57 PresenceMessageData{
true,
false, Int32MessageData{1, 2, 3}, {
false,
false}, {{1,
false}, {2,
false}}},
59 "field1":true,
60 "field2":false,
61 "field3":{"field1":1,"field2":2,"field3":3},
62 "field4":[false,false],
63 "field5":{"1":false,"2":false}
64 })",
65 {.always_print_fields_with_no_presence =
true}
67 PresenceToJsonTestParam{
68 PresenceMessageData{
false, std::nullopt, Int32MessageData{0, 0, 0}, {
true}, {}},
70 "field3":{},
71 "field4":[true]
72 })"
74 PresenceToJsonTestParam{
75 PresenceMessageData{
false, std::nullopt, Int32MessageData{0, 0, 0}, {
true}, {}},
77 "field1":false,
78 "field3":{"field1":0,"field2":0,"field3":0},
79 "field4":[true],
80 "field5":{}
81 })",
82 {.always_print_fields_with_no_presence =
true}
87INSTANTIATE_TEST_SUITE_P(
91 PresenceFromJsonTestParam{R"({})", PresenceMessageData{}},
92 PresenceFromJsonTestParam{R"({"field1":false,"field2":false})", PresenceMessageData{.field2 =
false}},
93 PresenceFromJsonTestParam{
94 R"({"field1":false,"field2":false,"field3":{}})",
95 PresenceMessageData{.field2 =
false, .field3 = Int32MessageData{}}
97 PresenceFromJsonTestParam{
98 R"({"field1":false,"field2":false,"field3":{"field1":0,"field2":0,"field3":0}})",
99 PresenceMessageData{.field2 =
false, .field3 = Int32MessageData{}}
101 PresenceFromJsonTestParam{
103 "field1":true,
104 "field2":false,
105 "field3":{"field1":1,"field2":2,"field3":3},
106 "field4":[false],
107 "field5":{"1":false}})",
108 PresenceMessageData{
true,
false, Int32MessageData{1, 2, 3}, {
false}, {{1,
false}}}
113TEST_P(PresenceToJsonTest, Test) {
114 const auto& param = GetParam();
116 auto input = PrepareTestData(param.input);
117 formats::json::Value json, expected_json, sample_json;
119 UASSERT_NO_THROW((json = MessageToJson(input, param.options)));
120 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
121 UASSERT_NO_THROW((sample_json = CreateSampleJson(input, param.options)));
123 EXPECT_EQ(json, expected_json);
124 EXPECT_EQ(expected_json, sample_json);
127TEST_P(PresenceFromJsonTest, Test) {
128 using Message = proto_json::messages::PresenceMessage;
129 const auto& param = GetParam();
131 Message message, expected_message, sample_message;
132 formats::json::Value input = PrepareJsonTestData(param.input);
133 expected_message = PrepareTestData(param.expected_message);
135 UASSERT_NO_THROW((message = JsonToMessage<Message>(input)));
136 UASSERT_NO_THROW(InitSampleMessage(param.input, {}, sample_message));
138 CheckMessageEqual(message, sample_message);
139 CheckMessageEqual(message, expected_message);