Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix some race conditions
Browse files Browse the repository at this point in the history
matrss committed Feb 23, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 094e2b6 commit 0e41b55
Showing 1 changed file with 97 additions and 71 deletions.
168 changes: 97 additions & 71 deletions tests/_test_msui/test_mscolab.py
Original file line number Diff line number Diff line change
@@ -93,39 +93,41 @@ def test_connect_denied(self, mockset):

@mock.patch("PyQt5.QtWidgets.QWidget.setStyleSheet")
@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.No)
def test_connect_success(self, mockbox, mockset):
def test_connect_success(self, mockbox, mockset, qtbot):
assert mslib.utils.auth.get_password_from_keyring("MSCOLAB_AUTH_" + self.url, "mscolab") != "fnord"
self._connect_to_mscolab(password="fnord")
self._connect_to_mscolab(qtbot, password="fnord")

assert mslib.utils.auth.get_password_from_keyring("MSCOLAB_AUTH_" + self.url, "mscolab") == "fnord"
assert mockset.call_args_list == [mock.call("color: green;")]

def test_disconnect(self):
self._connect_to_mscolab()
def test_disconnect(self, qtbot):
self._connect_to_mscolab(qtbot)
assert self.window.mscolab_server_url is not None
QtTest.QTest.mouseClick(self.window.disconnectBtn, QtCore.Qt.LeftButton)
assert self.window.mscolab_server_url is None
# set ui_name_winodw default
assert self.main_window.usernameLabel.text() == 'User'

def test_login(self):
self._connect_to_mscolab()
def test_login(self, qtbot):
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(self.userdata[0], self.userdata[2])
QtWidgets.QApplication.processEvents()
# show logged in widgets
assert self.main_window.usernameLabel.text() == self.userdata[1]
assert self.main_window.connectBtn.isVisible() is False
assert self.main_window.mscolab.connect_window is None
assert self.main_window.local_active is True
# test operation listing visibility
assert self.main_window.listOperationsMSC.model().rowCount() == 1
self._login(qtbot, self.userdata[0], self.userdata[2])

def assert_():
# show logged in widgets
assert self.main_window.usernameLabel.text() == self.userdata[1]
assert self.main_window.connectBtn.isVisible() is False
assert self.main_window.mscolab.connect_window is None
assert self.main_window.local_active is True
# test operation listing visibility
assert self.main_window.listOperationsMSC.model().rowCount() == 1
qtbot.wait_until(assert_)

@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.Yes)
def test_login_with_different_account_shows_update_credentials_popup(self, mockbox):
self._connect_to_mscolab()
def test_login_with_different_account_shows_update_credentials_popup(self, mockbox, qtbot):
self._connect_to_mscolab(qtbot)
connect_window = self.main_window.mscolab.connect_window
self._login(self.userdata[0], self.userdata[2])
self._login(qtbot, self.userdata[0], self.userdata[2])
mockbox.assert_called_once_with(
connect_window,
"Update Credentials",
@@ -141,11 +143,11 @@ def test_login_with_different_account_shows_update_credentials_popup(self, mockb
# test operation listing visibility
assert self.main_window.listOperationsMSC.model().rowCount() == 1

def test_logout_action_trigger(self):
def test_logout_action_trigger(self, qtbot):
# Login
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(self.userdata[0], self.userdata[2])
self._login(qtbot, self.userdata[0], self.userdata[2])
assert self.main_window.usernameLabel.text() == self.userdata[1]
# Logout
self.main_window.mscolab.logout_action.trigger()
@@ -154,11 +156,11 @@ def test_logout_action_trigger(self):
assert self.main_window.local_active is True
assert self.main_window.usernameLabel.text() == "User"

def test_logout(self):
def test_logout(self, qtbot):
# Login
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(self.userdata[0], self.userdata[2])
self._login(qtbot, self.userdata[0], self.userdata[2])
assert self.main_window.usernameLabel.text() == self.userdata[1]
# Logout
self.main_window.mscolab.logout()
@@ -169,8 +171,8 @@ def test_logout(self):
assert self.main_window.local_active is True

@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.Yes)
def test_add_user(self, mockmessage):
self._connect_to_mscolab()
def test_add_user(self, mockmessage, qtbot):
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user("something", "something@something.org", "something")
assert config_loader(dataset="MSS_auth").get(self.url) == "something@something.org"
@@ -181,12 +183,12 @@ def test_add_user(self, mockmessage):
assert self.main_window.mscolab.connect_window is None

@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.No)
def test_add_users_without_updating_credentials_in_config_file(self, mockmessage):
def test_add_users_without_updating_credentials_in_config_file(self, mockmessage, qtbot):
create_msui_settings_file('{"MSS_auth": {"' + self.url + '": "something@something.org"}}')
read_config_file()
# check current settings
assert config_loader(dataset="MSS_auth").get(self.url) == "something@something.org"
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
assert self.window.mscolab_server_url is not None
self._create_user("anand", "anand@something.org", "anand_pass")
# check changed settings
@@ -197,14 +199,14 @@ def test_add_users_without_updating_credentials_in_config_file(self, mockmessage
assert self.main_window.usernameLabel.text() == "anand"

@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.Yes)
def test_add_users_with_updating_credentials_in_config_file(self, mockmessage):
def test_add_users_with_updating_credentials_in_config_file(self, mockmessage, qtbot):
create_msui_settings_file('{"MSS_auth": {"' + self.url + '": "something@something.org"}}')
mslib.utils.auth.save_password_to_keyring(service_name=self.url,
username="something@something.org", password="something")
read_config_file()
# check current settings
assert config_loader(dataset="MSS_auth").get(self.url) == "something@something.org"
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
assert self.window.mscolab_server_url is not None
self._create_user("anand", "anand@something.org", "anand_pass")
# check changed settings
@@ -214,16 +216,25 @@ def test_add_users_with_updating_credentials_in_config_file(self, mockmessage):
# check user is logged in
assert self.main_window.usernameLabel.text() == "anand"

