userver: /data/code/userver/libraries/protobuf/tests/json/complex_from_json_test.cpp Source File
Loading...
Searching...
No Matches
complex_from_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
15/* NOTE: Uncomment when linkage is fixed (see comment in the convert.hpp)
16
17using ProtobufStringType =
18 decltype(std::declval<::google::protobuf::Reflection>()
19 .GetString(std::declval<const ::google::protobuf::Message&>(), nullptr));
20
21TEST(ComplexFromJsonSuccessTest, Test) {
22 const auto json = formats::json::FromString(
23 R"({
24 "inters": [
25 {
26 "bottoms": {
27 "aaa": {"field1":10, "field2":"1.000000002s"},
28 "bbb": {"field1":20, "field2":"3.000000004s"}
29 }
30 },
31 {
32 "bottoms": {
33 "aaa": {"field1":20, "field2":"2.000000004s"},
34 "bbb": {"field1":40, "field2":"6.000000008s"}
35 }
36 }
37 ]
38 })"
39 );
40
41 proto_json::messages::ComplexMessage message;
42 proto_json::messages::ComplexMessage::Bottom bottom_message;
43 ::google::protobuf::Struct struct_message;
44 ::google::protobuf::Value value_message;
45
46 UASSERT_NO_THROW((message = json.As<proto_json::messages::ComplexMessage>()));
47 ASSERT_EQ(message.inters().size(), 2);
48 EXPECT_EQ(message.inters()[0].bottoms().size(), std::size_t{2});
49
50 ASSERT_TRUE(message.inters()[0].bottoms().contains("aaa"));
51 EXPECT_EQ(message.inters()[0].bottoms().at("aaa").field1(), std::uint32_t{10});
52 EXPECT_EQ(message.inters()[0].bottoms().at("aaa").field2().seconds(), 1);
53 EXPECT_EQ(message.inters()[0].bottoms().at("aaa").field2().nanos(), 2);
54
55 ASSERT_TRUE(message.inters()[0].bottoms().contains("bbb"));
56 EXPECT_EQ(message.inters()[0].bottoms().at("bbb").field1(), std::uint32_t{20});
57 EXPECT_EQ(message.inters()[0].bottoms().at("bbb").field2().seconds(), 3);
58 EXPECT_EQ(message.inters()[0].bottoms().at("bbb").field2().nanos(), 4);
59
60 ASSERT_TRUE(message.inters()[1].bottoms().contains("aaa"));
61 EXPECT_EQ(message.inters()[1].bottoms().at("aaa").field1(), std::uint32_t{20});
62 EXPECT_EQ(message.inters()[1].bottoms().at("aaa").field2().seconds(), 2);
63 EXPECT_EQ(message.inters()[1].bottoms().at("aaa").field2().nanos(), 4);
64
65 ASSERT_TRUE(message.inters()[1].bottoms().contains("bbb"));
66 EXPECT_EQ(message.inters()[1].bottoms().at("bbb").field1(), std::uint32_t{40});
67 EXPECT_EQ(message.inters()[1].bottoms().at("bbb").field2().seconds(), 6);
68 EXPECT_EQ(message.inters()[1].bottoms().at("bbb").field2().nanos(), 8);
69
70 UASSERT_NO_THROW(
71 (bottom_message = json["inters"][0]["bottoms"]["bbb"].As<proto_json::messages::ComplexMessage::Bottom>())
72 );
73 EXPECT_EQ(bottom_message.field1(), std::size_t{20});
74 EXPECT_EQ(bottom_message.field2().seconds(), 3);
75 EXPECT_EQ(bottom_message.field2().nanos(), 4);
76
77 UASSERT_NO_THROW((struct_message = json["inters"][1]["bottoms"]["bbb"].As<::google::protobuf::Struct>()));
78 EXPECT_EQ(struct_message.fields().size(), std::size_t{2});
79 ASSERT_TRUE(struct_message.fields().contains("field1"));
80 ASSERT_TRUE(struct_message.fields().at("field1").has_number_value());
81 EXPECT_EQ(struct_message.fields().at("field1").number_value(), std::uint32_t{40});
82 ASSERT_TRUE(struct_message.fields().contains("field2"));
83 ASSERT_TRUE(struct_message.fields().at("field2").has_string_value());
84 EXPECT_EQ(struct_message.fields().at("field2").string_value(), "6.000000008s");
85
86 UASSERT_NO_THROW((value_message = json["inters"][1]["bottoms"]["aaa"]["field1"].As<::google::protobuf::Value>()));
87 ASSERT_TRUE(value_message.has_number_value());
88 EXPECT_EQ(value_message.number_value(), std::uint32_t{20});
89}
90
91TEST(ComplexFromJsonFailureTest, Test) {
92 const auto
93 json = formats::json::FromString(R"({"inters":[{"bottoms":{"some.key": {"field1":10, "field2":"oops"}}}]})");
94
95 proto_json::messages::ComplexMessage message;
96 proto_json::messages::ComplexMessage::Bottom bottom_message;
97
98 EXPECT_PARSE_ERROR(
99 (message = json.As<proto_json::messages::ComplexMessage>()),
100 ParseErrorCode::kInvalidValue,
101 "inters[0].bottoms.'some.key'.field2"
102 );
103 EXPECT_PARSE_ERROR(
104 (bottom_message = json["inters"][0]["bottoms"]["some.key"].As<proto_json::messages::ComplexMessage::Bottom>()),
105 ParseErrorCode::kInvalidValue,
106 "field2"
107 );
108}
109*/
110
111} // namespace protobuf::json::tests
112
113USERVER_NAMESPACE_END