rippled
Loading...
Searching...
No Matches
OwnerInfo_test.cpp
1#include <test/jtx.h>
2
3#include <xrpl/beast/unit_test.h>
4#include <xrpl/protocol/AccountID.h>
5#include <xrpl/protocol/STAmount.h>
6#include <xrpl/protocol/jss.h>
7
8namespace xrpl {
9
11{
12 void
14 {
15 testcase("Bad input to owner_info");
16
17 using namespace test::jtx;
18 Env env{*this};
19
20 auto const alice = Account{"alice"};
21 env.fund(XRP(10000), alice);
22 env.close();
23
24 { // missing account field
25 auto const result = env.rpc("json", "owner_info", "{}")[jss::result];
26 BEAST_EXPECT(result[jss::error] == "invalidParams");
27 BEAST_EXPECT(result[jss::error_message] == "Missing field 'account'.");
28 }
29
30 { // ask for empty account
31 Json::Value params;
32 params[jss::account] = "";
33 auto const result = env.rpc("json", "owner_info", to_string(params))[jss::result];
34 if (BEAST_EXPECT(result.isMember(jss::accepted) && result.isMember(jss::current)))
35 {
36 BEAST_EXPECT(result[jss::accepted][jss::error] == "actMalformed");
37 BEAST_EXPECT(result[jss::accepted][jss::error_message] == "Account malformed.");
38 BEAST_EXPECT(result[jss::current][jss::error] == "actMalformed");
39 BEAST_EXPECT(result[jss::current][jss::error_message] == "Account malformed.");
40 }
41 }
42
43 { // ask for nonexistent account
44 // this seems like it should be an error, but current impl
45 // (deprecated) does not return an error, just empty fields.
46 Json::Value params;
47 params[jss::account] = Account{"bob"}.human();
48 auto const result = env.rpc("json", "owner_info", to_string(params))[jss::result];
49 BEAST_EXPECT(result[jss::accepted] == Json::objectValue);
50 BEAST_EXPECT(result[jss::current] == Json::objectValue);
51 BEAST_EXPECT(result[jss::status] == "success");
52 }
53 }
54
55 void
57 {
58 testcase("Basic request for owner_info");
59
60 using namespace test::jtx;
61 Env env{*this};
62
63 auto const alice = Account{"alice"};
64 auto const gw = Account{"gateway"};
65 env.fund(XRP(10000), alice, gw);
66 env.close();
67 auto const USD = gw["USD"];
68 auto const CNY = gw["CNY"];
69 env(trust(alice, USD(1000)));
70 env(trust(alice, CNY(1000)));
71 env(offer(alice, USD(1), XRP(1000)));
72 env.close();
73
74 env(pay(gw, alice, USD(50)));
75 env(pay(gw, alice, CNY(50)));
76 env(offer(alice, CNY(2), XRP(1000)));
77
78 Json::Value params;
79 params[jss::account] = alice.human();
80 auto const result = env.rpc("json", "owner_info", to_string(params))[jss::result];
81 if (!BEAST_EXPECT(result.isMember(jss::accepted) && result.isMember(jss::current)))
82 {
83 return;
84 }
85
86 // accepted ledger entry
87 if (!BEAST_EXPECT(result[jss::accepted].isMember(jss::ripple_lines)))
88 return;
89 auto lines = result[jss::accepted][jss::ripple_lines];
90 if (!BEAST_EXPECT(lines.isArray() && lines.size() == 2))
91 return;
92
93 BEAST_EXPECT(
94 lines[0u][sfBalance.fieldName] ==
95 (STAmount{Issue{to_currency("CNY"), noAccount()}, 0}.value().getJson(
97 BEAST_EXPECT(
98 lines[0u][sfHighLimit.fieldName] ==
99 alice["CNY"](1000).value().getJson(JsonOptions::none));
100 BEAST_EXPECT(
101 lines[0u][sfLowLimit.fieldName] == gw["CNY"](0).value().getJson(JsonOptions::none));
102
103 BEAST_EXPECT(
104 lines[1u][sfBalance.fieldName] ==
105 (STAmount{Issue{to_currency("USD"), noAccount()}, 0}.value().getJson(
107 BEAST_EXPECT(
108 lines[1u][sfHighLimit.fieldName] ==
109 alice["USD"](1000).value().getJson(JsonOptions::none));
110 BEAST_EXPECT(lines[1u][sfLowLimit.fieldName] == USD(0).value().getJson(JsonOptions::none));
111
112 if (!BEAST_EXPECT(result[jss::accepted].isMember(jss::offers)))
113 return;
114 auto offers = result[jss::accepted][jss::offers];
115 if (!BEAST_EXPECT(offers.isArray() && offers.size() == 1))
116 return;
117
118 BEAST_EXPECT(offers[0u][jss::Account] == alice.human());
119 BEAST_EXPECT(
120 offers[0u][sfTakerGets.fieldName] == XRP(1000).value().getJson(JsonOptions::none));
121 BEAST_EXPECT(
122 offers[0u][sfTakerPays.fieldName] == USD(1).value().getJson(JsonOptions::none));
123
124 // current ledger entry
125 if (!BEAST_EXPECT(result[jss::current].isMember(jss::ripple_lines)))
126 return;
127 lines = result[jss::current][jss::ripple_lines];
128 if (!BEAST_EXPECT(lines.isArray() && lines.size() == 2))
129 return;
130
131 BEAST_EXPECT(
132 lines[0u][sfBalance.fieldName] ==
133 (STAmount{Issue{to_currency("CNY"), noAccount()}, -50}.value().getJson(
134 JsonOptions::none)));
135 BEAST_EXPECT(
136 lines[0u][sfHighLimit.fieldName] ==
137 alice["CNY"](1000).value().getJson(JsonOptions::none));
138 BEAST_EXPECT(
139 lines[0u][sfLowLimit.fieldName] == gw["CNY"](0).value().getJson(JsonOptions::none));
140
141 BEAST_EXPECT(
142 lines[1u][sfBalance.fieldName] ==
143 (STAmount{Issue{to_currency("USD"), noAccount()}, -50}.value().getJson(
144 JsonOptions::none)));
145 BEAST_EXPECT(
146 lines[1u][sfHighLimit.fieldName] ==
147 alice["USD"](1000).value().getJson(JsonOptions::none));
148 BEAST_EXPECT(
149 lines[1u][sfLowLimit.fieldName] == gw["USD"](0).value().getJson(JsonOptions::none));
150
151 if (!BEAST_EXPECT(result[jss::current].isMember(jss::offers)))
152 return;
153 offers = result[jss::current][jss::offers];
154 // 1 additional offer in current, (2 total)
155 if (!BEAST_EXPECT(offers.isArray() && offers.size() == 2))
156 return;
157
158 BEAST_EXPECT(offers[1u] == result[jss::accepted][jss::offers][0u]);
159 BEAST_EXPECT(offers[0u][jss::Account] == alice.human());
160 BEAST_EXPECT(
161 offers[0u][sfTakerGets.fieldName] == XRP(1000).value().getJson(JsonOptions::none));
162 BEAST_EXPECT(
163 offers[0u][sfTakerPays.fieldName] == CNY(2).value().getJson(JsonOptions::none));
164 }
165
166public:
167 void
168 run() override
169 {
170 testBadInput();
171 testBasic();
172 }
173};
174
175BEAST_DEFINE_TESTSUITE(OwnerInfo, rpc, xrpl);
176
177} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
A testsuite class.
Definition suite.h:51
testcase_t testcase
Memberspace for declaring test cases.
Definition suite.h:150
void run() override
Runs the suite.
STAmount const & value() const noexcept
Definition STAmount.h:578
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:26
XRP_t const XRP
Converts to XRP Issue or STAmount.
Definition amount.cpp:95
owner_count< ltOFFER > offers
Match the number of offers in the account's owner directory.
Definition owners.h:70
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
Json::Value getJson(LedgerFill const &fill)
Return a new Json::Value representing the ledger with given options.
std::string to_string(base_uint< Bits, Tag > const &a)
Definition base_uint.h:602