def _connect_to_mscolab(self, password=""):
def _connect_to_mscolab(self, qtbot, password=""):
self.window.urlCb.setEditText(self.url)
self.window.httpPasswordLe.setText(password)
QtTest.QTest.mouseClick(self.window.connectBtn, QtCore.Qt.LeftButton)

def _login(self, emailid="a", password="a"):
def assert_():
assert not self.window.connectBtn.isVisible()
assert self.window.disconnectBtn.isVisible()
qtbot.wait_until(assert_)

def _login(self, qtbot, emailid="a", password="a"):
self.window.loginEmailLe.setText(emailid)
self.window.loginPasswordLe.setText(password)
QtTest.QTest.mouseClick(self.window.loginBtn, QtCore.Qt.LeftButton)

def assert_():
assert self.main_window.mscolab.connect_window is None
qtbot.wait_until(assert_)

def _create_user(self, username, email, password):
QtTest.QTest.mouseClick(self.window.addUserBtn, QtCore.Qt.LeftButton)
self.window.newUsernameLe.setText(str(username))
@@ -283,19 +294,19 @@ def setup(self, qapp, mscolab_app, mscolab_server):
# close all hanging operation option windows
self.window.mscolab.close_external_windows()

def test_activate_operation(self):
self._connect_to_mscolab()
def test_activate_operation(self, qtbot):
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(emailid=self.userdata[0], password=self.userdata[2])
self._login(qtbot, emailid=self.userdata[0], password=self.userdata[2])
# activate a operation
self._activate_operation_at_index(0)
assert self.window.mscolab.active_op_id is not None
assert self.window.mscolab.active_operation_name == self.operation_name

def test_view_open(self):
self._connect_to_mscolab()
def test_view_open(self, qtbot):
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(emailid=self.userdata[0], password=self.userdata[2])
self._login(qtbot, emailid=self.userdata[0], password=self.userdata[2])
# test after activating operation
self._activate_operation_at_index(0)
self.window.actionTableView.trigger()
@@ -326,10 +337,10 @@ def test_view_open(self):
@mock.patch("PyQt5.QtWidgets.QFileDialog.getSaveFileName",
return_value=(fs.path.join(mscolab_settings.MSCOLAB_DATA_DIR, 'test_export.ftml'),
"Flight track (*.ftml)"))
def test_handle_export(self, mockbox):
self._connect_to_mscolab()
def test_handle_export(self, mockbox, qtbot):
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(emailid=self.userdata[0], password=self.userdata[2])
self._login(qtbot, emailid=self.userdata[0], password=self.userdata[2])
self._activate_operation_at_index(0)
self.window.actionExportFlightTrackFTML.trigger()
exported_waypoints = WaypointsTableModel(filename=fs.path.join(self.window.mscolab.data_dir,
@@ -343,16 +354,16 @@ def test_handle_export(self, mockbox):
("example.csv", "actionImportFlightTrackCSV", 5),
("example.txt", "actionImportFlightTrackTXT", 5),
("flitestar.txt", "actionImportFlightTrackFliteStar", 10)])
def test_import_file(self, name):
def test_import_file(self, name, qtbot):
self.window.remove_plugins()
with mock.patch("mslib.msui.msui_mainwindow.config_loader", return_value=self.import_plugins):
self.window.add_import_plugins("qt")
file_path = fs.path.join(self.sample_path, name[0])
with mock.patch("mslib.msui.msui_mainwindow.get_open_filenames", return_value=[file_path]) as mockopen:
# with parametrize it is maybe too fast
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(emailid=self.userdata[0], password=self.userdata[2])
self._login(qtbot, emailid=self.userdata[0], password=self.userdata[2])
self._activate_operation_at_index(0)
wp = self.window.mscolab.waypoints_model
assert len(wp.waypoints) == 2
@@ -366,10 +377,10 @@ def test_import_file(self, name):
imported_wp = self.window.mscolab.waypoints_model
assert len(imported_wp.waypoints) == name[2]

