1#include <gtest/gtest.h>
3#include <google/protobuf/util/json_util.h>
5#include <userver/formats/json/serialize.hpp>
6#include <userver/protobuf/json/convert.hpp>
7#include <userver/utest/assert_macros.hpp>
11USERVER_NAMESPACE_BEGIN
15using ProtobufStringType =
16 decltype(std::declval<::google::protobuf::Reflection>()
17 .GetString(std::declval<
const ::google::protobuf::Message&>(),
nullptr));
19TEST(ComplexFromJsonSuccessTest, Test) {
20 const auto json = formats::json::FromString(
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 })"
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;
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});
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);
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);
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);
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);
69 (bottom_message = json[
"inters"][0][
"bottoms"][
"bbb"].As<proto_json::messages::ComplexMessage::Bottom>())
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);
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");
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});
89TEST(ComplexFromJsonFailureTest, Test) {
91 json = formats::json::FromString(R"({"inters":[{"bottoms":{"some.key": {"field1":10, "field2":"oops"}}}]})");
93 proto_json::messages::ComplexMessage message;
94 proto_json::messages::ComplexMessage::Bottom bottom_message;
97 (message = json.As<proto_json::messages::ComplexMessage>()),
98 ReadErrorCode::kInvalidValue,
99 "inters[0].bottoms.'some.key'.field2"
102 (bottom_message = json[
"inters"][0][
"bottoms"][
"some.key"].As<proto_json::messages::ComplexMessage::Bottom>()),
103 ReadErrorCode::kInvalidValue,