Update tests, fix bugs

This commit is contained in:
Michał Sałaban 2018-01-30 19:56:36 +01:00
parent bf7c369d48
commit c073a9d1a3
4 changed files with 420 additions and 97 deletions

View File

@ -35,7 +35,7 @@ class Address(object):
self._decoded = bytearray(unhexlify(base58.decode(address)))
checksum = self._decoded[-4:]
if checksum != keccak_256(self._decoded[:-4]).digest()[:4]:
raise ValueError("Invalid checksum")
raise ValueError("Invalid checksum in address {}".format(address))
if self._decoded[0] not in self._valid_netbytes:
raise ValueError("Invalid address netbyte {nb}. Allowed values are: {allowed}".format(
nb=self._decoded[0],

View File

@ -170,7 +170,7 @@ class JSONRPCWallet(object):
return (from_atomic(_balance['balance']), from_atomic(_balance['unlocked_balance']))
def transfers_in(self, account, pmtfilter):
params = {'account_index': account}
params = {'account_index': account, 'pending': False}
method = 'get_transfers'
if pmtfilter.unconfirmed:
params['in'] = pmtfilter.confirmed
@ -179,7 +179,7 @@ class JSONRPCWallet(object):
else:
if pmtfilter.payment_ids:
method = 'get_bulk_payments'
params['payment_id'] = pmtfilter.payment_ids
params['payment_ids'] = list(map(str, pmtfilter.payment_ids))
else:
params['in'] = pmtfilter.confirmed
params['out'] = False
@ -192,9 +192,9 @@ class JSONRPCWallet(object):
if pmtfilter.max_height:
params['max_height'] = pmtfilter.max_height
params['filter_by_height'] = True
elif pmtfilter.min_height:
else:
arg = 'payments'
params['min_block_height'] = pmtfilter.min_height
params['min_block_height'] = pmtfilter.min_height or 0
_pmts = self.raw_request(method, params)
pmts = _pmts.get(arg, [])
if pmtfilter.unconfirmed:
@ -206,10 +206,11 @@ class JSONRPCWallet(object):
'account_index': account,
'in': False,
'out': pmtfilter.confirmed,
'pool': pmtfilter.unconfirmed})
'pool': False,
'pending': pmtfilter.unconfirmed})
pmts = _pmts.get('out', [])
if pmtfilter.unconfirmed:
pmts.extend(_pmts.get('pool', []))
pmts.extend(_pmts.get('pending', []))
return list(pmtfilter.filter(map(self._outpayment, pmts)))
def _paymentdict(self, data):

View File

