From 0c2681699fae27d565ed76749d92126ed8acd261 Mon Sep 17 00:00:00 2001
From: Insoleet <insomniak.fr@gmail.com>
Date: Thu, 3 Sep 2015 18:08:39 +0200
Subject: [PATCH] Initializing tests with pretenders

---
 run_tests.py                                  |  11 +-
 src/cutecoin/core/net/node.py                 |   1 +
 src/cutecoin/gui/process_cfg_community.py     |   4 +-
 src/cutecoin/tests/mocks/__init__.py          |   1 +
 src/cutecoin/tests/mocks/bma/__init__.py      |   1 +
 .../tests/mocks/bma/new_blockchain.py         | 106 ++++++++++++++++++
 .../tests/process_cfg_community/__init__.py   |  57 ++++++++++
 .../test_add_community.py                     |  55 +++++++++
 8 files changed, 233 insertions(+), 3 deletions(-)
 create mode 100644 src/cutecoin/tests/mocks/__init__.py
 create mode 100644 src/cutecoin/tests/mocks/bma/__init__.py
 create mode 100644 src/cutecoin/tests/mocks/bma/new_blockchain.py
 create mode 100644 src/cutecoin/tests/process_cfg_community/__init__.py
 create mode 100644 src/cutecoin/tests/process_cfg_community/test_add_community.py

diff --git a/run_tests.py b/run_tests.py
index 762b1959..3f2ee70a 100644
--- a/run_tests.py
+++ b/run_tests.py
@@ -1,10 +1,19 @@
 import sys
 import os
 import unittest
+import subprocess
+import time
+
+cmd = 'python -m pretenders.server.server --host 0.0.0.0 --port 50000'
+
+p = subprocess.Popen(cmd)
+time.sleep(2)
 
 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'lib')))
 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'src')))
 
+print("Run")
 runner = unittest.TextTestRunner().run(unittest.defaultTestLoader.discover(start_dir='cutecoin.tests', pattern='test_*'))
-
+print("Terminate")
+p.terminate()
 sys.exit(not runner.wasSuccessful())
\ No newline at end of file
diff --git a/src/cutecoin/core/net/node.py b/src/cutecoin/core/net/node.py
index ed141ac4..c790daac 100644
--- a/src/cutecoin/core/net/node.py
+++ b/src/cutecoin/core/net/node.py
@@ -72,6 +72,7 @@ class Node(QObject):
         def handle_reply(reply):
             if reply.error() == QNetworkReply.NoError:
                 strdata = bytes(reply.readAll()).decode('utf-8')
+                logging.debug(strdata)
                 nonlocal peer_data
                 peer_data = json.loads(strdata)
                 future_reply.set_result(True)
diff --git a/src/cutecoin/gui/process_cfg_community.py b/src/cutecoin/gui/process_cfg_community.py
index 9f37d5ed..33e34f84 100644
--- a/src/cutecoin/gui/process_cfg_community.py
+++ b/src/cutecoin/gui/process_cfg_community.py
@@ -45,10 +45,10 @@ class StepPageInit(Step):
         self.node = yield from Node.from_address(self.config_dialog.app.network_manager, None, server, port)
         if self.node:
             self.config_dialog.button_next.setEnabled(True)
-            self.config_dialog.button_check_node.setText("Ok !")
+            self.config_dialog.button_checknode.setText("Ok !")
         else:
             self.config_dialog.button_next.setEnabled(False)
-            self.config_dialog.button_check_node.setText("Could not connect.")
+            self.config_dialog.button_checknode.setText("Could not connect.")
 
     @pyqtSlot()
     def check_node(self):
