userver: /data/code/userver/libraries/protobuf/tests/json/complex_to_json_test.cpp Source File
Loading...
Searching...
No Matches
complex_to_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <google/protobuf/util/json_util.h>
4
5#include <userver/formats/json/serialize.hpp>
6#include <userver/protobuf/json/convert.hpp>
7#include <userver/utest/assert_macros.hpp>
8
9#include "utils.hpp"
10
11USERVER_NAMESPACE_BEGIN
12
13namespace protobuf::json::tests {
14
15using ProtobufStringType =
16 decltype(std::declval<::google::protobuf::Reflection>()
17 .GetString(std::declval<const ::google::protobuf::Message&>(), nullptr));
18
19TEST(ComplexToJsonSuccessTest, Test) {
20 proto_json::messages::ComplexMessage message;
21 proto_json::messages::ComplexMessage::Bottom bottom_message;
22
23 for (int i = 1; i <= 2; ++i) {
24 auto inter = message.add_inters();
25 auto bottoms = inter->mutable_bottoms();
26 (*bottoms)["aaa"].set_field1(i * 10);
27 (*bottoms)["aaa"].mutable_field2()->set_seconds(i * 1);
28 (*bottoms)["aaa"].mutable_field2()->set_nanos(i * 2);
29 (*bottoms)["bbb"].set_field1(i * 20);
30 (*bottoms)["bbb"].mutable_field2()->set_seconds(i * 3);
31 (*bottoms)["bbb"].mutable_field2()->set_nanos(i * 4);
32 }
33
34 formats::json::ValueBuilder builder;
35 builder = message;
36
37 formats::json::Value json, expected_json, sample_json;
38 json = builder.ExtractValue();
39 UASSERT_NO_THROW((
40 expected_json = formats::json::FromString(
41 R"({
42 "inters": [
43 {
44 "bottoms": {
45 "aaa": {"field1":10, "field2":"1.000000002s"},
46 "bbb": {"field1":20, "field2":"3.000000004s"}
47 }
48 },
49 {
50 "bottoms": {
51 "aaa": {"field1":20, "field2":"2.000000004s"},
52 "bbb": {"field1":40, "field2":"6.000000008s"}
53 }
54 }
55 ]
56 })"
57 )
58 ));
59
60 ProtobufStringType sample_json_str;
61 ASSERT_TRUE(::google::protobuf::util::MessageToJsonString(message, &sample_json_str).ok());
62 UASSERT_NO_THROW((sample_json = formats::json::FromString(sample_json_str)));
63
64 EXPECT_EQ(json, expected_json);
65 EXPECT_EQ(expected_json, sample_json);
66
67 UASSERT_NO_THROW(
68 (bottom_message = json["inters"][1]["bottoms"]["aaa"].As<proto_json::messages::ComplexMessage::Bottom>())
69 );
70 EXPECT_EQ(bottom_message.field1(), std::uint32_t{20});
71 EXPECT_EQ(bottom_message.field2().seconds(), 2);
72 EXPECT_EQ(bottom_message.field2().nanos(), 4);
73}
74
75TEST(ComplexToJsonFailureTest, Test) {
76 proto_json::messages::ComplexMessage message;
77 proto_json::messages::ComplexMessage::Bottom bottom_message;
78
79 auto inter = message.add_inters();
80 auto bottoms = inter->mutable_bottoms();
81 (*bottoms)["aaa"].set_field1(10);
82 (*bottoms)["aaa"].mutable_field2()->set_seconds(1);
83 (*bottoms)["aaa"].mutable_field2()->set_nanos(-1);
84
85 formats::json::ValueBuilder builder;
86 EXPECT_WRITE_ERROR((builder = message), WriteErrorCode::kInvalidValue, "inters[0].bottoms['aaa'].field2");
87}
88
89} // namespace protobuf::json::tests
90
91USERVER_NAMESPACE_END