@ -122,51 +122,124 @@ class SubaddrWalletTestCase(unittest.TestCase):
self.assertEqual(len(self.wallet.accounts[0].addresses()), 8)
@patch('monero.backends.jsonrpc.requests.post')
def test_incoming(self, mock_post):
def test_incoming_confirmed(self, mock_post):
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = self.accounts_result
self.wallet = Wallet(JSONRPCWallet())
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value ={'id': 0,
mock_post.return_value.json.return_value = {
'id': 0,
'jsonrpc': '2.0',
'result': {'in': [{'amount': 2470000000000,
'result': {'in': [{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 3000000000000,
'double_spend_seen': False,
'fee': 0,
'height': 1049947,
'fee': 8661870000,
'height': 1087601,
'note': '',
'payment_id': '0000000000000000',
'address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1511926250,
'txid': '0cdde0eb934c44b523f6e966a5e19b131ed68c3c08600bc087f48ae13015b704',
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 1},
'timestamp': 1517234267,
'txid': 'f34b495cec77822a70f829ec8a5a7f1e727128d62e6b1438e9cb7799654d610e',
'type': 'in',
'unlock_time': 0},
{'amount': 6123000000000,
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 10000000000000,
'double_spend_seen': False,
'fee': 0,
'height': 1049947,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': '0000000000000000',
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag',
'timestamp': 1511926250,
'txid': '8b4154681c48a873550818ecaa6408a7c987a882b80917d6c902befd6ee57109',
'timestamp': 1517228238,
'txid': '5c3ab739346e9d98d38dc7b8d36a4b7b1e4b6a16276946485a69797dbf887cd8',
'type': 'in',
'unlock_time': 0},
{'amount': 9767000000000,
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 4000000000000,
'double_spend_seen': False,
'fee': 0,
'height': 1049947,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517228238,
'txid': '4ea70add5d0c7db33557551b15cd174972fcfc73bf0f6a6b47b7837564b708d3',
'type': 'in',
'unlock_time': 0},
{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 7000000000000,
'double_spend_seen': False,
'fee': 962430000,
'height': 1087601,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 1},
'timestamp': 1517234267,
'txid': '5ef7ead6a041101ed326568fbb59c128403cba46076c3f353cd110d969dac808',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 10000000000000,
'double_spend_seen': False,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': '0000000000000000',
'address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1511926250,
'txid': 'd23a7d086e70df7aa0ca002361c4b35e35a272345b0a513ece4f21b773941f5e',
'timestamp': 1517228238,
'txid': 'cc44568337a186c2e1ccc080b43b4ae9db26a07b7afd7edeed60ce2fc4a6477f',
'type': 'in',
'unlock_time': 0},
{'address': 'Bf6ngv7q2TBWup13nEm9AjZ36gLE6i4QCaZ7XScZUKDUeGbYEHmPRdegKGwLT8tBBK7P6L32RELNzCR6QzNFkmogDjvypyV',
'amount': 8000000000000,
'double_spend_seen': False,
'fee': 960990000,
'height': 1088394,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 2},
'timestamp': 1517335388,
'txid': 'bc8b7ef53552c2d4bce713f513418894d0e2c8dcaf72e681e1d4d5a202f1eb62',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 2120000000000,
'double_spend_seen': False,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': 'cb248105ea6a9189',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517228238,
'txid': 'e9a71c01875bec20812f71d155bfabf42024fde3ec82475562b817dcc8cbf8dc',
'type': 'in',
'unlock_time': 0},
{'address': 'Bf6ngv7q2TBWup13nEm9AjZ36gLE6i4QCaZ7XScZUKDUeGbYEHmPRdegKGwLT8tBBK7P6L32RELNzCR6QzNFkmogDjvypyV',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 3528910000,
'height': 1087606,
'note': '',
'payment_id': '0166d8da6c0045c51273dd65d6f63734beb8a84e0545a185b2cfd053fced9f5d',
'subaddr_index': {'major': 0, 'minor': 2},
'timestamp': 1517234425,
'txid': 'a0b876ebcf7c1d499712d84cedec836f9d50b608bb22d6cb49fd2feae3ffed14',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 3140000000000,
'double_spend_seen': False,
'fee': 961950000,
'height': 1087858,
'note': '',
'payment_id': '03f6649304ea4cb2',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517256811,
'txid': 'd29264ad317e8fdb55ea04484c00420430c35be7b3fe6dd663f99aebf41a786c',
'type': 'in',
'unlock_time': 0}]}}
pay_in = self.wallet.incoming()
self.assertEqual(len(list(pay_in)), 3)
self.assertEqual(len(list(pay_in)), 9)
for pmt in pay_in:
self.assertIsInstance(pmt, IncomingPayment)
self.assertIsInstance(pmt.local_address, Address)
@ -175,100 +248,346 @@ class SubaddrWalletTestCase(unittest.TestCase):
self.assertIsInstance(pmt.transaction.fee, Decimal)
self.assertIsInstance(pmt.transaction.height, int)
@patch('monero.backends.jsonrpc.requests.post')
def test_incoming_confirmed_and_unconfirmed(self, mock_post):
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = self.accounts_result
self.wallet = Wallet(JSONRPCWallet())
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = {
'id': 0,
'jsonrpc': '2.0',
'result': {'in': [{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 3000000000000,
'double_spend_seen': False,
'fee': 8661870000,
'height': 1087601,
'note': '',
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 1},
'timestamp': 1517234267,
'txid': 'f34b495cec77822a70f829ec8a5a7f1e727128d62e6b1438e9cb7799654d610e',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 10000000000000,
'double_spend_seen': False,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517228238,
'txid': '5c3ab739346e9d98d38dc7b8d36a4b7b1e4b6a16276946485a69797dbf887cd8',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 4000000000000,
'double_spend_seen': False,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517228238,
'txid': '4ea70add5d0c7db33557551b15cd174972fcfc73bf0f6a6b47b7837564b708d3',
'type': 'in',
'unlock_time': 0},
{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 7000000000000,
'double_spend_seen': False,
'fee': 962430000,
'height': 1087601,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 1},
'timestamp': 1517234267,
'txid': '5ef7ead6a041101ed326568fbb59c128403cba46076c3f353cd110d969dac808',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 10000000000000,
'double_spend_seen': False,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517228238,
'txid': 'cc44568337a186c2e1ccc080b43b4ae9db26a07b7afd7edeed60ce2fc4a6477f',
'type': 'in',
'unlock_time': 0},
{'address': 'Bf6ngv7q2TBWup13nEm9AjZ36gLE6i4QCaZ7XScZUKDUeGbYEHmPRdegKGwLT8tBBK7P6L32RELNzCR6QzNFkmogDjvypyV',
'amount': 8000000000000,
'double_spend_seen': False,
'fee': 960990000,
'height': 1088394,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 2},
'timestamp': 1517335388,
'txid': 'bc8b7ef53552c2d4bce713f513418894d0e2c8dcaf72e681e1d4d5a202f1eb62',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 2120000000000,
'double_spend_seen': False,
'fee': 962550000,
'height': 1087530,
'note': '',
'payment_id': 'cb248105ea6a9189',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517228238,
'txid': 'e9a71c01875bec20812f71d155bfabf42024fde3ec82475562b817dcc8cbf8dc',
'type': 'in',
'unlock_time': 0},
{'address': 'Bf6ngv7q2TBWup13nEm9AjZ36gLE6i4QCaZ7XScZUKDUeGbYEHmPRdegKGwLT8tBBK7P6L32RELNzCR6QzNFkmogDjvypyV',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 3528910000,
'height': 1087606,
'note': '',
'payment_id': '0166d8da6c0045c51273dd65d6f63734beb8a84e0545a185b2cfd053fced9f5d',
'subaddr_index': {'major': 0, 'minor': 2},
'timestamp': 1517234425,
'txid': 'a0b876ebcf7c1d499712d84cedec836f9d50b608bb22d6cb49fd2feae3ffed14',
'type': 'in',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 3140000000000,
'double_spend_seen': False,
'fee': 961950000,
'height': 1087858,
'note': '',
'payment_id': '03f6649304ea4cb2',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517256811,
'txid': 'd29264ad317e8fdb55ea04484c00420430c35be7b3fe6dd663f99aebf41a786c',
'type': 'in',
'unlock_time': 0}],
'pool': [{'address': 'Bf6ngv7q2TBWup13nEm9AjZ36gLE6i4QCaZ7XScZUKDUeGbYEHmPRdegKGwLT8tBBK7P6L32RELNzCR6QzNFkmogDjvypyV',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 960960000,
'height': 0,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 2},
'timestamp': 1517336242,
'txid': 'f349c6badfa7f6e46666db3996b569a05c6ac4e85417551ec208d96f8a37294a',
'type': 'pool',
'unlock_time': 0},
{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 960960000,
'height': 0,
'note': '',
'payment_id': '1f2510a597bd634bbd130cf21e63b4ad01f4565faf0d3eb21589f496bf28f7f2',
'subaddr_index': {'major': 0, 'minor': 1},
'timestamp': 1517336242,
'txid': '41304bbb514d1abdfdb0704bf70f8d2ec4e753c57aa34b6d0525631d79113b87',
'type': 'pool',
'unlock_time': 0}]}}
pay_in = self.wallet.incoming(unconfirmed=True)
self.assertEqual(len(list(pay_in)), 11)
for pmt in pay_in:
self.assertIsInstance(pmt, IncomingPayment)
self.assertIsInstance(pmt.local_address, Address)
self.assertIsInstance(pmt.amount, Decimal)
self.assertIsInstance(pmt.transaction, Transaction)
self.assertIsInstance(pmt.transaction.fee, Decimal)
self.assertIsInstance(pmt.transaction.height, (int, type(None)))
@patch('monero.backends.jsonrpc.requests.post')
def test_incoming_unconfirmed(self, mock_post):
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = self.accounts_result
self.wallet = Wallet(JSONRPCWallet())
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = {
'id': 0,
'jsonrpc': '2.0',
'result': {'pool': [{'address': 'Bf6ngv7q2TBWup13nEm9AjZ36gLE6i4QCaZ7XScZUKDUeGbYEHmPRdegKGwLT8tBBK7P6L32RELNzCR6QzNFkmogDjvypyV',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 960960000,
'height': 0,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 0, 'minor': 2},
'timestamp': 1517336242,
'txid': 'f349c6badfa7f6e46666db3996b569a05c6ac4e85417551ec208d96f8a37294a',
'type': 'pool',
'unlock_time': 0},
{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 960960000,
'height': 0,
'note': '',
'payment_id': '1f2510a597bd634bbd130cf21e63b4ad01f4565faf0d3eb21589f496bf28f7f2',
'subaddr_index': {'major': 0, 'minor': 1},
'timestamp': 1517336242,
'txid': '41304bbb514d1abdfdb0704bf70f8d2ec4e753c57aa34b6d0525631d79113b87',
'type': 'pool',
'unlock_time': 0}]}}
pay_in = self.wallet.incoming(unconfirmed=True, confirmed=False)
self.assertEqual(len(list(pay_in)), 2)
for pmt in pay_in:
self.assertIsInstance(pmt, IncomingPayment)
self.assertIsInstance(pmt.local_address, Address)
self.assertIsInstance(pmt.amount, Decimal)
self.assertIsInstance(pmt.transaction, Transaction)
self.assertIsInstance(pmt.transaction.fee, Decimal)
self.assertIs(pmt.transaction.height, None)
@patch('monero.backends.jsonrpc.requests.post')
def test_incoming_by_payment_ids(self, mock_post):
# These queries will use get_bulk_payments RPC method instead of get_transfers
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = self.accounts_result
self.wallet = Wallet(JSONRPCWallet())
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = {
'id': 0,
'jsonrpc': '2.0',
'result': {'payments': [{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 3000000000000,
'block_height': 1087601,
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 1},
'tx_hash': 'f34b495cec77822a70f829ec8a5a7f1e727128d62e6b1438e9cb7799654d610e',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 10000000000000,
'block_height': 1087530,
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'tx_hash': '5c3ab739346e9d98d38dc7b8d36a4b7b1e4b6a16276946485a69797dbf887cd8',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 4000000000000,
'block_height': 1087530,
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'tx_hash': '4ea70add5d0c7db33557551b15cd174972fcfc73bf0f6a6b47b7837564b708d3',
'unlock_time': 0}]}}
pay_in = self.wallet.incoming(payment_id='f75ad90e25d71a12')
self.assertEqual(len(list(pay_in)), 3)
for pmt in pay_in:
self.assertIsInstance(pmt, IncomingPayment)
self.assertIsInstance(pmt.local_address, Address)
self.assertIsInstance(pmt.amount, Decimal)
self.assertIsInstance(pmt.transaction, Transaction)
# Fee is not returned by this RPC method!
# self.assertIsInstance(pmt.transaction.fee, Decimal)
self.assertIsInstance(pmt.transaction.height, int)
self.assertEqual(pmt.payment_id, 'f75ad90e25d71a12')
mock_post.return_value.json.return_value = {
'id': 0,
'jsonrpc': '2.0',
'result': {'payments': [{'address': 'BhE3cQvB7VF2uuXcpXp28Wbadez6GgjypdRS1F1Mzqn8Advd6q8VfaX8ZoEDobjejrMfpHeNXoX8MjY8q8prW1PEALgr1En',
'amount': 3000000000000,
'block_height': 1087601,
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 1},
'tx_hash': 'f34b495cec77822a70f829ec8a5a7f1e727128d62e6b1438e9cb7799654d610e',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 10000000000000,
'block_height': 1087530,
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'tx_hash': '5c3ab739346e9d98d38dc7b8d36a4b7b1e4b6a16276946485a69797dbf887cd8',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 4000000000000,
'block_height': 1087530,
'payment_id': 'f75ad90e25d71a12',
'subaddr_index': {'major': 0, 'minor': 0},
'tx_hash': '4ea70add5d0c7db33557551b15cd174972fcfc73bf0f6a6b47b7837564b708d3',
'unlock_time': 0},
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 2120000000000,
'block_height': 1087530,
'payment_id': 'cb248105ea6a9189',
'subaddr_index': {'major': 0, 'minor': 0},
'tx_hash': 'e9a71c01875bec20812f71d155bfabf42024fde3ec82475562b817dcc8cbf8dc',
'unlock_time': 0}]}}
ids = ('f75ad90e25d71a12', 'cb248105ea6a9189')
pay_in = self.wallet.incoming(payment_id=ids)
self.assertEqual(len(list(pay_in)), 4)
for pmt in pay_in:
self.assertIsInstance(pmt, IncomingPayment)
self.assertIsInstance(pmt.local_address, Address)
self.assertIsInstance(pmt.amount, Decimal)
self.assertIsInstance(pmt.transaction, Transaction)
# Fee is not returned by this RPC method!
# self.assertIsInstance(pmt.transaction.fee, Decimal)
self.assertIsInstance(pmt.transaction.height, int)
self.assertIn(pmt.payment_id, ids)
@patch('monero.backends.jsonrpc.requests.post')
def test_outgoing(self, mock_post):
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = self.accounts_result
self.wallet = Wallet(JSONRPCWallet())
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = {'id': 0,
mock_post.return_value.json.return_value = {
'id': 0,
'jsonrpc': '2.0',
'result': {'out': [{'amount': 484257334653,
'destinations': [{'address': 'BeUtm39sgTWfehPwwdrWWCAyUVfRQ512TTU5R1cm4SVmPVFxcqDz2zo5YGiyHtdav2RnDFdNvVnTANgsKtYTqo7kUCPvkqK',
'amount': 484257334653}],
'result': {'out': [{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 2450000000000,
'double_spend_seen': False,
'fee': 19254480000,
'height': 1051266,
'fee': 961350000,
'height': 1088184,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 2, 'minor': 0},
'address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2',
'timestamp': 1512095241,
'txid': 'eadca0f956a2a60cb3497a7dff1bd80153140a111d2f7db257a264bd9b76f0b3',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517299877,
'txid': '2b41226d45edb875634694fccd95f3c174daa5062763eee619ed4475a7b9207a',
'type': 'out',
'unlock_time': 0},
{'amount': 791221885761,
'destinations': [{'address': 'Bd2RQrySgNaBghRZimDu54iTeJPQFZqPKc36Mb8gWiiU3ripWBv7zZZYkGDBCd5uC1efzh88V3PhyeRhMEYiMSLPN2KLFAj',
'amount': 791221885761}],
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 19304320000,
'height': 1049917,
'fee': 961350000,
'height': 1088184,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 2, 'minor': 0},
'address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2',
'timestamp': 1511922110,
'txid': '5486ae9e6867ceb6e5aa478b32cba5c11d28e6d905c8479565c78e3933163ab6',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517299877,
'txid': '40de45db57eb87eb8395baf5c1dc705602938317d043f463e68ed85b7108f9f3',
'type': 'out',
'unlock_time': 0},
{'amount': 98047029154,
'destinations': [{'address': '9xJAXRqfKJVgFcqAQPk6bThkjAhAdJ18tSTcpfpiSD634t74RqhzC3kAtHMNbScqkJCDhnvv5iCeuATuNS3r5y51RktPsoZ',
'amount': 98047029154}],
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 1000000000000,
'double_spend_seen': False,
'fee': 19253920000,
'height': 1051282,
'fee': 960990000,
'height': 1088394,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 2, 'minor': 0},
'address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2',
'timestamp': 1512098498,
'txid': '9591c8f6832cc3b7908c2447b2feef58c44e7774a5c05cea617ad2f3b3866c18',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517335388,
'txid': '5e8f392a42899294e6b679ddac13cfe1dfe7f034b1e347424218af06c3dfdc85',
'type': 'out',
'unlock_time': 0},
{'amount': 536269959084,
'destinations': [{'address': 'Bfiu2Zm5uoV8RkjGJVWtp2Wkzct15mdKcdM6P6CZsLkPfttjPqvXWR2GkdkG2ai91KNvyro8zKygygMcTf6feyUA8nJmyNT',
'amount': 536269959084}],
{'address': '9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
'amount': 21000000000000,
'double_spend_seen': False,
'fee': 19303200000,
'height': 1049947,
'fee': 960990000,
'height': 1088394,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 2, 'minor': 0},
'address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2',
'timestamp': 1511926250,
'txid': 'af669b99162d9b514a0e8d3bd1d905e3b8778e6fcb88d172e5e049e909c4cc87',
'type': 'out',
'unlock_time': 0},
{'amount': 179693868346,
'destinations': [{'address': '9wFuzNoQDck1pnS9ZhG47kDdLD1BUszSbWpGfWcSRy9m6Npq9NoHWd141KvGag8hu2gajEwzRXJ4iJwmxruv9ofc2CwnYCE',
'amount': 179693868346}],
'double_spend_seen': False,
'fee': 17927000000,
'height': 1049870,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 2, 'minor': 0},
'address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2',
'timestamp': 1511914391,
'txid': '2fa2de7fbf009093c5319d0421d3e8c684b8351a066c48d51369aedbbfd1d9af',
'type': 'out',
'unlock_time': 0},
{'amount': 540005123047,
'destinations': [{'address': 'BYo9Bf1FXxBdM655QkQsxs25HZ78EehDmJWZfLAts8LFcym4k8LbEywJcWnoCBHVXQb5ZJ6JXrF2MFtNrVnswGXsAxWNBgh',
'amount': 540005123047}],
'double_spend_seen': False,
'fee': 19302640000,
'height': 1049963,
'note': '',
'payment_id': '0000000000000000',
'subaddr_index': {'major': 2, 'minor': 0},
'address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2',
'timestamp': 1511928624,
'txid': '7e3db6c59c02d870f18b37a37cfc5857eeb5412df4ea00bb1971f3095f72b0d8',
'subaddr_index': {'major': 0, 'minor': 0},
'timestamp': 1517335388,
'txid': 'edc7c28e7b07486be48dac0a178f25a3505114267ddaf3e62ab00d9a6e996044',
'type': 'out',
'unlock_time': 0}]}}
pay_out = self.wallet.outgoing()
self.assertEqual(len(list(pay_out)), 6)
self.assertEqual(len(list(pay_out)), 4)
for pmt in pay_out:
self.assertIsInstance(pmt, OutgoingPayment)
self.assertIsInstance(pmt.local_address, Address)

View File

@ -183,3 +183,6 @@ class FiltersTestCase(unittest.TestCase):
local_address='9tQoHWyZ4yXUgbz9nvMcFZUfDy5hxcdZabQCxmNCUukKYicXegsDL7nQpcUa3A1pF6K3fhq3scsyY88tdB1MqucULcKzWZC',
payment_id='03f6649304ea4cb2')
self.assertEqual(len(pmts), 1)
def test_filter_excessive(self):
self.assertRaises(ValueError, self.wallet.incoming, excessive_argument='foo')