2018-11-30 00:40:18 +00:00
|
|
|
import psutil
|
|
|
|
from collections import namedtuple
|
2020-06-16 16:21:24 +00:00
|
|
|
import pytest
|
2018-11-30 00:40:18 +00:00
|
|
|
from PyQt5 import QtCore
|
2018-11-22 01:35:59 +00:00
|
|
|
from vorta.models import BackupProfileModel, ArchiveModel
|
2018-11-06 06:47:04 +00:00
|
|
|
import vorta.borg
|
2018-11-30 00:40:18 +00:00
|
|
|
import vorta.views.archive_tab
|
|
|
|
import vorta.utils
|
|
|
|
|
|
|
|
|
|
|
|
class MockFileDialog:
|
|
|
|
def open(self, func):
|
|
|
|
func()
|
|
|
|
|
|
|
|
def selectedFiles(self):
|
|
|
|
return ['/tmp']
|
2018-11-06 06:47:04 +00:00
|
|
|
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
def test_prune_intervals(qapp, qtbot):
|
2018-11-06 06:47:04 +00:00
|
|
|
prune_intervals = ['hour', 'day', 'week', 'month', 'year']
|
2020-03-03 05:19:36 +00:00
|
|
|
main = qapp.main_window
|
2018-11-22 01:18:12 +00:00
|
|
|
tab = main.archiveTab
|
2018-11-06 06:47:04 +00:00
|
|
|
profile = BackupProfileModel.get(id=1)
|
|
|
|
|
|
|
|
for i in prune_intervals:
|
|
|
|
getattr(tab, f'prune_{i}').setValue(9)
|
|
|
|
tab.save_prune_setting(None)
|
|
|
|
profile = profile.refresh()
|
|
|
|
assert getattr(profile, f'prune_{i}') == 9
|
|
|
|
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
def test_repo_list(qapp, qtbot, mocker, borg_json_output):
|
|
|
|
main = qapp.main_window
|
2018-11-22 01:18:12 +00:00
|
|
|
tab = main.archiveTab
|
2018-11-06 06:47:04 +00:00
|
|
|
|
|
|
|
stdout, stderr = borg_json_output('list')
|
2018-11-22 00:43:37 +00:00
|
|
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
2018-11-06 06:47:04 +00:00
|
|
|
mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result)
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
main.tabWidget.setCurrentIndex(3)
|
|
|
|
tab.list_action()
|
|
|
|
qtbot.waitUntil(lambda: not tab.checkButton.isEnabled(), timeout=3000)
|
|
|
|
|
|
|
|
assert not tab.checkButton.isEnabled()
|
|
|
|
|
2019-01-20 03:50:10 +00:00
|
|
|
qtbot.waitUntil(lambda: main.createProgressText.text() == 'Refreshing archives done.', timeout=3000)
|
2018-11-22 01:35:59 +00:00
|
|
|
assert ArchiveModel.select().count() == 6
|
2019-01-20 03:50:10 +00:00
|
|
|
assert main.createProgressText.text() == 'Refreshing archives done.'
|
2018-11-06 06:47:04 +00:00
|
|
|
assert tab.checkButton.isEnabled()
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
def test_repo_prune(qapp, qtbot, mocker, borg_json_output):
|
|
|
|
main = qapp.main_window
|
2018-11-30 00:40:18 +00:00
|
|
|
tab = main.archiveTab
|
|
|
|
main.tabWidget.setCurrentIndex(3)
|
|
|
|
tab.populate_from_profile()
|
|
|
|
stdout, stderr = borg_json_output('prune')
|
|
|
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
|
|
|
mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result)
|
|
|
|
|
|
|
|
qtbot.mouseClick(tab.pruneButton, QtCore.Qt.LeftButton)
|
|
|
|
|
2019-01-20 03:50:10 +00:00
|
|
|
qtbot.waitUntil(lambda: main.createProgressText.text().startswith('Refreshing archives done.'), timeout=5000)
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
def test_check(qapp, mocker, borg_json_output, qtbot):
|
|
|
|
main = qapp.main_window
|
2018-11-30 00:40:18 +00:00
|
|
|
tab = main.archiveTab
|
|
|
|
main.tabWidget.setCurrentIndex(3)
|
|
|
|
tab.populate_from_profile()
|
|
|
|
|
|
|
|
stdout, stderr = borg_json_output('check')
|
|
|
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
|
|
|
mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result)
|
|
|
|
|
|
|
|
qtbot.mouseClick(tab.checkButton, QtCore.Qt.LeftButton)
|
|
|
|
success_text = 'INFO: Archive consistency check complete'
|
2018-12-05 09:05:47 +00:00
|
|
|
qtbot.waitUntil(lambda: main.createProgressText.text().startswith(success_text), timeout=3000)
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
def test_archive_mount(qapp, qtbot, mocker, borg_json_output, monkeypatch, choose_file_dialog):
|
2018-11-30 00:40:18 +00:00
|
|
|
def psutil_disk_partitions(**kwargs):
|
|
|
|
DiskPartitions = namedtuple('DiskPartitions', ['device', 'mountpoint'])
|
|
|
|
return [DiskPartitions('borgfs', '/tmp')]
|
|
|
|
|
|
|
|
monkeypatch.setattr(
|
|
|
|
psutil, "disk_partitions", psutil_disk_partitions
|
|
|
|
)
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
main = qapp.main_window
|
2018-11-30 00:40:18 +00:00
|
|
|
tab = main.archiveTab
|
|
|
|
main.tabWidget.setCurrentIndex(3)
|
|
|
|
tab.populate_from_profile()
|
|
|
|
tab.archiveTable.selectRow(0)
|
|
|
|
|
|
|
|
stdout, stderr = borg_json_output('prune')
|
|
|
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
|
|
|
mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result)
|
|
|
|
|
|
|
|
monkeypatch.setattr(
|
2018-12-05 09:05:47 +00:00
|
|
|
vorta.views.archive_tab, "choose_file_dialog", choose_file_dialog
|
2018-11-30 00:40:18 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
qtbot.mouseClick(tab.mountButton, QtCore.Qt.LeftButton)
|
2020-05-22 12:49:04 +00:00
|
|
|
qtbot.waitUntil(lambda: tab.mountErrors.text().startswith('Mounted'), timeout=10000)
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
qtbot.mouseClick(tab.mountButton, QtCore.Qt.LeftButton)
|
2020-05-22 12:49:04 +00:00
|
|
|
qtbot.waitUntil(lambda: tab.mountErrors.text().startswith('Un-mounted successfully.'), timeout=10000)
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
|
2020-03-03 05:19:36 +00:00
|
|
|
def test_archive_extract(qapp, qtbot, mocker, borg_json_output, monkeypatch):
|
|
|
|
main = qapp.main_window
|
2018-11-30 00:40:18 +00:00
|
|
|
tab = main.archiveTab
|
|
|
|
main.tabWidget.setCurrentIndex(3)
|
|
|
|
|
|
|
|
tab.populate_from_profile()
|
2020-03-23 06:20:09 +00:00
|
|
|
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2)
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
monkeypatch.setattr(
|
|
|
|
vorta.views.extract_dialog.ExtractDialog, "exec_", lambda *args: True
|
|
|
|
)
|
|
|
|
|
|
|
|
tab.archiveTable.selectRow(0)
|
|
|
|
stdout, stderr = borg_json_output('list_archive')
|
|
|
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
|
|
|
mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result)
|
|
|
|
qtbot.mouseClick(tab.extractButton, QtCore.Qt.LeftButton)
|
|
|
|
|
2020-05-22 12:49:04 +00:00
|
|
|
qtbot.waitUntil(lambda: hasattr(tab, '_window'), timeout=10000)
|
2018-11-30 00:40:18 +00:00
|
|
|
|
|
|
|
assert tab._window.treeView.model().rootItem.childItems[0].data(0) == 'Users'
|
|
|
|
tab._window.treeView.model().rootItem.childItems[0].load_children()
|
|
|
|
assert tab._window.archiveNameLabel.text().startswith('test-archive, 2000')
|
2020-03-23 06:20:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_archive_diff(qapp, qtbot, mocker, borg_json_output, monkeypatch):
|
|
|
|
main = qapp.main_window
|
|
|
|
tab = main.archiveTab
|
|
|
|
main.tabWidget.setCurrentIndex(3)
|
|
|
|
|
|
|
|
tab.populate_from_profile()
|
|
|
|
qtbot.waitUntil(lambda: tab.archiveTable.rowCount() == 2)
|
|
|
|
|
|
|
|
monkeypatch.setattr(
|
|
|
|
vorta.views.diff_dialog.DiffDialog, "exec_", lambda *args: True
|
|
|
|
)
|
|
|
|
|
|
|
|
monkeypatch.setattr(
|
|
|
|
tab, "selected_archives", (0, 1)
|
|
|
|
)
|
|
|
|
|
|
|
|
stdout, stderr = borg_json_output('diff_archives')
|
|
|
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
|
|
|
mocker.patch.object(vorta.borg.borg_thread, 'Popen', return_value=popen_result)
|
|
|
|
|
|
|
|
qtbot.mouseClick(tab.diffButton, QtCore.Qt.LeftButton)
|
|
|
|
qtbot.waitUntil(lambda: hasattr(tab, '_window'), timeout=5000)
|
|
|
|
|
|
|
|
monkeypatch.setattr(
|
|
|
|
vorta.views.diff_result.DiffResult, "exec_", lambda *args: True
|
|
|
|
)
|
|
|
|
qtbot.waitUntil(lambda: hasattr(tab, '_resultwindow'), timeout=5000)
|
|
|
|
|
|
|
|
assert tab._resultwindow.treeView.model().rootItem.childItems[0].data(0) == 'test'
|
|
|
|
tab._resultwindow.treeView.model().rootItem.childItems[0].load_children()
|
|
|
|
|
|
|
|
assert tab._resultwindow.archiveNameLabel_1.text() == 'test-archive'
|
|
|
|
tab._resultwindow.accept()
|
2020-06-16 16:21:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('line, expected', [
|
|
|
|
('changed link some/changed/link',
|
|
|
|
(0, 'changed', 'link', 'some/changed')),
|
|
|
|
(' +77.8 kB -77.8 kB some/changed/file',
|
|
|
|
(77800, 'modified', 'file', 'some/changed')),
|
|
|
|
])
|
|
|
|
def test_archive_diff_parser(line, expected):
|
|
|
|
files_with_attributes, nested_file_list = vorta.views.diff_result.parse_diff_lines([line])
|
|
|
|
assert files_with_attributes == [expected]
|