diff --git a/python/src/deltachat/account.py b/python/src/deltachat/account.py index 55f8c6d5c..ff08cc237 100644 --- a/python/src/deltachat/account.py +++ b/python/src/deltachat/account.py @@ -576,6 +576,16 @@ class Account(object): config_tracker.wait_finish() lib.dc_context_run(self._dc_context) + @contextmanager + def configure(self): + if self.is_configured(): + return + if not self.get_config("addr") or not self.get_config("mail_pw"): + raise MissingCredentials("addr or mail_pwd not set in config") + with self.temp_plugin(ConfigureTracker()) as config_tracker: + lib.dc_configure(self._dc_context) + yield config_tracker + def is_started(self): return self._event_thread.is_alive() and bool(lib.dc_is_running(self._dc_context)) diff --git a/python/src/deltachat/tracker.py b/python/src/deltachat/tracker.py index 250016d6e..a566c5d5d 100644 --- a/python/src/deltachat/tracker.py +++ b/python/src/deltachat/tracker.py @@ -69,8 +69,11 @@ class ConfigureTracker: """ wait until smtp is configured. """ self._imap_finished.wait() - def wait_progress(self): - return self._progress.get() + def wait_progress(self, data1=None): + while 1: + evdata = self._progress.get() + if data1 is None or evdata == data1: + break def wait_finish(self): """ wait until configure is completed. diff --git a/python/tests/test_account.py b/python/tests/test_account.py index 5261d2289..283a619af 100644 --- a/python/tests/test_account.py +++ b/python/tests/test_account.py @@ -1211,6 +1211,7 @@ class TestOnlineAccount: qr = chat.get_join_qr() lp.sec("ac2: start QR-code based join-group protocol") ch = ac2.qr_join_chat(qr) + lp.sec("ac2: qr_join_chat() returned") assert ch.id >= 10 # check that at least some of the handshake messages are deleted ac1._evtracker.get_matching("DC_EVENT_IMAP_MESSAGE_DELETED") @@ -1659,26 +1660,27 @@ class TestOnlineConfigureFails: ac1, configdict = acfactory.get_online_config() ac1.update_config(dict(addr=configdict["addr"], mail_pw="123")) - ac1.start() - wait_configuration_progress(ac1, 500) + with ac1.configure() as tracker: + tracker.wait_progress(500) + tracker.wait_progress(0) ev = ac1._evtracker.get_matching("DC_EVENT_ERROR_NETWORK") assert "cannot login" in ev.data2.lower() - wait_configuration_progress(ac1, 0, 0) def test_invalid_user(self, acfactory): ac1, configdict = acfactory.get_online_config() ac1.update_config(dict(addr="x" + configdict["addr"], mail_pw=configdict["mail_pw"])) - ac1.start() - wait_configuration_progress(ac1, 500) + with ac1.configure() as tracker: + tracker.wait_progress(500) + tracker.wait_progress(0) ev = ac1._evtracker.get_matching("DC_EVENT_ERROR_NETWORK") assert "cannot login" in ev.data2.lower() - wait_configuration_progress(ac1, 0, 0) def test_invalid_domain(self, acfactory): ac1, configdict = acfactory.get_online_config() ac1.update_config((dict(addr=configdict["addr"] + "x", mail_pw=configdict["mail_pw"]))) - ac1.start() + with ac1.configure() as tracker: + tracker.wait_progress(500) + tracker.wait_progress(0) wait_configuration_progress(ac1, 500) ev = ac1._evtracker.get_matching("DC_EVENT_ERROR_NETWORK") assert "could not connect" in ev.data2.lower() - wait_configuration_progress(ac1, 0, 0)