From c073a9d1a32e904a2d5e27ef3041235a6e60eab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sa=C5=82aban?= Date: Tue, 30 Jan 2018 19:56:36 +0100 Subject: [PATCH] Update tests, fix bugs --- monero/address.py | 2 +- monero/backends/jsonrpc.py | 13 +- tests/test_jsonrpcwallet.py | 499 +++++++++++++++++++++++++++++------- tests/test_wallet.py | 3 + 4 files changed, 420 insertions(+), 97 deletions(-) diff --git a/monero/address.py b/monero/address.py index 07d99ad..a571901 100644 --- a/monero/address.py +++ b/monero/address.py @@ -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], diff --git a/monero/backends/jsonrpc.py b/monero/backends/jsonrpc.py index aa88956..e0e9db4 100644 --- a/monero/backends/jsonrpc.py +++ b/monero/backends/jsonrpc.py @@ -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): diff --git a/tests/test_jsonrpcwallet.py b/tests/test_jsonrpcwallet.py index e0f63fa..924642d 100644 --- a/tests/test_jsonrpcwallet.py +++ b/tests/test_jsonrpcwallet.py @@ -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) diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 5d98e8f..9b90984 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -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')