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