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