diff --git a/src/cutecoin/core/app.py b/src/cutecoin/core/app.py index dbce9cfca1024b11cdae0ff34617ad9d6b06298c..fa449c57a099fdf06c4cbfba37d47dca1a8c5fe1 100644 --- a/src/cutecoin/core/app.py +++ b/src/cutecoin/core/app.py @@ -56,9 +56,6 @@ class Application(QObject): 'ref': 0 } - self.load() - self.switch_language() - def switch_language(self): translator = QTranslator(self.qapp) logging.debug("Loading translations") diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py index 8caaeb1b35d9b2fbaa58edbbfcf009b8603e716d..cde0152d0681d52a4cd486460632ac03f8d29a66 100644 --- a/src/cutecoin/gui/mainwindow.py +++ b/src/cutecoin/gui/mainwindow.py @@ -45,7 +45,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): QApplication.setWindowIcon(QIcon(":/icons/cutecoin_logo")) self.app = app - self.app.load() self.initialized = False if self.app.preferences["account"] != "": account = self.app.get_account(self.app.preferences["account"]) @@ -65,13 +64,13 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.action_change_account(self.app.get_account(self.app.preferences['account'])) self.password_asker = None - - self.busybar = QProgressBar(self.statusbar) - self.busybar.setMinimum(0) - self.busybar.setMaximum(0) - self.busybar.setValue(-1) - self.statusbar.addWidget(self.busybar) - self.busybar.hide() + # + # self.busybar = QProgressBar(self.statusbar) + # self.busybar.setMinimum(0) + # self.busybar.setMaximum(0) + # self.busybar.setValue(-1) + # #self.statusbar.addWidget(self.busybar) + # self.busybar.hide() self.app.version_requested.connect(self.latest_version_requested) self.app.get_last_version() @@ -83,24 +82,24 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.status_label.setTextFormat(Qt.RichText) self.label_time = QLabel("", self) - - self.statusbar.addPermanentWidget(self.status_label, 1) - self.statusbar.addPermanentWidget(self.label_time) - self.statusbar.addPermanentWidget(self.combo_referential) + # + # self.statusbar.addPermanentWidget(self.status_label, 1) + # self.statusbar.addPermanentWidget(self.label_time) + # self.statusbar.addPermanentWidget(self.combo_referential) self.update_time() - - self.homescreen = HomeScreenWidget(self.app) - self.centralWidget().layout().addWidget(self.homescreen) - self.homescreen.button_new.clicked.connect(self.open_add_account_dialog) - self.homescreen.button_import.clicked.connect(self.import_account) - self.open_ucoin_info = lambda: QDesktopServices.openUrl(QUrl("http://ucoin.io/theoretical/")) - self.homescreen.button_info.clicked.connect(self.open_ucoin_info) + # + # self.homescreen = HomeScreenWidget(self.app) + # self.centralWidget().layout().addWidget(self.homescreen) + # self.homescreen.button_new.clicked.connect(self.open_add_account_dialog) + # self.homescreen.button_import.clicked.connect(self.import_account) + # self.open_ucoin_info = lambda: QDesktopServices.openUrl(QUrl("http://ucoin.io/theoretical/")) + # self.homescreen.button_info.clicked.connect(self.open_ucoin_info) self.import_dialog = None self.export_dialog = None # TODO: There are too much refresh() calls on startup - self.refresh() + #self.refresh() def open_add_account_dialog(self): dialog = ProcessConfigureAccount(self.app, None) diff --git a/src/cutecoin/main.py b/src/cutecoin/main.py index 6f307d8c15ad13ede448b89dbe8ba4d305082b26..ae2f0ac3a1ede143cd8e97bb84567eebe56953b5 100755 --- a/src/cutecoin/main.py +++ b/src/cutecoin/main.py @@ -20,6 +20,8 @@ if __name__ == '__main__': cutecoin = QApplication(sys.argv) loop = QEventLoop(cutecoin) app = Application(sys.argv, cutecoin, loop) + app.load() + app.switch_language() asyncio.set_event_loop(loop) logging.debug("Debug enabled : {0}".format(loop.get_debug())) with loop: diff --git a/src/cutecoin/tests/main_window/test_main_window_dialogs.py b/src/cutecoin/tests/main_window/test_main_window_dialogs.py index 7cfc3b895ba99a083801a3c4e6c010e23281aed6..4c5236a622a2cd3aa988808b82938d166bc5b24d 100644 --- a/src/cutecoin/tests/main_window/test_main_window_dialogs.py +++ b/src/cutecoin/tests/main_window/test_main_window_dialogs.py @@ -1,80 +1,122 @@ import sys import unittest import gc +import os +import asyncio +import quamash import PyQt5 -from PyQt5.QtWidgets import QApplication, QMenu +from PyQt5.QtWidgets import QMenu from PyQt5.QtCore import QLocale, QTimer from cutecoin.gui.mainwindow import MainWindow from cutecoin.core.app import Application # Qapplication cause a core dumped when re-run in setup # set it as global var -qapplication = QApplication(sys.argv) - class MainWindowDialogsTest(unittest.TestCase): def setUp(self): QLocale.setDefault(QLocale("en_GB")) -# self.application = Application(sys.argv, qapplication) -# self.main_window = MainWindow(self.application) -# -# def test_action_about(self): -# # select menu -# self.main_window.actionAbout.trigger() -# widgets = qapplication.topLevelWidgets() -# for widget in widgets: -# if isinstance(widget, PyQt5.QtWidgets.QDialog): -# self.assertEqual(widget.objectName(), 'AboutPopup') -# self.assertEqual(widget.isVisible(), True) -# widget.close() -# break -# -# def test_action_add_account(self): -# # asynchronous test, cause dialog is waiting user response -# QTimer.singleShot(0, self._async_test_action_add_account) -# # select menu -# self.main_window.action_add_account.trigger() -# -# def _async_test_action_add_account(self): -# widgets = qapplication.topLevelWidgets() -# for widget in widgets: -# if isinstance(widget, PyQt5.QtWidgets.QDialog): -# self.assertEqual(widget.objectName(), 'AccountConfigurationDialog') -# self.assertEqual(widget.isVisible(), True) -# widget.close() -# break -# # -# # # fixme: require a app.current_account fixture -# # # def test_action_configure_account(self): -# # # # asynchronous test, cause dialog is waiting user response -# # # QTimer.singleShot(0, self._async_test_action_configure_account) -# # # # select about menu -# # # self.main_window.action_configure_parameters.trigger() -# # # -# # # def _async_test_action_configure_account(self): -# # # widgets = qapplication.topLevelWidgets() -# # # for widget in widgets: -# # # if isinstance(widget, PyQt5.QtWidgets.QDialog): -# # # self.assertEqual(widget.objectName(), 'AccountConfigurationDialog') -# # # self.assertEqual(widget.isVisible(), True) -# # # widget.close() -# # # break -# # -# -# def test_action_export_account(self): -# # select menu -# self.main_window.action_export.trigger() -# -# widgets = qapplication.topLevelWidgets() -# for widget in widgets: -# if isinstance(widget, PyQt5.QtWidgets.QFileDialog): -# self.assertEqual(widget.objectName(), 'ExportFileDialog') -# self.assertTrue(widget.isVisible()) -# widget.close() -# break + self.qapplication = quamash.QApplication([]) + self.lp = quamash.QEventLoop(self.qapplication) + asyncio.set_event_loop(self.lp) + + self.additional_exceptions = [] + + self.orig_excepthook = sys.excepthook + + def except_handler(loop, ctx): + self.additional_exceptions.append(ctx) + + def excepthook(type, *args): + self.lp.stop() + self.orig_excepthook(type, *args) + + sys.excepthook = excepthook + + self.lp.set_exception_handler(except_handler) + + self.application = Application(sys.argv, self.qapplication, self.lp) + self.main_window = MainWindow(self.application) + + def tearDown(self): + # delete all top widgets from main QApplication + sys.excepthook = self.orig_excepthook + self.qapplication.quit() + self.lp.stop() + try: + self.lp.close() + finally: + asyncio.set_event_loop(None) + self.qapplication.exit() + + for exc in self.additional_exceptions: + if ( + os.name == 'nt' and + isinstance(exc['exception'], WindowsError) and + exc['exception'].winerror == 6 + ): + # ignore Invalid Handle Errors + continue + raise exc['exception'] + + # def test_action_about(self): + # pass + # select menu + # self.main_window.actionAbout.trigger() + # widgets = self.qapplication.topLevelWidgets() + # for widget in widgets: + # if isinstance(widget, PyQt5.QtWidgets.QDialog): + # if widget.isVisible(): + # self.assertEqual('AboutPopup', widget.objectName()) + # widget.close() + # break + # + # def test_action_add_account(self): + # pass + # asynchronous test, cause dialog is waiting user response + #QTimer.singleShot(1, self._async_test_action_add_account) + # select menu + #self.main_window.action_add_account.trigger() + # + # def _async_test_action_add_account(self): + # widgets = self.qapplication.topLevelWidgets() + # for widget in widgets: + # if isinstance(widget, PyQt5.QtWidgets.QDialog): + # if widget.isVisible(): + # self.assertEqual('AccountConfigurationDialog', widget.objectName()) + # widget.close() + # break - def test_ignoreme(self): - return + # fixme: require a app.current_account fixture + # def test_action_configure_account(self): + # # asynchronous test, cause dialog is waiting user response + # QTimer.singleShot(0, self._async_test_action_configure_account) + # # select about menu + # self.main_window.action_configure_parameters.trigger() + # + # def _async_test_action_configure_account(self): + # widgets = qapplication.topLevelWidgets() + # for widget in widgets: + # if isinstance(widget, PyQt5.QtWidgets.QDialog): + # self.assertEqual(widget.objectName(), 'AccountConfigurationDialog') + # self.assertEqual(widget.isVisible(), True) + # widget.close() + # break + # + # def test_action_export_account(self): + # pass + # select menu + # self.main_window.action_export.trigger() + # + # widgets = self.qapplication.topLevelWidgets() + # for widget in widgets: + # if isinstance(widget, PyQt5.QtWidgets.QFileDialog): + # if widget.isVisible(): + # self.assertEqual('ExportFileDialog', widget.objectName()) + # widget.close() + # break + def test_empty(self): + self.assertEquals(1, 1) if __name__ == '__main__': unittest.main() diff --git a/src/cutecoin/tests/main_window/test_main_window_menus.py b/src/cutecoin/tests/main_window/test_main_window_menus.py index 02e6360914e18845892422ff0c142a36844071c5..7a2d24bfcf3b3df92fbd2dbf8486e16abf70927a 100644 --- a/src/cutecoin/tests/main_window/test_main_window_menus.py +++ b/src/cutecoin/tests/main_window/test_main_window_menus.py @@ -3,7 +3,9 @@ import sys import unittest import gc -import PyQt5 +import os +import asyncio +import quamash from PyQt5.QtWidgets import QApplication, QMenu from PyQt5.QtCore import QLocale from cutecoin.gui.mainwindow import MainWindow @@ -17,52 +19,80 @@ qapplication = QApplication(sys.argv) class MainWindowMenusTest(unittest.TestCase): def setUp(self): QLocale.setDefault(QLocale("en_GB")) -# self.application = Application(sys.argv, qapplication) -# self.main_window = MainWindow(self.application) -# -# def tearDown(self): -# # delete all top widgets from main QApplication -# lw = qapplication.topLevelWidgets() -# for w in lw: -# del w -# gc.collect() -# -# 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_account') -# self.assertEqual(menus[1].objectName(), 'menu_contacts') -# self.assertEqual(menus[2].objectName(), 'menu_actions') -# -# def test_menu_account(self): -# actions = self.main_window.menu_account.actions() -# """:type: list[QAction]""" -# self.assertEqual(len(actions), 10) -# self.assertEqual(actions[0].objectName(), 'action_add_account') -# self.assertEqual(actions[2].objectName(), 'action_configure_parameters') -# self.assertEqual(actions[3].objectName(), 'action_set_as_default') -# self.assertEqual(actions[5].objectName(), 'action_export') -# self.assertEqual(actions[6].objectName(), 'action_import') -# self.assertEqual(actions[8].objectName(), 'actionAbout') -# self.assertEqual(actions[9].objectName(), 'action_quit') -# -# def test_menu_contacts(self): -# actions = self.main_window.menu_contacts.actions() -# """:type: list[QAction]""" -# self.assertEqual(len(actions), 3) -# self.assertEqual(actions[1].objectName(), 'action_add_a_contact') -# -# def test_menu_actions(self): -# actions = self.main_window.menu_actions.actions() -# """:type: list[QAction]""" -# self.assertEqual(len(actions), 2) -# self.assertEqual(actions[0].objectName(), 'actionTransfer_money') -# self.assertEqual(actions[1].objectName(), 'actionCertification') + self.lp = quamash.QEventLoop(qapplication) + asyncio.set_event_loop(self.lp) + + self.additional_exceptions = [] + + self.orig_excepthook = sys.excepthook + + def except_handler(loop, ctx): + self.additional_exceptions.append(ctx) + + def excepthook(type, *args): + self.lp.stop() + self.orig_excepthook(type, *args) + + sys.excepthook = excepthook + + self.lp.set_exception_handler(except_handler) + + self.application = Application(sys.argv, qapplication, self.lp) + self.main_window = MainWindow(self.application) + + def tearDown(self): + # delete all top widgets from main QApplication + + sys.excepthook = self.orig_excepthook + + try: + self.lp.close() + finally: + asyncio.set_event_loop(None) + + for exc in self.additional_exceptions: + if ( + os.name == 'nt' and + isinstance(exc['exception'], WindowsError) and + exc['exception'].winerror == 6 + ): + # ignore Invalid Handle Errors + continue + raise exc['exception'] + + lw = qapplication.topLevelWidgets() + for w in lw: + del w + gc.collect() + + 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') + def test_ignoreme(self): return