From 9f8b88826b61869749adb4abab4fa31819e43bd1 Mon Sep 17 00:00:00 2001 From: bigtedde Date: Tue, 8 Aug 2023 19:03:55 -0700 Subject: [PATCH 1/3] corrected typos, parametrized repo tests, added tests --- src/vorta/views/partials/password_input.py | 4 +- src/vorta/views/repo_add_dialog.py | 2 +- tests/unit/test_password_input.py | 6 +- tests/unit/test_repo.py | 97 +++++++++++++--------- 4 files changed, 65 insertions(+), 44 deletions(-) diff --git a/src/vorta/views/partials/password_input.py b/src/vorta/views/partials/password_input.py index bc8b0dd4c..ce10f30f1 100644 --- a/src/vorta/views/partials/password_input.py +++ b/src/vorta/views/partials/password_input.py @@ -138,7 +138,7 @@ def validate(self) -> bool: self.passwordLineEdit.error_state = True self.confirmLineEdit.error_state = True self.set_error_label( - translate('PasswordInput', "Passwords must be identical and atleast {0} characters long.").format( + translate('PasswordInput', "Passwords must be identical and at least {0} characters long.").format( self._minimum_length ) ) @@ -148,7 +148,7 @@ def validate(self) -> bool: elif not pass_long: self.passwordLineEdit.error_state = True self.set_error_label( - translate('PasswordInput', "Passwords must be atleast {0} characters long.").format( + translate('PasswordInput', "Passwords must be at least {0} characters long.").format( self._minimum_length ) ) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 38cc65e25..4a839dfaf 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -107,7 +107,7 @@ def validate(self): return False if len(self.values['repo_name']) > 64: - self._set_status(self.tr('Repository name must be less than 64 characters.')) + self._set_status(self.tr('Repository name must be less than 65 characters.')) return False if RepoModel.get_or_none(RepoModel.url == self.values['repo_url']) is not None: diff --git a/tests/unit/test_password_input.py b/tests/unit/test_password_input.py index 429b99e41..218a1dac4 100644 --- a/tests/unit/test_password_input.py +++ b/tests/unit/test_password_input.py @@ -86,7 +86,7 @@ def test_password_input_validation(qapp, qtbot): qtbot.keyClicks(password_input.confirmLineEdit, "123456789") assert password_input.passwordLineEdit.error_state - assert password_input.validation_label.text() == "Passwords must be atleast 10 characters long." + assert password_input.validation_label.text() == "Passwords must be at least 10 characters long." password_input.clear() qtbot.keyClicks(password_input.passwordLineEdit, "123456789") @@ -94,7 +94,7 @@ def test_password_input_validation(qapp, qtbot): assert password_input.passwordLineEdit.error_state assert password_input.confirmLineEdit.error_state - assert password_input.validation_label.text() == "Passwords must be identical and atleast 10 characters long." + assert password_input.validation_label.text() == "Passwords must be identical and at least 10 characters long." password_input.clear() qtbot.keyClicks(password_input.passwordLineEdit, "1234567890") @@ -130,7 +130,7 @@ def test_password_input_validation_disabled(qapp, qtbot): assert password_input.passwordLineEdit.error_state assert password_input.confirmLineEdit.error_state - assert password_input.validation_label.text() == "Passwords must be identical and atleast 9 characters long." + assert password_input.validation_label.text() == "Passwords must be identical and at least 9 characters long." password_input.set_validation_enabled(False) assert not password_input.passwordLineEdit.error_state diff --git a/tests/unit/test_repo.py b/tests/unit/test_repo.py index 3e13084d7..6b685738b 100644 --- a/tests/unit/test_repo.py +++ b/tests/unit/test_repo.py @@ -12,43 +12,48 @@ SHORT_PASSWORD = 'hunter2' -def test_repo_add_failures(qapp, qtbot, mocker, borg_json_output): +@pytest.mark.parametrize( + "first_password, second_password, validation_error", + [ + (SHORT_PASSWORD, SHORT_PASSWORD, 'Passwords must be at least 9 characters long.'), + (LONG_PASSWORD, SHORT_PASSWORD, 'Passwords must be identical.'), + (SHORT_PASSWORD + "1", SHORT_PASSWORD, 'Passwords must be identical and at least 9 characters long.'), + (LONG_PASSWORD, LONG_PASSWORD, ''), + ], +) +def test_new_repo_password_validation(qapp, qtbot, borg_json_output, first_password, second_password, validation_error): # Add new repo window main = qapp.main_window - main.repoTab.new_repo() - add_repo_window = main.repoTab._window + tab = main.repoTab + tab.new_repo() + add_repo_window = tab._window qtbot.addWidget(add_repo_window) - qtbot.keyClicks(add_repo_window.passwordInput.passwordLineEdit, LONG_PASSWORD) - qtbot.keyClicks(add_repo_window.passwordInput.confirmLineEdit, LONG_PASSWORD) - qtbot.keyClicks(add_repo_window.repoURL, 'aaa') + qtbot.keyClicks(add_repo_window.passwordInput.passwordLineEdit, first_password) + qtbot.keyClicks(add_repo_window.passwordInput.confirmLineEdit, second_password) qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.MouseButton.LeftButton) - assert add_repo_window.errorText.text().startswith('Please enter a valid') + assert add_repo_window.passwordInput.validation_label.text() == validation_error + + +@pytest.mark.parametrize( + "repo_name, error_text", + [ + ('test_repo_name', ''), # valid repo name + ('a' * 64, ''), # also valid (<=64 characters) + ('a' * 65, 'Repository name must be less than 65 characters.'), # not valid (>64 characters) + ], +) +def test_repo_add_name_validation(qapp, qtbot, borg_json_output, repo_name, error_text): + main = qapp.main_window + tab = main.repoTab + tab.new_repo() + add_repo_window = tab._window + qtbot.addWidget(add_repo_window) - add_repo_window.passwordInput.passwordLineEdit.clear() - add_repo_window.passwordInput.confirmLineEdit.clear() - qtbot.keyClicks(add_repo_window.passwordInput.passwordLineEdit, SHORT_PASSWORD) - qtbot.keyClicks(add_repo_window.passwordInput.confirmLineEdit, SHORT_PASSWORD) qtbot.keyClicks(add_repo_window.repoURL, 'bbb.com:repo') + qtbot.keyClicks(add_repo_window.repoName, repo_name) qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.MouseButton.LeftButton) - assert add_repo_window.passwordInput.validation_label.text() == 'Passwords must be atleast 9 characters long.' - - add_repo_window.passwordInput.passwordLineEdit.clear() - add_repo_window.passwordInput.confirmLineEdit.clear() - qtbot.keyClicks(add_repo_window.passwordInput.passwordLineEdit, SHORT_PASSWORD + "1") - qtbot.keyClicks(add_repo_window.passwordInput.confirmLineEdit, SHORT_PASSWORD) - qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.MouseButton.LeftButton) - assert ( - add_repo_window.passwordInput.validation_label.text() - == 'Passwords must be identical and atleast 9 characters long.' - ) - - add_repo_window.passwordInput.passwordLineEdit.clear() - add_repo_window.passwordInput.confirmLineEdit.clear() - qtbot.keyClicks(add_repo_window.passwordInput.passwordLineEdit, LONG_PASSWORD) - qtbot.keyClicks(add_repo_window.passwordInput.confirmLineEdit, SHORT_PASSWORD) - qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.MouseButton.LeftButton) - assert add_repo_window.passwordInput.validation_label.text() == 'Passwords must be identical.' + assert add_repo_window.errorText.text() == error_text def test_repo_unlink(qapp, qtbot, monkeypatch): @@ -56,7 +61,6 @@ def test_repo_unlink(qapp, qtbot, monkeypatch): tab = main.repoTab monkeypatch.setattr(QMessageBox, "show", lambda *args: True) - main.tabWidget.setCurrentIndex(0) qtbot.mouseClick(tab.repoRemoveToolbutton, QtCore.Qt.MouseButton.LeftButton) qtbot.waitUntil(lambda: tab.repoSelector.count() == 1, **pytest._wait_defaults) assert RepoModel.select().count() == 0 @@ -69,8 +73,9 @@ def test_repo_unlink(qapp, qtbot, monkeypatch): def test_password_autofill(qapp, qtbot): main = qapp.main_window - main.repoTab.new_repo() # couldn't click menu - add_repo_window = main.repoTab._window + tab = main.repoTab + tab.new_repo() + add_repo_window = tab._window test_repo_url = f'vorta-test-repo.{uuid.uuid4()}.com:repo' # Random repo URL to avoid macOS keychain keyring = VortaKeyring.get_keyring() @@ -82,14 +87,28 @@ def test_password_autofill(qapp, qtbot): assert add_repo_window.passwordInput.passwordLineEdit.text() == password +def test_repo_add_failure(qapp, qtbot, borg_json_output): + main = qapp.main_window + tab = main.repoTab + tab.new_repo() + add_repo_window = tab._window + qtbot.addWidget(add_repo_window) + + # Add repo with invalid URL + qtbot.keyClicks(add_repo_window.repoURL, 'aaa') + qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.MouseButton.LeftButton) + assert add_repo_window.errorText.text().startswith('Please enter a valid repo URL') + + def test_repo_add_success(qapp, qtbot, mocker, borg_json_output): - # Add new repo window main = qapp.main_window - main.repoTab.new_repo() # couldn't click menu - add_repo_window = main.repoTab._window + tab = main.repoTab + tab.new_repo() + add_repo_window = tab._window test_repo_url = f'vorta-test-repo.{uuid.uuid4()}.com:repo' # Random repo URL to avoid macOS keychain test_repo_name = 'Test Repo' + # Enter valid repo URL, name, and password qtbot.keyClicks(add_repo_window.repoURL, test_repo_url) qtbot.keyClicks(add_repo_window.repoName, test_repo_name) qtbot.keyClicks(add_repo_window.passwordInput.passwordLineEdit, LONG_PASSWORD) @@ -108,13 +127,15 @@ def test_repo_add_success(qapp, qtbot, mocker, borg_json_output): keyring = VortaKeyring.get_keyring() assert keyring.get_password("vorta-repo", RepoModel.get(id=2).url) == LONG_PASSWORD - assert main.repoTab.repoSelector.currentText() == f"{test_repo_name} - {test_repo_url}" + assert tab.repoSelector.currentText() == f"{test_repo_name} - {test_repo_url}" def test_ssh_dialog(qapp, qtbot, tmpdir): main = qapp.main_window - qtbot.mouseClick(main.repoTab.bAddSSHKey, QtCore.Qt.MouseButton.LeftButton) - ssh_dialog = main.repoTab._window + tab = main.repoTab + + qtbot.mouseClick(tab.bAddSSHKey, QtCore.Qt.MouseButton.LeftButton) + ssh_dialog = tab._window ssh_dir = tmpdir key_tmpfile = ssh_dir.join("id_rsa-test") From e36666212e8c0f055c11d6dd0789150028580893 Mon Sep 17 00:00:00 2001 From: bigtedde Date: Tue, 8 Aug 2023 21:01:34 -0700 Subject: [PATCH 2/3] RepoURL consistency change --- tests/unit/test_repo.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_repo.py b/tests/unit/test_repo.py index 6b685738b..eeffa06ab 100644 --- a/tests/unit/test_repo.py +++ b/tests/unit/test_repo.py @@ -48,9 +48,10 @@ def test_repo_add_name_validation(qapp, qtbot, borg_json_output, repo_name, erro tab = main.repoTab tab.new_repo() add_repo_window = tab._window + test_repo_url = f'vorta-test-repo.{uuid.uuid4()}.com:repo' # Random repo URL to avoid macOS keychain qtbot.addWidget(add_repo_window) - qtbot.keyClicks(add_repo_window.repoURL, 'bbb.com:repo') + qtbot.keyClicks(add_repo_window.repoURL, test_repo_url) qtbot.keyClicks(add_repo_window.repoName, repo_name) qtbot.mouseClick(add_repo_window.saveButton, QtCore.Qt.MouseButton.LeftButton) assert add_repo_window.errorText.text() == error_text From 9a92d2b0da4b9625066c549beda9f09164261553 Mon Sep 17 00:00:00 2001 From: bigtedde Date: Fri, 11 Aug 2023 15:45:32 -0700 Subject: [PATCH 3/3] comment change --- tests/unit/test_repo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_repo.py b/tests/unit/test_repo.py index eeffa06ab..c20f4be84 100644 --- a/tests/unit/test_repo.py +++ b/tests/unit/test_repo.py @@ -18,7 +18,7 @@ (SHORT_PASSWORD, SHORT_PASSWORD, 'Passwords must be at least 9 characters long.'), (LONG_PASSWORD, SHORT_PASSWORD, 'Passwords must be identical.'), (SHORT_PASSWORD + "1", SHORT_PASSWORD, 'Passwords must be identical and at least 9 characters long.'), - (LONG_PASSWORD, LONG_PASSWORD, ''), + (LONG_PASSWORD, LONG_PASSWORD, ''), # no error, password meets requirements. ], ) def test_new_repo_password_validation(qapp, qtbot, borg_json_output, first_password, second_password, validation_error):