def test_work_locally_toggle(self):
self._connect_to_mscolab()
def test_work_locally_toggle(self, qtbot):
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: self.userdata[0]}})
self._login(emailid=self.userdata[0], password=self.userdata[2])
self._login(qtbot, emailid=self.userdata[0], password=self.userdata[2])
self._activate_operation_at_index(0)
self.window.workLocallyCheckbox.setChecked(True)
self.window.mscolab.waypoints_model.invert_direction()
@@ -380,7 +391,7 @@ def test_work_locally_toggle(self):

@mock.patch("mslib.msui.mscolab.get_open_filename", return_value=os.path.join(sample_path, u"example.ftml"))
def test_browse_add_operation(self, mockopen, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
assert self.window.listOperationsMSC.model().rowCount() == 0
@@ -394,13 +405,16 @@ def test_browse_add_operation(self, mockopen, qtbot):
with mock.patch("PyQt5.QtWidgets.QMessageBox.information") as m:
QtTest.QTest.mouseClick(okWidget, QtCore.Qt.LeftButton)
m.assert_called_once()
assert self.window.listOperationsMSC.model().rowCount() == 1
item = self.window.listOperationsMSC.item(0)
assert item.operation_path == "example"
assert item.access_level == "creator"

def assert_():
assert self.window.listOperationsMSC.model().rowCount() == 1
item = self.window.listOperationsMSC.item(0)
assert item.operation_path == "example"
assert item.access_level == "creator"
qtbot.wait_until(assert_)

def test_add_operation(self, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "Alpha", "Description Alpha")
@@ -423,7 +437,7 @@ def test_add_operation(self, qtbot):

@mock.patch("PyQt5.QtWidgets.QInputDialog.getText", return_value=("flight7", True))
def test_handle_delete_operation(self, mocktext, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "berta@something.org"}})
self._create_user(qtbot, "berta", "berta@something.org", "something")
assert self.window.usernameLabel.text() == 'berta'
@@ -449,10 +463,10 @@ def test_handle_delete_operation(self, mocktext, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.Yes)
def test_handle_leave_operation(self, mockmessage, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)

modify_config_file({"MSS_auth": {self.url: self.userdata3[0]}})
self._login(self.userdata3[0], self.userdata3[2])
self._login(qtbot, self.userdata3[0], self.userdata3[2])
assert self.window.usernameLabel.text() == self.userdata3[1]
assert self.window.connectBtn.isVisible() is False

@@ -477,7 +491,7 @@ def assert_leave_operation_done():

@mock.patch("PyQt5.QtWidgets.QInputDialog.getText", return_value=("new_name", True))
def test_handle_rename_operation(self, mocktext, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "flight1234", "Description flight1234")
@@ -492,7 +506,7 @@ def test_handle_rename_operation(self, mocktext, qtbot):

@mock.patch("PyQt5.QtWidgets.QInputDialog.getText", return_value=("new_description", True))
def test_update_description(self, mocktext, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "flight1234", "Description flight1234")
@@ -507,7 +521,7 @@ def test_update_description(self, mocktext, qtbot):

@mock.patch("PyQt5.QtWidgets.QInputDialog.getText", return_value=("new_category", True))
def test_update_category(self, mocktext, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "flight1234", "Description flight1234")
@@ -522,7 +536,7 @@ def test_update_category(self, mocktext, qtbot):
assert self.window.mscolab.active_operation_category == "new_category"

