DRY tests, increase coverage. By @bigtedde (#1769)

This commit is contained in:
Ted Lawson 2023-08-17 03:05:52 -07:00 committed by GitHub
parent fb42614524
commit ee71bcae9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 99 additions and 122 deletions

View File

@ -19,7 +19,7 @@ from vorta.store.models import (
WifiSettingModel,
)
from vorta.utils import borg_compat
from vorta.views.main_window import MainWindow
from vorta.views.main_window import ArchiveTab, MainWindow
models = [
RepoModel,
@ -206,6 +206,19 @@ def rootdir():
return os.path.dirname(os.path.abspath(__file__))
@pytest.fixture()
def archive_env(qapp, qtbot):
"""
Common setup for integration tests involving the archive tab.
"""
main: MainWindow = qapp.main_window
tab: ArchiveTab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
return main, tab
@pytest.fixture(autouse=True)
def min_borg_version(borg_version, request):
if request.node.get_closest_marker('min_borg_version'):

View File

@ -18,11 +18,9 @@ def test_repo_list(qapp, qtbot):
"""Test that the archives are created and repo list is populated correctly"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: not tab.bCheck.isEnabled(), **pytest._wait_defaults)
assert not tab.bCheck.isEnabled()
qtbot.waitUntil(lambda: 'Refreshing archives done.' in main.progressText.text(), **pytest._wait_defaults)
@ -31,30 +29,18 @@ def test_repo_list(qapp, qtbot):
assert tab.bCheck.isEnabled()
def test_repo_prune(qapp, qtbot):
def test_repo_prune(qapp, qtbot, archive_env):
"""Test for archive pruning"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
qtbot.mouseClick(tab.bPrune, QtCore.Qt.MouseButton.LeftButton)
qtbot.waitUntil(lambda: 'Pruning old archives' in main.progressText.text(), **pytest._wait_defaults)
qtbot.waitUntil(lambda: 'Refreshing archives done.' in main.progressText.text(), **pytest._wait_defaults)
@pytest.mark.min_borg_version('1.2.0a1')
def test_repo_compact(qapp, qtbot):
def test_repo_compact(qapp, qtbot, archive_env):
"""Test for archive compaction"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
qtbot.waitUntil(lambda: tab.compactButton.isEnabled(), **pytest._wait_defaults)
assert tab.compactButton.isEnabled()
@ -62,14 +48,9 @@ def test_repo_compact(qapp, qtbot):
qtbot.waitUntil(lambda: 'compaction freed about' in main.logText.text().lower(), **pytest._wait_defaults)
def test_check(qapp, qtbot):
def test_check(qapp, qtbot, archive_env):
"""Test for archive consistency check"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
qapp.check_failed_event.disconnect()
@ -81,7 +62,7 @@ def test_check(qapp, qtbot):
@pytest.mark.skipif(sys.platform == 'darwin', reason="Macos fuse support is uncertain")
def test_mount(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir):
def test_mount(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir, archive_env):
"""Test for archive mounting and unmounting"""
def psutil_disk_partitions(**kwargs):
@ -91,12 +72,7 @@ def test_mount(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir):
monkeypatch.setattr(psutil, "disk_partitions", psutil_disk_partitions)
monkeypatch.setattr(vorta.views.archive_tab, "choose_file_dialog", choose_file_dialog)
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
tab.archiveTable.selectRow(0)
qtbot.waitUntil(lambda: tab.bMountRepo.isEnabled(), **pytest._wait_defaults)
@ -114,14 +90,9 @@ def test_mount(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir):
qtbot.waitUntil(lambda: tab.mountErrors.text().startswith('Un-mounted successfully.'), **pytest._wait_defaults)
def test_archive_extract(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir):
def test_archive_extract(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir, archive_env):
"""Test for archive extraction"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
tab.archiveTable.selectRow(2)
tab.extract_action()
@ -139,14 +110,9 @@ def test_archive_extract(qapp, qtbot, monkeypatch, choose_file_dialog, tmpdir):
assert [item.basename for item in tmpdir.listdir()] == ['private' if sys.platform == 'darwin' else 'tmp']
def test_archive_delete(qapp, qtbot, mocker):
def test_archive_delete(qapp, qtbot, mocker, archive_env):
"""Test for archive deletion"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
archivesCount = tab.archiveTable.rowCount()
@ -160,14 +126,9 @@ def test_archive_delete(qapp, qtbot, mocker):
assert tab.archiveTable.rowCount() == archivesCount - 1
def test_archive_rename(qapp, qtbot, mocker):
def test_archive_rename(qapp, qtbot, mocker, archive_env):
"""Test for archive renaming"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
tab.archiveTable.selectRow(0)
new_archive_name = 'idf89d8f9d8fd98'

View File

@ -24,7 +24,6 @@ def test_borg_prune(qapp, qtbot):
assert blocker.args[0]['returncode'] == 0
# test borg info
def test_borg_repo_info(qapp, qtbot, tmpdir):
"""This test runs borg info on a test repo directly without UI"""
repo_info = {
@ -45,14 +44,8 @@ def test_borg_repo_info(qapp, qtbot, tmpdir):
assert blocker.args[0]['returncode'] == 0
def test_borg_archive_info(qapp, qtbot, tmpdir):
def test_borg_archive_info(qapp, qtbot, archive_env):
"""Check that archive info command works"""
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
params = BorgInfoArchiveJob.prepare(vorta.store.models.BackupProfileModel.select().first(), "test-archive1")
thread = BorgInfoArchiveJob(params['cmd'], params, qapp)

View File

@ -7,11 +7,9 @@ from PyQt6 import QtCore
from vorta.store.models import ArchiveModel, EventLogModel
def test_create(qapp, qtbot):
def test_create(qapp, qtbot, archive_env):
"""Test for manual archive creation"""
main = qapp.main_window
main.archiveTab.refresh_archive_list()
qtbot.waitUntil(lambda: main.archiveTab.archiveTable.rowCount() > 0, **pytest._wait_defaults)
main, tab = archive_env
qtbot.mouseClick(main.createStartBtn, QtCore.Qt.MouseButton.LeftButton)
qtbot.waitUntil(lambda: 'Backup finished.' in main.progressText.text(), **pytest._wait_defaults)

View File

@ -17,7 +17,7 @@ from vorta.store.models import (
SourceFileModel,
WifiSettingModel,
)
from vorta.views.main_window import MainWindow
from vorta.views.main_window import ArchiveTab, MainWindow
models = [
RepoModel,
@ -105,3 +105,16 @@ def borg_json_output():
@pytest.fixture
def rootdir():
return os.path.dirname(os.path.abspath(__file__))
@pytest.fixture()
def archive_env(qapp, qtbot):
"""
Common setup for unit tests involving the archive tab.
"""
main: MainWindow = qapp.main_window
tab: ArchiveTab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2, **pytest._wait_defaults)
return main, tab

View File

@ -30,18 +30,15 @@ def test_prune_intervals(qapp, qtbot):
assert getattr(profile, f'prune_{i}') == 9
def test_repo_list(qapp, qtbot, mocker, borg_json_output):
main = qapp.main_window
tab = main.archiveTab
def test_repo_list(qapp, qtbot, mocker, borg_json_output, archive_env):
main, tab = archive_env
stdout, stderr = borg_json_output('list')
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
main.tabWidget.setCurrentIndex(3)
tab.refresh_archive_list()
qtbot.waitUntil(lambda: not tab.bCheck.isEnabled(), **pytest._wait_defaults)
assert not tab.bCheck.isEnabled()
qtbot.waitUntil(lambda: 'Refreshing archives done.' in main.progressText.text(), **pytest._wait_defaults)
@ -50,11 +47,9 @@ def test_repo_list(qapp, qtbot, mocker, borg_json_output):
assert tab.bCheck.isEnabled()
def test_repo_prune(qapp, qtbot, mocker, borg_json_output):
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
def test_repo_prune(qapp, qtbot, mocker, borg_json_output, archive_env):
main, tab = archive_env
stdout, stderr = borg_json_output('prune')
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
@ -64,12 +59,10 @@ def test_repo_prune(qapp, qtbot, mocker, borg_json_output):
qtbot.waitUntil(lambda: 'Refreshing archives done.' in main.progressText.text(), **pytest._wait_defaults)
def test_repo_compact(qapp, qtbot, mocker, borg_json_output):
main = qapp.main_window
tab = main.archiveTab
def test_repo_compact(qapp, qtbot, mocker, borg_json_output, archive_env):
vorta.utils.borg_compat.version = '1.2.0'
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
main, tab = archive_env
stdout, stderr = borg_json_output('compact')
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
@ -82,11 +75,8 @@ def test_repo_compact(qapp, qtbot, mocker, borg_json_output):
vorta.utils.borg_compat.version = '1.1.0'
def test_check(qapp, mocker, borg_json_output, qtbot):
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
def test_check(qapp, mocker, borg_json_output, qtbot, archive_env):
main, tab = archive_env
stdout, stderr = borg_json_output('check')
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
@ -97,17 +87,13 @@ def test_check(qapp, mocker, borg_json_output, qtbot):
qtbot.waitUntil(lambda: success_text in main.logText.text(), **pytest._wait_defaults)
def test_mount(qapp, qtbot, mocker, borg_json_output, monkeypatch, choose_file_dialog):
def test_mount(qapp, qtbot, mocker, borg_json_output, monkeypatch, choose_file_dialog, archive_env):
def psutil_disk_partitions(**kwargs):
DiskPartitions = namedtuple('DiskPartitions', ['device', 'mountpoint'])
return [DiskPartitions('borgfs', '/tmp')]
monkeypatch.setattr(psutil, "disk_partitions", psutil_disk_partitions)
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
main, tab = archive_env
tab.archiveTable.selectRow(0)
stdout, stderr = borg_json_output('prune') # TODO: fully mock mount command?
@ -129,14 +115,8 @@ def test_mount(qapp, qtbot, mocker, borg_json_output, monkeypatch, choose_file_d
qtbot.waitUntil(lambda: tab.mountErrors.text().startswith('Un-mounted successfully.'), **pytest._wait_defaults)
def test_archive_extract(qapp, qtbot, mocker, borg_json_output):
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2)
def test_archive_extract(qapp, qtbot, mocker, borg_json_output, archive_env):
main, tab = archive_env
tab.archiveTable.selectRow(0)
stdout, stderr = borg_json_output('list_archive')
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
@ -144,20 +124,14 @@ def test_archive_extract(qapp, qtbot, mocker, borg_json_output):
tab.extract_action()
qtbot.waitUntil(lambda: hasattr(tab, '_window'), **pytest._wait_defaults)
# qtbot.waitUntil(lambda: tab._window == qapp.activeWindow(), **pytest._wait_defaults)
model = tab._window.model
assert model.root.children[0].subpath == 'home'
assert 'test-archive, 2000' in tab._window.archiveNameLabel.text()
def test_archive_delete(qapp, qtbot, mocker, borg_json_output):
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2)
def test_archive_delete(qapp, qtbot, mocker, borg_json_output, archive_env):
main, tab = archive_env
tab.archiveTable.selectRow(0)
stdout, stderr = borg_json_output('delete')
@ -170,13 +144,43 @@ def test_archive_delete(qapp, qtbot, mocker, borg_json_output):
assert tab.archiveTable.rowCount() == 1
def test_archive_rename(qapp, qtbot, mocker, borg_json_output):
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
def test_archive_copy(qapp, qtbot, monkeypatch, mocker, archive_env):
main, tab = archive_env
tab.populate_from_profile()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2)
# mock the clipboard to ensure no changes are made to it during testing
mocker.patch.object(qapp.clipboard(), "setMimeData")
clipboard_spy = mocker.spy(qapp.clipboard(), "setMimeData")
# test 'archive_copy()' by passing it an index to copy
index = tab.archiveTable.model().index(0, 0)
tab.archive_copy(index)
assert clipboard_spy.call_count == 1
actual_data = clipboard_spy.call_args[0][0] # retrieves the QMimeData() object used in method call
assert actual_data.text() == "test-archive"
# test 'archive_copy()' by selecting a row to copy
tab.archiveTable.selectRow(1)
tab.archive_copy()
assert clipboard_spy.call_count == 2
actual_data = clipboard_spy.call_args[0][0] # retrieves the QMimeData() object used in method call
assert actual_data.text() == "test-archive1"
def test_refresh_archive_info(qapp, qtbot, mocker, borg_json_output, archive_env):
main, tab = archive_env
tab.archiveTable.selectRow(0)
stdout, stderr = borg_json_output('info')
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
with qtbot.waitSignal(tab.bRefreshArchive.clicked, timeout=5000):
qtbot.mouseClick(tab.bRefreshArchive, QtCore.Qt.MouseButton.LeftButton)
qtbot.waitUntil(lambda: tab.mountErrors.text() == 'Refreshed archives.', **pytest._wait_defaults)
def test_archive_rename(qapp, qtbot, mocker, borg_json_output, archive_env):
main, tab = archive_env
tab.archiveTable.selectRow(0)
new_archive_name = 'idf89d8f9d8fd98'

View File

@ -18,13 +18,8 @@ from vorta.views.diff_result import (
@pytest.mark.parametrize(
'json_mock_file,folder_root', [('diff_archives', 'test'), ('diff_archives_dict_issue', 'Users')]
)
def test_archive_diff(qapp, qtbot, mocker, borg_json_output, json_mock_file, folder_root):
main = qapp.main_window
tab = main.archiveTab
main.tabWidget.setCurrentIndex(3)
tab.populate_from_profile()
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2)
def test_archive_diff(qapp, qtbot, mocker, borg_json_output, json_mock_file, folder_root, archive_env):
main, tab = archive_env
stdout, stderr = borg_json_output(json_mock_file)
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)