diff --git a/src/cutecoin/tests/mocks/__init__.py b/src/cutecoin/tests/mocks/__init__.py
new file mode 100644
index 00000000..7e4cdeb7
--- /dev/null
+++ b/src/cutecoin/tests/mocks/__init__.py
@@ -0,0 +1 @@
+__author__ = 'ggoinvic'
diff --git a/src/cutecoin/tests/mocks/bma/__init__.py b/src/cutecoin/tests/mocks/bma/__init__.py
new file mode 100644
index 00000000..7e4cdeb7
--- /dev/null
+++ b/src/cutecoin/tests/mocks/bma/__init__.py
@@ -0,0 +1 @@
+__author__ = 'ggoinvic'
diff --git a/src/cutecoin/tests/mocks/bma/new_blockchain.py b/src/cutecoin/tests/mocks/bma/new_blockchain.py
new file mode 100644
index 00000000..819a597e
--- /dev/null
+++ b/src/cutecoin/tests/mocks/bma/new_blockchain.py
@@ -0,0 +1,106 @@
+from pretenders.client.http import HTTPMock
+from pretenders.common.constants import FOREVER
+
+bma_block_0 = b"""{
+    "version": 1,
+    "nonce": 10144,
+    "number": 0,
+    "powMin": 3,
+    "time": 1421838980,
+    "medianTime": 1421838980,
+    "membersCount": 4,
+    "monetaryMass": 0,
+    "currency": "meta_brouzouf",
+    "issuer": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
+    "signature": "+78w7251vvRdhoIJ6IWHEiEOLxNrmfQf45Y5sYvPdnAdXkVpO1unMV5YA/G5Vhphyz1dICrbeKCPM5qbFsoWAQ==",
+    "hash": "00063EB6E83F8717CEF1D25B3E2EE308374A14B1",
+    "parameters": "0.1:86400:100:604800:2629800:3:3:2629800:3:11:600:20:144:0.67",
+    "previousHash": null,
+    "previousIssuer": null,
+    "dividend": null,
+    "membersChanges": [ ],
+    "identities":
+
+[
+
+    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:Ot3zIp/nsHT3zgJy+2YcXPL6vaM5WFsD+F8w3qnJoBRuBG6lv761zoaExp2iyUnm8fDAyKPpMxRK2kf437QSCw==:1421787800:inso",
+    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:GZKLgaxJKL+GqxVLePMt8OVLJ6qTLrib5Mr/j2gjiNRY2k485YLB2OlzhBzZVnD3xLs0xi69JUfmLnM54j3aCA==:1421786393:cgeek",
+    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:th576H89dfymkG7/sH+DAIzjlmIqNEW6zY3ONrGeAml+k3f1ver399kYnEgG5YCaKXnnVM7P0oJHah80BV3mDw==:1421790376:moul",
+    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:XRmbTYFkPeGVEU2mJzzN4h1oVNDsZ4yyNZlDAfBm9CWhBsZ82QqX9GPHye2hBxxiu4Nz1BHgQiME6B4JcAC8BA==:1421787461:galuel"
+
+],
+"joiners":
+[
+
+    "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:ccJm3F44eLMhQtnQY/7+14SWCDqVTL3Miw65hBVpV+YiUSUknIGhBNN0C0Cf+Pf0/pa1tjucW8Us3z5IklFSDg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787800:inso",
+    "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:1lFIiaR0QX0jibr5zQpXVGzBvMGqcsTRlmHiwGz5HOAZT8PTdVUb5q6YGZ6qAUZjdMjPmhLaiMIpYc47wUnzBA==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421786393:cgeek",
+    "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:ctyAhpTRrAAOhFJukWI8RBr//nqYYdQibVzjOfaCdcWLb3TNFKrNBBothNsq/YrYHr7gKrpoftucf/oxLF8zAg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421790376:moul",
+    "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:uoiGaC5b7kWqtqdPxwatPk9QajZHCNT9rf8/8ud9Rli24z/igcOf0Zr4A6RTAIKWUq9foW39VqJe+Y9R3rhACw==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787461:galuel"
+
+],
+"actives": [ ],
+"leavers": [ ],
+"excluded": [ ],
+"certifications":
+
+    [
+        "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:3wmCVW8AbVxRFm2PuLXD9UTCIg93MhUblZJvlYrDldSV4xuA7mZCd8TV4vb/6Bkc0FMQgBdHtpXrQ7dpo20uBA==",
+        "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:7UMQsUjLvuiZKIzOH5rrZDdDi5rXUo69EuQulY1Zm42xpRx/Gt5CkoTcJ/Mu83oElQbcZZTz/lVJ6IS0jzMiCQ==",
+        "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:twWSY9etI82FLEHzhdqIoHsC9ehWCA7DCPiGxDLCWGPO4TG77hwtn3RcC68qoKHCib577JCp+fcKyp2vyI6FDA==",
+        "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:7K5MHkO8ibf5SchmPkRrmsg9owEZZ23uEMJJSQYG7L3PUmAKmmV/0VSjivxXH8gJGQBGsXQoK79x1jsYnj2nAg==",
+        "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:Jua4FcEJFptSE5OoG1/Mgzx4e9jgGnYu7t8g1sqqPujI9hRhLFNXbQXedPS1q1OD5vWivA045gKOq/gnj8opDg==",
+        "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:R/DV4/wYjvBG09QSOGtnxd3bfPFhVjEE5Uy3BsBMVUvjLsgxjf8NgLhYVozcHTRWS43ArxlXKfS5m3+KIPhhAQ==",
+        "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:4hP+ahJK021akL4UxB6c5QLaGJXa9eapd3nfdFQe+Xy87f/XLhj8BCa22XbbOlyGdaZRT3AYzbCL2UD5tI8mCw==",
+        "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:sZTQJr0d/xQnxrIIdSePUJpSTOa8v6IYGXMF2fVDZxQU8vwfzPm2dUKTaF0nU6E9wOYszzkBHaXL85nir+WtCQ==",
+        "37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:hDuBkoFhWhR/FgOU1+9SbQGBMIr47xqUzw1ZMERaPQo4aWm0WFbZurG4lvuJZzTyG6RF/gSw4VPvYZFPxWmADg==",
+        "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:79ZVrBehElVZh82fJdR18IJx06GkEVZTbwdHH4zb0S6VaGwdtLh1rvomm4ukBvUc8r/suTweG/SScsJairXNAg==",
+        "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:e/ai9E4G5CFB9Qi329e0ffYpZMgxj8mM4rviqIr2+UESA0UG86OuAAyHO11hYeyolZRiU8I7WdtNE98B1uZuBg==",
+        "BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:q4PCneYkcPH8AHEqEvqTtYQWslhlYO2B87aReuOl1uPczn5Q3VkZFAsU48ZTYryeyWp2nxdQojdFYhlAUNchAw=="
+    ],
+    "transactions": [ ],
+    "raw": "Version: 1\nType: Block\nCurrency: meta_brouzouf\nNonce: 10144\nNumber: 0\nPoWMin: 3\nTime: 1421838980\nMedianTime: 1421838980\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nParameters: 0.1:86400:100:604800:2629800:3:3:2629800:3:11:600:20:144:0.67\nMembersCount: 4\nIdentities:\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:Ot3zIp/nsHT3zgJy+2YcXPL6vaM5WFsD+F8w3qnJoBRuBG6lv761zoaExp2iyUnm8fDAyKPpMxRK2kf437QSCw==:1421787800:inso\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:GZKLgaxJKL+GqxVLePMt8OVLJ6qTLrib5Mr/j2gjiNRY2k485YLB2OlzhBzZVnD3xLs0xi69JUfmLnM54j3aCA==:1421786393:cgeek\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:th576H89dfymkG7/sH+DAIzjlmIqNEW6zY3ONrGeAml+k3f1ver399kYnEgG5YCaKXnnVM7P0oJHah80BV3mDw==:1421790376:moul\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:XRmbTYFkPeGVEU2mJzzN4h1oVNDsZ4yyNZlDAfBm9CWhBsZ82QqX9GPHye2hBxxiu4Nz1BHgQiME6B4JcAC8BA==:1421787461:galuel\nJoiners:\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:ccJm3F44eLMhQtnQY/7+14SWCDqVTL3Miw65hBVpV+YiUSUknIGhBNN0C0Cf+Pf0/pa1tjucW8Us3z5IklFSDg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787800:inso\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:1lFIiaR0QX0jibr5zQpXVGzBvMGqcsTRlmHiwGz5HOAZT8PTdVUb5q6YGZ6qAUZjdMjPmhLaiMIpYc47wUnzBA==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421786393:cgeek\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:ctyAhpTRrAAOhFJukWI8RBr//nqYYdQibVzjOfaCdcWLb3TNFKrNBBothNsq/YrYHr7gKrpoftucf/oxLF8zAg==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421790376:moul\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:uoiGaC5b7kWqtqdPxwatPk9QajZHCNT9rf8/8ud9Rli24z/igcOf0Zr4A6RTAIKWUq9foW39VqJe+Y9R3rhACw==:0:DA39A3EE5E6B4B0D3255BFEF95601890AFD80709:1421787461:galuel\nActives:\nLeavers:\nExcluded:\nCertifications:\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:3wmCVW8AbVxRFm2PuLXD9UTCIg93MhUblZJvlYrDldSV4xuA7mZCd8TV4vb/6Bkc0FMQgBdHtpXrQ7dpo20uBA==\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:7UMQsUjLvuiZKIzOH5rrZDdDi5rXUo69EuQulY1Zm42xpRx/Gt5CkoTcJ/Mu83oElQbcZZTz/lVJ6IS0jzMiCQ==\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:0:twWSY9etI82FLEHzhdqIoHsC9ehWCA7DCPiGxDLCWGPO4TG77hwtn3RcC68qoKHCib577JCp+fcKyp2vyI6FDA==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:7K5MHkO8ibf5SchmPkRrmsg9owEZZ23uEMJJSQYG7L3PUmAKmmV/0VSjivxXH8gJGQBGsXQoK79x1jsYnj2nAg==\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:Jua4FcEJFptSE5OoG1/Mgzx4e9jgGnYu7t8g1sqqPujI9hRhLFNXbQXedPS1q1OD5vWivA045gKOq/gnj8opDg==\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:0:R/DV4/wYjvBG09QSOGtnxd3bfPFhVjEE5Uy3BsBMVUvjLsgxjf8NgLhYVozcHTRWS43ArxlXKfS5m3+KIPhhAQ==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:4hP+ahJK021akL4UxB6c5QLaGJXa9eapd3nfdFQe+Xy87f/XLhj8BCa22XbbOlyGdaZRT3AYzbCL2UD5tI8mCw==\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:sZTQJr0d/xQnxrIIdSePUJpSTOa8v6IYGXMF2fVDZxQU8vwfzPm2dUKTaF0nU6E9wOYszzkBHaXL85nir+WtCQ==\n37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:BMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:0:hDuBkoFhWhR/FgOU1+9SbQGBMIr47xqUzw1ZMERaPQo4aWm0WFbZurG4lvuJZzTyG6RF/gSw4VPvYZFPxWmADg==\n8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:79ZVrBehElVZh82fJdR18IJx06GkEVZTbwdHH4zb0S6VaGwdtLh1rvomm4ukBvUc8r/suTweG/SScsJairXNAg==\nHnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:e/ai9E4G5CFB9Qi329e0ffYpZMgxj8mM4rviqIr2+UESA0UG86OuAAyHO11hYeyolZRiU8I7WdtNE98B1uZuBg==\nBMAVuMDcGhYAV4wA27DL1VXX2ZARZGJYaMwpf7DJFMYH:37qBxM4hLV2jfyYo2bNzAjkeLngLr2r7G2HpdpKieVxw:0:q4PCneYkcPH8AHEqEvqTtYQWslhlYO2B87aReuOl1uPczn5Q3VkZFAsU48ZTYryeyWp2nxdQojdFYhlAUNchAw==\nTransactions:\n"
+
+}"""
+
+bma_peering = b"""{
+
+    "version": 1,
+    "currency": "meta_brouzouf",
+    "endpoints":
+
+    [
+        "BASIC_MERKLED_API  localhost 0.0.0.0 8000"
+    ],
+    "status": "UP",
+    "block": "0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709",
+    "signature": "boZBmPJUcL11O+RxiL7nEoxueUObOr7SqZVLFJFbxEeMe9mKgfOmBIZ5ch09s1n0cIx6BFlMbVl0yiy23h31Cw==",
+    "raw": "Version: 1\nType: Peer\nCurrency: meta_brouzouf\nPublicKey: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nBlock: 0-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709\nEndpoints:\nBASIC_MERKLED_API  localhost 0.0.0.0 8000\n",
+    "pubkey": "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk"
+
+}"""
+
+
+def get_mock():
+    # Assume a running server
+    # Initialise the mock client and clear all responses
+    mock = HTTPMock('localhost', 50000)
+
+    mock.when('GET /network/peering')\
+        .reply(body=bma_peering,
+                times=FOREVER,
+                headers={'Content-Type': 'application/json'})
+
+    # For GET requests to /hello reply with a body of 'Hello'
+    mock.when('GET /blockchain/Block/0')\
+        .reply(body=b"Block not found",
+               status=404,
+               times=FOREVER,
+                headers={'Content-Type': 'application/json'})
+
+    # For GET requests to /hello reply with a body of 'Hello'
+    mock.when('GET /blockchain/current')\
+        .reply(body=b"Block not found",
+               status=404,
+               times=FOREVER,
+                headers={'Content-Type': 'application/json'})
+    return mock
diff --git a/src/cutecoin/tests/process_cfg_community/__init__.py b/src/cutecoin/tests/process_cfg_community/__init__.py
new file mode 100644
index 00000000..95c3e6e1
--- /dev/null
+++ b/src/cutecoin/tests/process_cfg_community/__init__.py
@@ -0,0 +1,57 @@
+import sys
+import unittest
+import os
+import asyncio
+import quamash
+from PyQt5.QtWidgets import QMenu
+from PyQt5.QtCore import QLocale
+from cutecoin.gui.mainwindow import MainWindow
+from cutecoin.core.app import Application
+from cutecoin.tests import get_application
+
+class MainWindowMenusTest(unittest.TestCase):
+    def setUp(self):
+        self.qapplication = get_application()
+        QLocale.setDefault(QLocale("en_GB"))
+        self.lp = quamash.QEventLoop(self.qapplication)
+        asyncio.set_event_loop(self.lp)
+
+        self.application = Application(self.qapplication, self.lp, None, None)
+        self.main_window = MainWindow(self.application)
+
+    def tearDown(self):
+        try:
+            self.lp.close()
+        finally:
+            asyncio.set_event_loop(None)
+
+    def test_menubar(self):
+        children = self.main_window.menubar.children()
+        menus = []
+        """:type: list[QMenu]"""
+        for child in children:
+            if isinstance(child, QMenu):
+                menus.append(child)
+        self.assertEqual(len(menus), 3)
+        self.assertEqual(menus[0].objectName(), 'menu_file')
+        self.assertEqual(menus[1].objectName(), 'menu_account')
+        self.assertEqual(menus[2].objectName(), 'menu_help')
+
+    def test_menu_account(self):
+        actions = self.main_window.menu_account.actions()
+        """:type: list[QAction]"""
+        self.assertEqual('action_configure_parameters', actions[1].objectName())
+        self.assertEqual('action_add_account', actions[2].objectName())
+        self.assertEqual('actionCertification', actions[4].objectName())
+        self.assertEqual('actionTransfer_money', actions[5].objectName())
+        self.assertEqual('action_add_a_contact', actions[7].objectName())
+        self.assertEqual(9, len(actions))
+
+    def test_menu_actions(self):
+        actions = self.main_window.menu_help.actions()
+        """:type: list[QAction]"""
+        self.assertEqual(len(actions), 1)
+        self.assertEqual(actions[0].objectName(), 'actionAbout')
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/src/cutecoin/tests/process_cfg_community/test_add_community.py b/src/cutecoin/tests/process_cfg_community/test_add_community.py
new file mode 100644
index 00000000..2fdea39f
--- /dev/null
+++ b/src/cutecoin/tests/process_cfg_community/test_add_community.py
@@ -0,0 +1,55 @@
+import sys
+import unittest
+import os
+import asyncio
+import quamash
+import logging
+import time
+from PyQt5.QtWidgets import QMenu
+from PyQt5.QtCore import QLocale, Qt
+from PyQt5.QtTest import QTest
+from cutecoin.tests.mocks.bma import new_blockchain
+from cutecoin.tests.stubs.core.registry.identities import IdentitiesRegistry
+from cutecoin.gui.process_cfg_community import ProcessConfigureCommunity
+from cutecoin.gui.password_asker import PasswordAskerDialog
+from cutecoin.core.app import Application
+from cutecoin.core.account import Account
+from cutecoin.tests import get_application
+
+class ProcessAddCommunity(unittest.TestCase):
+    def setUp(self):
+        self.qapplication = get_application()
+        QLocale.setDefault(QLocale("en_GB"))
+        self.lp = quamash.QEventLoop(self.qapplication)
+        asyncio.set_event_loop(self.lp)
+
+        self.application = Application(self.qapplication, self.lp, None, None)
+        self.identities_registry = IdentitiesRegistry()
+        self.account = Account("test", "test", "test", [], [], [], self.identities_registry)
+        self.password_asker = PasswordAskerDialog(self.account)
+
+    def tearDown(self):
+        try:
+            self.lp.close()
+        finally:
+            asyncio.set_event_loop(None)
+
+    def test_add_community_empty_blockchain(self):
+        mock = new_blockchain.get_mock()
+        self.process_community = ProcessConfigureCommunity(self.application, self.account, None, self.password_asker)
+        QTest.mouseClick(self.process_community.lineedit_add_address, Qt.LeftButton)
+        QTest.keyClicks(self.process_community.lineedit_add_address, "localhost")
+        QTest.mouseDClick(self.process_community.spinbox_add_port, Qt.LeftButton)
+        self.process_community.spinbox_add_port.setValue(50000)
+        self.assertEqual(self.process_community.lineedit_add_address.text(), "localhost")
+        self.assertEqual(self.process_community.spinbox_add_port.value(), 50000)
+        QTest.mouseClick(self.process_community.button_checknode, Qt.LeftButton)
+        time.sleep(1)
+        self.assertEqual(mock.get_request(0).method, 'GET')
+        self.assertEqual(mock.get_request(0).url, '/network/peering')
+        self.assertEqual(self.process_community.button_checknode.text(), "Ok !")
+
+if __name__ == '__main__':
+    logging.basicConfig( stream=sys.stderr )
+    logging.getLogger().setLevel( logging.DEBUG )
+    unittest.main()
-- 
GitLab