userver: /data/code/userver/libraries/protobuf/tests/json/presence_test.cpp Source File
Loading...
Searching...
No Matches
presence_test.cpp
1#include <gtest/gtest.h>
2
3#include <ostream>
4#include <string>
5
6#include <fmt/format.h>
7
8#include <userver/formats/json/serialize.hpp>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
11
12#include "utils.hpp"
13
14USERVER_NAMESPACE_BEGIN
15
16namespace protobuf::json::tests {
17
18struct PresenceToJsonTestParam {
19 PresenceMessageData input = {};
20 std::string expected_json = {};
21 WriteOptions options = {};
22};
23
24struct PresenceFromJsonTestParam {
25 std::string input = {};
26 PresenceMessageData expected_message = {};
27};
28
29void PrintTo(const PresenceFromJsonTestParam& param, std::ostream* os) {
30 *os << fmt::format("{{ input = '{}' }}", param.input);
31}
32
33class PresenceToJsonTest : public ::testing::TestWithParam<PresenceToJsonTestParam> {};
34class PresenceFromJsonTest : public ::testing::TestWithParam<PresenceFromJsonTestParam> {};
35
36INSTANTIATE_TEST_SUITE_P(
37 ,
38 PresenceToJsonTest,
39 ::testing::Values(
40 PresenceToJsonTestParam{PresenceMessageData{}, R"({})"},
41 PresenceToJsonTestParam{
42 PresenceMessageData{},
43 R"({"field1":false,"field4":[],"field5":{}})",
44 {.always_print_fields_with_no_presence = true}
45 },
46 PresenceToJsonTestParam{
47 PresenceMessageData{true, false, Int32MessageData{1, 2, 3}, {false, false}, {{1, false}, {2, false}}},
48 R"({
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 })"
55 },
56 PresenceToJsonTestParam{
57 PresenceMessageData{true, false, Int32MessageData{1, 2, 3}, {false, false}, {{1, false}, {2, false}}},
58 R"({
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}
66 },
67 PresenceToJsonTestParam{
68 PresenceMessageData{false, std::nullopt, Int32MessageData{0, 0, 0}, {true}, {}},
69 R"({
70 "field3":{},
71 "field4":[true]
72 })"
73 },
74 PresenceToJsonTestParam{
75 PresenceMessageData{false, std::nullopt, Int32MessageData{0, 0, 0}, {true}, {}},
76 R"({
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}
83 }
84 )
85);
86
87INSTANTIATE_TEST_SUITE_P(
88 ,
89 PresenceFromJsonTest,
90 ::testing::Values(
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{}}
96 },
97 PresenceFromJsonTestParam{
98 R"({"field1":false,"field2":false,"field3":{"field1":0,"field2":0,"field3":0}})",
99 PresenceMessageData{.field2 = false, .field3 = Int32MessageData{}}
100 },
101 PresenceFromJsonTestParam{
102 R"({
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}}}
109 }
110 )
111);
112
113TEST_P(PresenceToJsonTest, Test) {
114 const auto& param = GetParam();
115
116 auto input = PrepareTestData(param.input);
117 formats::json::Value json, expected_json, sample_json;
118
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)));
122
123 EXPECT_EQ(json, expected_json);
124 EXPECT_EQ(expected_json, sample_json);
125}
126
127TEST_P(PresenceFromJsonTest, Test) {
128 using Message = proto_json::messages::PresenceMessage;
129 const auto& param = GetParam();
130
131 Message message, expected_message, sample_message;
132 formats::json::Value input = PrepareJsonTestData(param.input);
133 expected_message = PrepareTestData(param.expected_message);
134
135 UASSERT_NO_THROW((message = JsonToMessage<Message>(input)));
136 UASSERT_NO_THROW(InitSampleMessage(param.input, {}, sample_message));
137
138 CheckMessageEqual(message, sample_message);
139 CheckMessageEqual(message, expected_message);
140}
141
142} // namespace protobuf::json::tests
143
144USERVER_NAMESPACE_END