Continue updating LoanBroker tests

- It builds now
This commit is contained in:
Ed Hennis
2025-04-12 09:18:46 -04:00
parent da10ba6fd0
commit 17a970d80c
3 changed files with 55 additions and 34 deletions

View File

@@ -58,7 +58,7 @@ public:
getText() const override; getText() const override;
Json::Value Json::Value
getJson(JsonOptions options) const override; getJson(JsonOptions options = JsonOptions::none) const override;
/** Returns the 'key' (or 'index') of this item. /** Returns the 'key' (or 'index') of this item.
The key identifies this entry's position in The key identifies this entry's position in

View File

@@ -100,20 +100,31 @@ class LoanBroker_test : public beast::unit_test::suite
jtx::Account const& alice, jtx::Account const& alice,
jtx::Account const& evan, jtx::Account const& evan,
VaultInfo const& vault, VaultInfo const& vault,
std::function<void()> createBroker, std::function<jtx::JTx(jtx::JTx const&)> modifyJTx,
std::function<void(SLE::const_ref broker)> checkBroker, std::function<void(SLE::const_ref)> checkBroker,
std::function<void(SLE::const_ref broker)> changeBroker, std::function<void(SLE::const_ref)> changeBroker,
std::function<void(SLE::const_ref broker)> checkChangedBroker) std::function<void(SLE::const_ref)> checkChangedBroker)
{ {
auto const keylet = keylet::loanbroker(alice.id(), env.seq(alice)); auto const keylet = keylet::loanbroker(alice.id(), env.seq(alice));
testcase("Lifecycle: " + to_string(vault.asset));
using namespace jtx; using namespace jtx;
using namespace loanBroker; using namespace loanBroker;
createBroker(); {
// Start with default values
auto jtx = env.jt(set(alice, vault.vaultID), fee(increment));
// Modify as desired
if (modifyJTx)
jtx = modifyJTx(jtx);
// Successfully create a Loan Broker
env(jtx);
}
env.close(); env.close();
if (auto broker = env.le(keylet); BEAST_EXPECT(broker)) if (auto broker = env.le(keylet); BEAST_EXPECT(broker))
{ {
log << to_string(broker->getJson()) << std::endl;
BEAST_EXPECT(broker->at(sfVaultID) == vault.vaultID); BEAST_EXPECT(broker->at(sfVaultID) == vault.vaultID);
BEAST_EXPECT(broker->at(sfAccount) != alice.id()); BEAST_EXPECT(broker->at(sfAccount) != alice.id());
BEAST_EXPECT(broker->at(sfOwner) == alice.id()); BEAST_EXPECT(broker->at(sfOwner) == alice.id());
@@ -121,11 +132,9 @@ class LoanBroker_test : public beast::unit_test::suite
BEAST_EXPECT(broker->at(sfSequence) == env.seq(alice) - 1); BEAST_EXPECT(broker->at(sfSequence) == env.seq(alice) - 1);
BEAST_EXPECT(broker->at(sfOwnerCount) == 0); BEAST_EXPECT(broker->at(sfOwnerCount) == 0);
BEAST_EXPECT(broker->at(sfDebtTotal) == 0); BEAST_EXPECT(broker->at(sfDebtTotal) == 0);
BEAST_EXPECT(broker->at(sfDebtMaximum) == 0);
BEAST_EXPECT(broker->at(sfCoverAvailable) == 0); BEAST_EXPECT(broker->at(sfCoverAvailable) == 0);
BEAST_EXPECT(broker->at(sfCoverRateMinimum) == 0); if (checkBroker)
BEAST_EXPECT(broker->at(sfCoverRateLiquidation) == 0); checkBroker(broker);
checkBroker(broker);
// Load the pseudo-account // Load the pseudo-account
auto const pseudoKeylet = keylet::account(broker->at(sfAccount)); auto const pseudoKeylet = keylet::account(broker->at(sfAccount));
@@ -162,13 +171,28 @@ class LoanBroker_test : public beast::unit_test::suite
env(set(alice, vault.vaultID), loanBrokerID(keylet.key)); env(set(alice, vault.vaultID), loanBrokerID(keylet.key));
// Make modifications to the broker // Make modifications to the broker
changeBroker(broker); if (changeBroker)
changeBroker(broker);
env.close(); env.close();
broker = env.le(keylet); broker = env.le(keylet);
// Check the results of modifications // Check the results of modifications
checkChangedBroker(broker); if (checkChangedBroker)
checkChangedBroker(broker);
// Verify that fields get removed when set to default values
// Debt maximum: explicit 0
// Data: explicit empty
env(set(alice, vault.vaultID),
loanBrokerID(broker->key()),
debtMaximum(Number(0)),
data(""));
// Check the updated fields
broker = env.le(keylet);
BEAST_EXPECT(!broker->isFieldPresent(sfDebtMaximum));
BEAST_EXPECT(!broker->isFieldPresent(sfData));
///////////////////////////////////// /////////////////////////////////////
// try to delete the wrong broker object // try to delete the wrong broker object
@@ -320,16 +344,14 @@ class LoanBroker_test : public beast::unit_test::suite
fee(increment), fee(increment),
ter(temINVALID)); ter(temINVALID));
std::string testData;
lifecycle( lifecycle(
env, env,
alice, alice,
evan, evan,
vault, vault,
[&]() { // No modifications
// Successfully create a Loan Broker with all default {},
// values.
env(set(alice, vault.vaultID), fee(increment));
},
[&](SLE::const_ref broker) { [&](SLE::const_ref broker) {
// Extra checks // Extra checks
BEAST_EXPECT(!broker->isFieldPresent(sfManagementFeeRate)); BEAST_EXPECT(!broker->isFieldPresent(sfManagementFeeRate));
@@ -337,6 +359,10 @@ class LoanBroker_test : public beast::unit_test::suite
BEAST_EXPECT( BEAST_EXPECT(
!broker->isFieldPresent(sfCoverRateLiquidation)); !broker->isFieldPresent(sfCoverRateLiquidation));
BEAST_EXPECT(!broker->isFieldPresent(sfData)); BEAST_EXPECT(!broker->isFieldPresent(sfData));
BEAST_EXPECT(!broker->isFieldPresent(sfDebtMaximum));
BEAST_EXPECT(broker->at(sfDebtMaximum) == 0);
BEAST_EXPECT(broker->at(sfCoverRateMinimum) == 0);
BEAST_EXPECT(broker->at(sfCoverRateLiquidation) == 0);
}, },
[&](SLE::const_ref broker) { [&](SLE::const_ref broker) {
// Modifications // Modifications
@@ -375,19 +401,13 @@ class LoanBroker_test : public beast::unit_test::suite
ter(temINVALID)); ter(temINVALID));
// fields that can be changed // fields that can be changed
std::string const testData("Test Data 1234"); testData = "Test Data 1234";
// Bad data: too long // Bad data: too long
env(set(alice, vault.vaultID), env(set(alice, vault.vaultID),
loanBrokerID(broker->key()), loanBrokerID(broker->key()),
data(std::string(maxDataPayloadLength + 1, 'W')), data(std::string(maxDataPayloadLength + 1, 'W')),
ter(temINVALID)); ter(temINVALID));
// Debt maximum: explicit 0
env(set(alice, vault.vaultID),
loanBrokerID(broker->key()),
debtMaximum(Number(0)));
// Check the updated fields
broker = env.le(broker->key());
BEAST_EXPECT(!broker->isFieldPresent(sfDebtMaximum));
// Bad debt maximum // Bad debt maximum
env(set(alice, vault.vaultID), env(set(alice, vault.vaultID),
loanBrokerID(broker->key()), loanBrokerID(broker->key()),
@@ -410,17 +430,17 @@ class LoanBroker_test : public beast::unit_test::suite
alice, alice,
evan, evan,
vault, vault,
[&]() { [&](jtx::JTx const& jv) {
std::string const testData2("spam spam spam spam"); testData = "spam spam spam spam";
// Finally, create another Loan Broker with none of the // Finally, create another Loan Broker with none of the
// values at default // values at default
env(set(alice, vault.vaultID), return env.jt(
data(testData2), jv,
data(testData),
managementFeeRate(123), managementFeeRate(123),
debtMaximum(Number(9)), debtMaximum(Number(9)),
coverRateMinimum(100), coverRateMinimum(100),
coverRateLiquidation(200), coverRateLiquidation(200));
fee(increment));
}, },
[&](SLE::const_ref broker) { [&](SLE::const_ref broker) {
// Extra checks // Extra checks
@@ -428,12 +448,12 @@ class LoanBroker_test : public beast::unit_test::suite
BEAST_EXPECT(broker->at(sfCoverRateMinimum) == 100); BEAST_EXPECT(broker->at(sfCoverRateMinimum) == 100);
BEAST_EXPECT(broker->at(sfCoverRateLiquidation) == 200); BEAST_EXPECT(broker->at(sfCoverRateLiquidation) == 200);
BEAST_EXPECT(broker->at(sfDebtMaximum) == Number(9)); BEAST_EXPECT(broker->at(sfDebtMaximum) == Number(9));
BEAST_EXPECT(checkVL(broker->at(sfData), testData2)); BEAST_EXPECT(checkVL(broker->at(sfData), testData));
}, },
[&](SLE::const_ref broker) { [&](SLE::const_ref broker) {
// Reset Data & Debt maximum to default values // Reset Data & Debt maximum to default values
env(set(alice, vault.vaultID), env(set(alice, vault.vaultID),
loanBrokerID(keylet.key), loanBrokerID(broker->key()),
data(""), data(""),
debtMaximum(Number(0))); debtMaximum(Number(0)));
}, },

View File

@@ -66,7 +66,8 @@ NotTEC
LoanBrokerSet::doPreflight(PreflightContext const& ctx) LoanBrokerSet::doPreflight(PreflightContext const& ctx)
{ {
auto const& tx = ctx.tx; auto const& tx = ctx.tx;
if (!validDataLength(tx[~sfData], maxDataPayloadLength)) if (auto const data = tx[~sfData]; data && !data->empty() &&
!validDataLength(tx[~sfData], maxDataPayloadLength))
return temINVALID; return temINVALID;
if (!validNumericRange(tx[~sfManagementFeeRate], maxFeeRate)) if (!validNumericRange(tx[~sfManagementFeeRate], maxFeeRate))
return temINVALID; return temINVALID;