From a4f22d8b4238ca6e1052a9821e6956c9ebf055f7 Mon Sep 17 00:00:00 2001 From: wltsmrz Date: Thu, 12 Jun 2014 00:20:56 -0700 Subject: [PATCH] Improve transaction-test coverage --- src/js/ripple/transaction.js | 16 +-- test/transaction-test.js | 193 ++++++++++++++++++++++++++++++++++- 2 files changed, 190 insertions(+), 19 deletions(-) diff --git a/src/js/ripple/transaction.js b/src/js/ripple/transaction.js index 2cb31ed9..89f0ed0d 100644 --- a/src/js/ripple/transaction.js +++ b/src/js/ripple/transaction.js @@ -773,10 +773,6 @@ Transaction.prototype.payment = function(src, dst, amount) { src = options.source || options.from || options.account; } - if (src.invoiceID) { - this.invoiceID(src.invoiceID); - } - if (!UInt160.is_valid(src)) { throw new Error('Payment source address invalid'); } @@ -785,10 +781,6 @@ Transaction.prototype.payment = function(src, dst, amount) { throw new Error('Payment destination address invalid'); } - if (/^[\d]+[A-Z]{3}$/.test(amount)) { - amount = Amount.from_human(amount); - } - this.tx_json.TransactionType = 'Payment'; this.tx_json.Account = UInt160.json_rewrite(src); this.tx_json.Amount = Amount.json_rewrite(amount); @@ -856,8 +848,8 @@ Transaction.prototype.submit = function(callback) { var account = this.tx_json.Account; - if (typeof account !== 'string') { - return this.emit('error', new RippleError('tejInvalidAccount', 'Account is unspecified')); + if (!UInt160.is_valid(account)) { + return this.emit('error', new RippleError('tejInvalidAccount', 'Account is missing or invalid')); } // YYY Might check paths for invalid accounts. @@ -866,10 +858,6 @@ Transaction.prototype.submit = function(callback) { return this; }; -Transaction.prototype.transactionManager = function() { - return this.remote.account(this.tx_json.Account)._transactionManager; -}; - Transaction.prototype.abort = function(callback) { var callback = (typeof callback === 'function') ? callback : function(){}; if (!this.finalized) { diff --git a/test/transaction-test.js b/test/transaction-test.js index 79837b67..f7905d2a 100644 --- a/test/transaction-test.js +++ b/test/transaction-test.js @@ -73,6 +73,61 @@ describe('Transaction', function() { assert.strictEqual(transaction.state, 'pending'); }); + it('Check response code is tel', function() { + var transaction = new Transaction(); + assert(!transaction.isTelLocal(-400)); + assert(transaction.isTelLocal(-399)); + assert(transaction.isTelLocal(-300)); + assert(!transaction.isTelLocal(-299)); + }); + + it('Check response code is tem', function() { + var transaction = new Transaction(); + assert(!transaction.isTemMalformed(-300)); + assert(transaction.isTemMalformed(-299)); + assert(transaction.isTemMalformed(-200)); + assert(!transaction.isTemMalformed(-199)); + }); + + it('Check response code is tef', function() { + var transaction = new Transaction(); + assert(!transaction.isTefFailure(-200)); + assert(transaction.isTefFailure(-199)); + assert(transaction.isTefFailure(-100)); + assert(!transaction.isTefFailure(-99)); + }); + + it('Check response code is ter', function() { + var transaction = new Transaction(); + assert(!transaction.isTerRetry(-100)); + assert(transaction.isTerRetry(-99)); + assert(transaction.isTerRetry(-1)); + assert(!transaction.isTerRetry(0)); + }); + + it('Check response code is tep', function() { + var transaction = new Transaction(); + assert(!transaction.isTepSuccess(-1)); + assert(transaction.isTepSuccess(0)); + assert(transaction.isTepSuccess(1e3)); + }); + + it('Check response code is tec', function() { + var transaction = new Transaction(); + assert(!transaction.isTecClaimed(99)); + assert(transaction.isTecClaimed(100)); + assert(transaction.isTecClaimed(1e3)); + }); + + it('Check response code is rejected', function() { + var transaction = new Transaction(); + assert(!transaction.isRejected(0)); + assert(!transaction.isRejected(-99)); + assert(transaction.isRejected(-100)); + assert(transaction.isRejected(-399)); + assert(!transaction.isRejected(-400)); + }); + it('Set state', function(done) { var transaction = new Transaction(); transaction.state = 'pending'; @@ -153,15 +208,25 @@ describe('Transaction', function() { s3._connected = true; s3._load_factor = 256 * 8; - remote._servers = [ s1, s2, s3 ]; + var s4 = new Server(remote, 'wss://s-west.ripple.com:443'); + s4._connected = true; + s4._load_factor = 256 * 8; + + var s5 = new Server(remote, 'wss://s-west.ripple.com:443'); + s5._connected = true; + s5._load_factor = 256 * 7; + + remote._servers = [ s2, s3, s1, s4 ]; assert.strictEqual(s1._computeFee(10), '12'); assert.strictEqual(s2._computeFee(10), '48'); assert.strictEqual(s3._computeFee(10), '96'); + assert.strictEqual(s4._computeFee(10), '96'); + assert.strictEqual(s5._computeFee(10), '84'); var transaction = new Transaction(remote); - assert.strictEqual(transaction._computeFee(), '48'); + assert.strictEqual(transaction._computeFee(), '72'); }); it('Compute fee - no connected server', function() { @@ -245,6 +310,26 @@ describe('Transaction', function() { assert.strictEqual(transaction._computeFee(), '72'); }); + it('Complete transaction', function(done) { + var remote = new Remote(); + + var s1 = new Server(remote, 'wss://s-west.ripple.com:443'); + s1._connected = true; + + remote._servers = [ s1 ]; + remote.trusted = true; + remote.local_signing = true; + + var transaction = new Transaction(remote); + transaction._secret = 'sh2pTicynUEG46jjR4EoexHcQEoij'; + transaction.tx_json.Account = 'rMWwx3Ma16HnqSd4H6saPisihX9aKpXxHJ'; + transaction.tx_json.Flags = 0; + + assert(transaction.complete()); + + done(); + }); + it('Complete transaction - untrusted', function(done) { var remote = new Remote(); var transaction = new Transaction(remote); @@ -430,6 +515,23 @@ describe('Transaction', function() { done(); }); + it('Get hash - invalid prefix', function(done) { + var transaction = new Transaction(); + transaction._secret = 'sh2pTicynUEG46jjR4EoexHcQEoij'; + transaction.tx_json.SigningPubKey = '021FED5FD081CE5C4356431267D04C6E2167E4112C897D5E10335D4E22B4DA49ED'; + transaction.tx_json.Account = 'rMWwx3Ma16HnqSd4H6saPisihX9aKpXxHJ'; + transaction.tx_json.Flags = 0; + transaction.tx_json.Fee = 10; + transaction.tx_json.Sequence = 1; + transaction.tx_json.TransactionType = 'AccountSet'; + + assert.throws(function() { + transaction.hash('HASH_TX_SIGNZ'); + }); + + done(); + }); + it('Get hash - complex transaction', function() { var input_json = { Account : 'r4qLSAzv4LZ9TLsR7diphGwKnSEAMQTSjS', @@ -686,7 +788,7 @@ describe('Transaction', function() { { account: 'rP51ycDJw5ZhgvdKiRjBYZKYjsyoCcHmnY', issuer: 'rsLEU1TPdCJPPysqhWYw9jD97xtG5WqSJm', - currency: 'USD' + type_hex: '0000000000000001' }, { account: 'rP51ycDJw5ZhgvdKiRjBYZKYjsyoCcHmnY', @@ -705,7 +807,7 @@ describe('Transaction', function() { { account: 'rP51ycDJw5ZhgvdKiRjBYZKYjsyoCcHmnY', issuer: 'rsLEU1TPdCJPPysqhWYw9jD97xtG5WqSJm', - currency: 'USD' + type_hex: '0000000000000001' }, { account: 'rP51ycDJw5ZhgvdKiRjBYZKYjsyoCcHmnY', @@ -715,6 +817,10 @@ describe('Transaction', function() { ]); }); + it('Rewrite transaction path - invalid path', function() { + assert.strictEqual(Transaction._pathRewrite(1), void(0)); + }); + it('Add transaction path', function() { var transaction = new Transaction(); @@ -1231,7 +1337,6 @@ describe('Transaction', function() { it('Submit transaction', function(done) { var remote = new Remote(); - var transaction = new Transaction(remote).accountSet('r36xtKNKR43SeXnGn7kN4r4JdQzcrkqpWe'); assert.strictEqual(transaction.callback, void(0)); @@ -1272,6 +1377,84 @@ describe('Transaction', function() { assert.strictEqual(typeof transaction._errorHandler, 'function'); assert.strictEqual(typeof transaction._successHandler, 'function'); }); + + it('Submit transaction - submission error', function(done) { + var remote = new Remote(); + + var transaction = new Transaction(remote).accountSet('r36xtKNKR43SeXnGn7kN4r4JdQzcrkqpWe'); + + var account = remote.addAccount('r36xtKNKR43SeXnGn7kN4r4JdQzcrkqpWe'); + + account._transactionManager._nextSequence = 1; + + account._transactionManager._request = function(tx) { + tx.emit('error', new Error('Test error')); + }; + + transaction.complete = function() { + return this; + }; + + var receivedError = false; + + transaction.once('error', function() { + receivedError = true; + }); + + function submitCallback(err, res) { + setImmediate(function() { + assert(err); + assert.strictEqual(err.constructor.name, 'RippleError'); + assert(receivedError); + done(); + }); + }; + + transaction.submit(submitCallback); + }); + + it('Submit transaction - invalid account', function(done) { + var remote = new Remote(); + var transaction = new Transaction(remote).accountSet('r36xtKNKR43SeXnGn7kN4r4JdQzcrkqpWe'); + + transaction.tx_json.Account += 'z'; + + transaction.once('error', function(err) { + assert.strictEqual(err.result, 'tejInvalidAccount'); + done(); + }); + + transaction.submit(); + }); + + it.skip('Abort submission', function(done) { + var remote = new Remote(); + var transaction = new Transaction(remote).accountSet('r36xtKNKR43SeXnGn7kN4r4JdQzcrkqpWe'); + var account = remote.addAccount('r36xtKNKR43SeXnGn7kN4r4JdQzcrkqpWe'); + + account._transactionManager._nextSequence = 1; + + account._transactionManager._request = function(tx) { + setTimeout(function() { + tx.emit('success', { }); + }, 20); + }; + + transaction.complete = function() { + return this; + }; + + function submitCallback(err, res) { + setImmediate(function() { + assert(err); + assert.strictEqual(err.result, 'tejAbort'); + done(); + }); + }; + + transaction.submit(submitCallback); + transaction.abort(); + }); }); // vim:sw=2:sts=2:ts=8:et