userver: /data/code/userver/libraries/protobuf/tests/json/oneof_from_json_test.cpp Source File
Loading...
Searching...
No Matches
oneof_from_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <ostream>
4#include <string>
5#include <unordered_set>
6
7#include <fmt/format.h>
8
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 OneofFromJsonSuccessTestParam {
19 std::string input = {};
20 OneofMessageData expected_message = {};
21 ParseOptions options = {};
22};
23
24struct OneofFromJsonFailureTestParam {
25 std::string input = {};
26 ParseErrorCode expected_errc = {};
27 std::unordered_set<std::string> expected_path = {};
28 ParseOptions options = {};
29};
30
31void PrintTo(const OneofFromJsonSuccessTestParam& param, std::ostream* os) {
32 *os << fmt::format("{{ input = '{}' }}", param.input);
33}
34
35void PrintTo(const OneofFromJsonFailureTestParam& param, std::ostream* os) {
36 *os << fmt::format("{{ input = '{}' }}", param.input);
37}
38
39class OneofFromJsonSuccessTest : public ::testing::TestWithParam<OneofFromJsonSuccessTestParam> {};
40class OneofFromJsonFailureTest : public ::testing::TestWithParam<OneofFromJsonFailureTestParam> {};
41
42INSTANTIATE_TEST_SUITE_P(
43 ,
44 OneofFromJsonSuccessTest,
45 ::testing::Values(
46 OneofFromJsonSuccessTestParam{R"({})", OneofMessageData{}},
47 OneofFromJsonSuccessTestParam{R"({"field1":10})", OneofMessageData{.field1 = 10}},
48 OneofFromJsonSuccessTestParam{R"({"field2":"hello"})", OneofMessageData{.field2 = "hello"}}
49 )
50);
51
52INSTANTIATE_TEST_SUITE_P(
53 ,
54 OneofFromJsonFailureTest,
55 ::testing::Values(OneofFromJsonFailureTestParam{
56 R"({"field1":10,"field2":"hello"})",
57 ParseErrorCode::kMultipleOneofFields,
58 {"field1", "field2"}
59 })
60);
61
62TEST_P(OneofFromJsonSuccessTest, Test) {
63 const auto& param = GetParam();
64
65 proto_json::messages::OneofMessage message, expected_message, sample_message;
66 formats::json::Value input = PrepareJsonTestData(param.input);
67 expected_message = PrepareTestData(param.expected_message);
68
69 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::OneofMessage>(input, param.options)));
70 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
71
72 CheckMessageEqual(message, sample_message);
73 CheckMessageEqual(message, expected_message);
74}
75
76TEST_P(OneofFromJsonFailureTest, Test) {
77 const auto& param = GetParam();
78
79 proto_json::messages::OneofMessage sample_message;
80 formats::json::Value input = PrepareJsonTestData(param.input);
81
82 try {
83 (void)JsonToMessage<proto_json::messages::OneofMessage>(input, param.options);
84 ADD_FAILURE() << "exception should be thrown";
85 } catch (const ParseError& error) {
86 EXPECT_EQ(error.GetErrorInfo().GetCode(), param.expected_errc);
87 EXPECT_TRUE(param.expected_path.contains(error.GetErrorInfo().GetPath()));
88 } catch (...) {
89 ADD_FAILURE() << "unexpected exception type";
90 }
91
92 UEXPECT_THROW(InitSampleMessage(param.input, sample_message, param.options), SampleError);
93}
94
95} // namespace protobuf::json::tests
96
97USERVER_NAMESPACE_END