From f25b0b28f298e7d7160865cf6038d99d9a1bd2b1 Mon Sep 17 00:00:00 2001 From: inso <insomniak.fr@gmaiL.com> Date: Mon, 23 Oct 2017 08:42:19 +0200 Subject: [PATCH] Error with chained tx --- src/sakia/data/connectors/bma.py | 2 +- src/sakia/gui/sub/transfer/model.py | 4 ++- tests/conftest.py | 14 ++++++++++- tests/functional/test_transfer_dialog.py | 31 ++++++++++++++++++++++-- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/sakia/data/connectors/bma.py b/src/sakia/data/connectors/bma.py index 25e8ec20..2076a781 100644 --- a/src/sakia/data/connectors/bma.py +++ b/src/sakia/data/connectors/bma.py @@ -282,7 +282,7 @@ class BmaConnector: replies = [] if len(endpoints) > 0: - with aiohttp.ClientSession() as session: + async with aiohttp.ClientSession() as session: for endpoint in endpoints: self._logger.debug("Trying to connect to : " + str(endpoint)) reply = asyncio.ensure_future(request(next(endpoint.conn_handler(session, diff --git a/src/sakia/gui/sub/transfer/model.py b/src/sakia/gui/sub/transfer/model.py index 86b75859..ee19bcba 100644 --- a/src/sakia/gui/sub/transfer/model.py +++ b/src/sakia/gui/sub/transfer/model.py @@ -99,7 +99,9 @@ class TransferModel(QObject): if conn.pubkey == recipient: self.app.sources_service.parse_transaction(recipient, transaction) new_tx = self.app.transactions_service.parse_sent_transaction(recipient, transaction) - self.app.new_transfer.emit(conn, new_tx) + # Not all connections are concerned by chained tx + if new_tx: + self.app.new_transfer.emit(conn, new_tx) self.app.sources_refreshed.emit() self.app.db.commit() return result, transactions diff --git a/tests/conftest.py b/tests/conftest.py index 4a82164b..0f0fdd73 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -147,7 +147,7 @@ def simple_blockchain_forge(simple_forge, alice, bob): simple_forge.forge_block() simple_forge.set_member(alice.key.pubkey, True) simple_forge.set_member(bob.key.pubkey, True) - for i in range(0, 10): + for i in range(0, 100): new_user = mirage.User.create("test_currency", "user{0}".format(i), "salt{0}".format(i), "password{0}".format(i), simple_forge.blocks[-1].blockUID) @@ -228,6 +228,18 @@ def application_with_one_connection(application, simple_blockchain_forge, bob): return application + +@pytest.fixture +def application_with_two_connections(application_with_one_connection, simple_blockchain_forge, john): + connection = Connection(currency="test_currency", + pubkey=john.key.pubkey, uid="", + scrypt_N=mirage.User.SCRYPT_PARAMS.N, + scrypt_r=mirage.User.SCRYPT_PARAMS.r, + scrypt_p=mirage.User.SCRYPT_PARAMS.p, + blockstamp=str(BlockUID.empty())) + application_with_one_connection.db.connections_repo.insert(connection) + return application_with_one_connection + def unitttest_exception_handler(exceptions, loop, context): """ An exception handler which exists the program if the exception diff --git a/tests/functional/test_transfer_dialog.py b/tests/functional/test_transfer_dialog.py index 29f2aa1e..bc098c34 100644 --- a/tests/functional/test_transfer_dialog.py +++ b/tests/functional/test_transfer_dialog.py @@ -32,5 +32,32 @@ async def test_transfer(application_with_one_connection, fake_server_with_blockc application_with_one_connection.loop.call_later(10, close_dialog) transfer_dialog.view.show() await exec_test() - #close_dialog() - #await fake_server_with_blockchain.close() + + +@pytest.mark.asyncio +async def test_transfer_chained_tx(application_with_two_connections, fake_server_with_blockchain, bob, john): + transfer_dialog = TransferController.create(None, application_with_two_connections) + + def close_dialog(): + if transfer_dialog.view.isVisible(): + transfer_dialog.view.hide() + + async def exec_test(): + QTest.mouseClick(transfer_dialog.view.radio_pubkey, Qt.LeftButton) + QTest.keyClicks(transfer_dialog.view.edit_pubkey, john.key.pubkey) + transfer_dialog.view.spinbox_amount.setValue(1000) + await asyncio.sleep(0.1) + assert not transfer_dialog.view.button_box.button(QDialogButtonBox.Ok).isEnabled() + await asyncio.sleep(0.1) + QTest.keyClicks(transfer_dialog.view.password_input.edit_secret_key, bob.salt) + QTest.keyClicks(transfer_dialog.view.password_input.edit_password, bob.password) + assert transfer_dialog.view.button_box.button(QDialogButtonBox.Ok).isEnabled() + QTest.mouseClick(transfer_dialog.view.button_box.button(QDialogButtonBox.Ok), Qt.LeftButton) + await asyncio.sleep(0.2) + assert isinstance(fake_server_with_blockchain.forge.pool[0], Transaction) + assert fake_server_with_blockchain.forge.pool[0].comment == "[CHAINED]" + assert isinstance(fake_server_with_blockchain.forge.pool[1], Transaction) + + application_with_two_connections.loop.call_later(10, close_dialog) + transfer_dialog.view.show() + await exec_test() -- GitLab