def test_any_special_category(self, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "flight1234", "Description flight1234")
@@ -541,7 +555,7 @@ def test_any_special_category(self, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.information", return_value=QtWidgets.QMessageBox.Ok)
def test_get_recent_op_id(self, mockbox, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "anton@something.org"}})
self._create_user(qtbot, "anton", "anton@something.org", "something")
assert self.window.usernameLabel.text() == 'anton'
@@ -556,7 +570,7 @@ def test_get_recent_op_id(self, mockbox, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.information", return_value=QtWidgets.QMessageBox.Ok)
def test_get_recent_operation(self, mockbox, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "berta@something.org"}})
self._create_user(qtbot, "berta", "berta@something.org", "something")
assert self.window.usernameLabel.text() == 'berta'
@@ -570,7 +584,7 @@ def test_get_recent_operation(self, mockbox, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.information", return_value=QtWidgets.QMessageBox.Ok)
def test_open_chat_window(self, mockbox, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "flight1234", "Description flight1234")
@@ -582,7 +596,7 @@ def test_open_chat_window(self, mockbox, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.information", return_value=QtWidgets.QMessageBox.Ok)
def test_close_chat_window(self, mockbox, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self._create_operation(qtbot, "flight1234", "Description flight1234")
@@ -594,7 +608,7 @@ def test_close_chat_window(self, mockbox, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.information", return_value=QtWidgets.QMessageBox.Ok)
def test_delete_operation_from_list(self, mockbox, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "other@something.org"}})
self._create_user(qtbot, "other", "other@something.org", "something")
assert self.window.usernameLabel.text() == 'other'
@@ -608,7 +622,7 @@ def test_delete_operation_from_list(self, mockbox, qtbot):

@mock.patch("PyQt5.QtWidgets.QMessageBox.question", return_value=QtWidgets.QMessageBox.Yes)
def test_user_delete(self, mockmessage, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
u_id = self.window.mscolab.user['id']
@@ -625,12 +639,15 @@ def test_open_help_dialog(self):
self.window.actionMSColabHelp.trigger()
assert self.window.mscolab.help_dialog is not None

def test_close_help_dialog(self):
def test_close_help_dialog(self, qtbot):
self.window.actionMSColabHelp.trigger()
assert self.window.mscolab.help_dialog is not None
QtTest.QTest.mouseClick(
self.window.mscolab.help_dialog.okayBtn, QtCore.Qt.LeftButton)
assert self.window.mscolab.help_dialog is None

def assert_():
assert self.window.mscolab.help_dialog is None
qtbot.wait_until(assert_)

def test_create_dir_exceptions(self):
with mock.patch("fs.open_fs", new=ExceptionMock(fs.errors.CreateFailed).raise_exc), \
@@ -650,7 +667,7 @@ def test_create_dir_exceptions(self):
mockexit.assert_called_once()

def test_profile_dialog(self, qtbot):
self._connect_to_mscolab()
self._connect_to_mscolab(qtbot)
modify_config_file({"MSS_auth": {self.url: "something@something.org"}})
self._create_user(qtbot, "something", "something@something.org", "something")
self.window.mscolab.profile_action.trigger()
@@ -662,18 +679,27 @@ def test_profile_dialog(self, qtbot):
critbox.assert_called_once()
assert not self.window.mscolab.profile_dialog.gravatarLabel.pixmap().isNull()

def _connect_to_mscolab(self):
def _connect_to_mscolab(self, qtbot):
self.connect_window = mscolab.MSColab_ConnectDialog(parent=self.window, mscolab=self.window.mscolab)
self.window.mscolab.connect_window = self.connect_window
self.connect_window.urlCb.setEditText(self.url)
self.connect_window.show()
QtTest.QTest.mouseClick(self.connect_window.connectBtn, QtCore.Qt.LeftButton)

def _login(self, emailid, password):
def assert_():
assert not self.connect_window.connectBtn.isVisible()
assert self.connect_window.disconnectBtn.isVisible()
qtbot.wait_until(assert_)

def _login(self, qtbot, emailid, password):
self.connect_window.loginEmailLe.setText(emailid)
self.connect_window.loginPasswordLe.setText(password)
QtTest.QTest.mouseClick(self.connect_window.loginBtn, QtCore.Qt.LeftButton)

def assert_():
assert self.window.mscolab.connect_window is None
qtbot.wait_until(assert_)

def _create_user(self, qtbot, username, email, password):
QtTest.QTest.mouseClick(self.connect_window.addUserBtn, QtCore.Qt.LeftButton)
self.connect_window.newUsernameLe.setText(str(username))

0 comments on commit 0e41b55

Please sign in to comment.