mirror of
https://github.com/borgbase/vorta
synced 2024-12-21 23:33:13 +00:00
Run hooks on the code base.
This adds trailing lines to files, removes trailing white space in all the other lines and unifies line endings. Additionally it formats the test code with `black`.
This commit is contained in:
parent
63b2eb1089
commit
ca497f8815
46 changed files with 375 additions and 338 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -21,4 +21,3 @@ src/vorta/i18n/ts/vorta.en.ts
|
||||||
src/vorta/i18n/ts/vorta.en_US.ts
|
src/vorta/i18n/ts/vorta.en_US.ts
|
||||||
flatpak/app/
|
flatpak/app/
|
||||||
flatpak/.flatpak-builder/
|
flatpak/.flatpak-builder/
|
||||||
|
|
||||||
|
|
|
@ -7,4 +7,3 @@ minimum_perc = 80
|
||||||
source_file = src/vorta/i18n/ts/vorta.en.ts
|
source_file = src/vorta/i18n/ts/vorta.en.ts
|
||||||
source_lang = en
|
source_lang = en
|
||||||
type = QT
|
type = QT
|
||||||
|
|
||||||
|
|
|
@ -23,4 +23,3 @@ index 7a18c11..1667db2 100644
|
||||||
return -1;
|
return -1;
|
||||||
--
|
--
|
||||||
2.17.0.rc2
|
2.17.0.rc2
|
||||||
|
|
||||||
|
|
|
@ -81,4 +81,3 @@ app = BUNDLE(coll,
|
||||||
'PATH': '/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin'
|
'PATH': '/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,17 @@
|
||||||
)
|
)
|
||||||
from vorta.views.main_window import MainWindow
|
from vorta.views.main_window import MainWindow
|
||||||
|
|
||||||
models = [RepoModel, RepoPassword, BackupProfileModel, SourceFileModel,
|
models = [
|
||||||
SettingsModel, ArchiveModel, WifiSettingModel, EventLogModel, SchemaVersion]
|
RepoModel,
|
||||||
|
RepoPassword,
|
||||||
|
BackupProfileModel,
|
||||||
|
SourceFileModel,
|
||||||
|
SettingsModel,
|
||||||
|
ArchiveModel,
|
||||||
|
WifiSettingModel,
|
||||||
|
EventLogModel,
|
||||||
|
SchemaVersion,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def pytest_configure(config):
|
def pytest_configure(config):
|
||||||
|
@ -38,6 +47,7 @@ def qapp(tmpdir_factory):
|
||||||
vorta.store.connection.init_db(mock_db)
|
vorta.store.connection.init_db(mock_db)
|
||||||
|
|
||||||
from vorta.application import VortaApp
|
from vorta.application import VortaApp
|
||||||
|
|
||||||
VortaApp.set_borg_details_action = MagicMock() # Can't use pytest-mock in session scope
|
VortaApp.set_borg_details_action = MagicMock() # Can't use pytest-mock in session scope
|
||||||
VortaApp.scheduler = MagicMock()
|
VortaApp.scheduler = MagicMock()
|
||||||
|
|
||||||
|
@ -51,7 +61,12 @@ def qapp(tmpdir_factory):
|
||||||
@pytest.fixture(scope='function', autouse=True)
|
@pytest.fixture(scope='function', autouse=True)
|
||||||
def init_db(qapp, qtbot, tmpdir_factory):
|
def init_db(qapp, qtbot, tmpdir_factory):
|
||||||
tmp_db = tmpdir_factory.mktemp('Vorta').join('settings.sqlite')
|
tmp_db = tmpdir_factory.mktemp('Vorta').join('settings.sqlite')
|
||||||
mock_db = SqliteDatabase(str(tmp_db), pragmas={'journal_mode': 'wal', })
|
mock_db = SqliteDatabase(
|
||||||
|
str(tmp_db),
|
||||||
|
pragmas={
|
||||||
|
'journal_mode': 'wal',
|
||||||
|
},
|
||||||
|
)
|
||||||
vorta.store.connection.init_db(mock_db)
|
vorta.store.connection.init_db(mock_db)
|
||||||
|
|
||||||
default_profile = BackupProfileModel(name='Default')
|
default_profile = BackupProfileModel(name='Default')
|
||||||
|
@ -72,8 +87,7 @@ def init_db(qapp, qtbot, tmpdir_factory):
|
||||||
test_archive1 = ArchiveModel(snapshot_id='99998', name='test-archive1', time=dt(2000, 1, 1, 0, 0), repo=1)
|
test_archive1 = ArchiveModel(snapshot_id='99998', name='test-archive1', time=dt(2000, 1, 1, 0, 0), repo=1)
|
||||||
test_archive1.save()
|
test_archive1.save()
|
||||||
|
|
||||||
source_dir = SourceFileModel(dir='/tmp/another', repo=new_repo, dir_size=100, dir_files_count=18,
|
source_dir = SourceFileModel(dir='/tmp/another', repo=new_repo, dir_size=100, dir_files_count=18, path_isdir=True)
|
||||||
path_isdir=True)
|
|
||||||
source_dir.save()
|
source_dir.save()
|
||||||
|
|
||||||
qapp.main_window.deleteLater()
|
qapp.main_window.deleteLater()
|
||||||
|
@ -110,6 +124,7 @@ def _read_json(subcommand):
|
||||||
stdout = open(f'tests/borg_json_output/{subcommand}_stdout.json')
|
stdout = open(f'tests/borg_json_output/{subcommand}_stdout.json')
|
||||||
stderr = open(f'tests/borg_json_output/{subcommand}_stderr.json')
|
stderr = open(f'tests/borg_json_output/{subcommand}_stderr.json')
|
||||||
return stdout, stderr
|
return stdout, stderr
|
||||||
|
|
||||||
return _read_json
|
return _read_json
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,13 @@
|
||||||
from vorta.network_status import darwin
|
from vorta.network_status import darwin
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('getpacket_output_name, expected', [
|
@pytest.mark.parametrize(
|
||||||
|
'getpacket_output_name, expected',
|
||||||
|
[
|
||||||
('normal_router', False),
|
('normal_router', False),
|
||||||
('phone', True),
|
('phone', True),
|
||||||
])
|
],
|
||||||
|
)
|
||||||
def test_is_network_metered(getpacket_output_name, expected, monkeypatch):
|
def test_is_network_metered(getpacket_output_name, expected, monkeypatch):
|
||||||
def mock_getpacket(device):
|
def mock_getpacket(device):
|
||||||
assert device == 'en0'
|
assert device == 'en0'
|
||||||
|
@ -80,7 +83,7 @@ def test_get_network_devices(monkeypatch):
|
||||||
domain_name_server (ip_mult): {192.168.43.242}
|
domain_name_server (ip_mult): {192.168.43.242}
|
||||||
vendor_specific (opaque):
|
vendor_specific (opaque):
|
||||||
0000 41 4e 44 52 4f 49 44 5f 4d 45 54 45 52 45 44 ANDROID_METERED
|
0000 41 4e 44 52 4f 49 44 5f 4d 45 54 45 52 45 44 ANDROID_METERED
|
||||||
"""
|
""",
|
||||||
}
|
}
|
||||||
|
|
||||||
NETWORKSETUP_OUTPUT = b"""\
|
NETWORKSETUP_OUTPUT = b"""\
|
||||||
|
|
|
@ -14,10 +14,7 @@
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_adapter():
|
def mock_adapter():
|
||||||
return MagicMock(
|
return MagicMock(spec_set=NetworkManagerDBusAdapter, wraps=UncallableNetworkManagerDBusAdapter())
|
||||||
spec_set=NetworkManagerDBusAdapter,
|
|
||||||
wraps=UncallableNetworkManagerDBusAdapter()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -29,13 +26,16 @@ def test_is_network_status_available(nm_monitor):
|
||||||
assert nm_monitor.is_network_status_available() is True
|
assert nm_monitor.is_network_status_available() is True
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('global_metered_status, expected', [
|
@pytest.mark.parametrize(
|
||||||
|
'global_metered_status, expected',
|
||||||
|
[
|
||||||
(NMMetered.UNKNOWN, False),
|
(NMMetered.UNKNOWN, False),
|
||||||
(NMMetered.YES, True),
|
(NMMetered.YES, True),
|
||||||
(NMMetered.NO, False),
|
(NMMetered.NO, False),
|
||||||
(NMMetered.GUESS_YES, True),
|
(NMMetered.GUESS_YES, True),
|
||||||
(NMMetered.GUESS_NO, False),
|
(NMMetered.GUESS_NO, False),
|
||||||
])
|
],
|
||||||
|
)
|
||||||
def test_is_network_metered(global_metered_status, expected, nm_monitor):
|
def test_is_network_metered(global_metered_status, expected, nm_monitor):
|
||||||
nm_monitor._nm.get_global_metered_status.return_value = global_metered_status
|
nm_monitor._nm.get_global_metered_status.return_value = global_metered_status
|
||||||
|
|
||||||
|
@ -44,17 +44,22 @@ def test_is_network_metered(global_metered_status, expected, nm_monitor):
|
||||||
assert result == expected
|
assert result == expected
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('connection_path, connection_type, type_settings, expected', [
|
@pytest.mark.parametrize(
|
||||||
('/org/freedesktop/NetworkManager/ActiveConnection/1',
|
'connection_path, connection_type, type_settings, expected',
|
||||||
'802-11-wireless', {'ssid': bytes([84, 69, 83, 84])}, 'TEST'),
|
[
|
||||||
('/org/freedesktop/NetworkManager/ActiveConnection/2',
|
(
|
||||||
'802-11-ethernet', {}, None),
|
'/org/freedesktop/NetworkManager/ActiveConnection/1',
|
||||||
])
|
'802-11-wireless',
|
||||||
|
{'ssid': bytes([84, 69, 83, 84])},
|
||||||
|
'TEST',
|
||||||
|
),
|
||||||
|
('/org/freedesktop/NetworkManager/ActiveConnection/2', '802-11-ethernet', {}, None),
|
||||||
|
],
|
||||||
|
)
|
||||||
def test_get_current_wifi(connection_path, connection_type, type_settings, expected, nm_monitor):
|
def test_get_current_wifi(connection_path, connection_type, type_settings, expected, nm_monitor):
|
||||||
nm_monitor._nm.get_primary_connection_path.return_value = connection_path
|
nm_monitor._nm.get_primary_connection_path.return_value = connection_path
|
||||||
nm_monitor._nm.get_active_connection_info.return_value = ActiveConnectionInfo(
|
nm_monitor._nm.get_active_connection_info.return_value = ActiveConnectionInfo(
|
||||||
connection='/org/freedesktop/NetworkManager/Settings/12',
|
connection='/org/freedesktop/NetworkManager/Settings/12', type=connection_type
|
||||||
type=connection_type
|
|
||||||
)
|
)
|
||||||
nm_monitor._nm.get_settings.side_effect = [{connection_type: type_settings}]
|
nm_monitor._nm.get_settings.side_effect = [{connection_type: type_settings}]
|
||||||
|
|
||||||
|
@ -78,10 +83,12 @@ def test_get_known_wifis(nm_monitor):
|
||||||
|
|
||||||
result = nm_monitor.get_known_wifis()
|
result = nm_monitor.get_known_wifis()
|
||||||
|
|
||||||
assert result == [SystemWifiInfo(
|
assert result == [
|
||||||
|
SystemWifiInfo(
|
||||||
ssid='TEST',
|
ssid='TEST',
|
||||||
last_connected=datetime(2020, 8, 13, 7, 28, 56),
|
last_connected=datetime(2020, 8, 13, 7, 28, 56),
|
||||||
)]
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_get_known_wifis_with_never_used_connection(nm_monitor):
|
def test_get_known_wifis_with_never_used_connection(nm_monitor):
|
||||||
|
@ -93,10 +100,12 @@ def test_get_known_wifis_with_never_used_connection(nm_monitor):
|
||||||
|
|
||||||
result = nm_monitor.get_known_wifis()
|
result = nm_monitor.get_known_wifis()
|
||||||
|
|
||||||
assert result == [SystemWifiInfo(
|
assert result == [
|
||||||
|
SystemWifiInfo(
|
||||||
ssid='TEST',
|
ssid='TEST',
|
||||||
last_connected=None,
|
last_connected=None,
|
||||||
)]
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_get_known_wifis_partial_failure(nm_monitor):
|
def test_get_known_wifis_partial_failure(nm_monitor):
|
||||||
|
@ -114,10 +123,12 @@ def test_get_known_wifis_partial_failure(nm_monitor):
|
||||||
|
|
||||||
result = nm_monitor.get_known_wifis()
|
result = nm_monitor.get_known_wifis()
|
||||||
|
|
||||||
assert result == [SystemWifiInfo(
|
assert result == [
|
||||||
|
SystemWifiInfo(
|
||||||
ssid='TEST',
|
ssid='TEST',
|
||||||
last_connected=None,
|
last_connected=None,
|
||||||
)]
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_get_known_wifis_with_no_wifi_connections(nm_monitor):
|
def test_get_known_wifis_with_no_wifi_connections(nm_monitor):
|
||||||
|
@ -132,11 +143,14 @@ def test_get_known_wifis_with_no_wifi_connections(nm_monitor):
|
||||||
assert result == []
|
assert result == []
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('ssid_bytes, expected', [
|
@pytest.mark.parametrize(
|
||||||
|
'ssid_bytes, expected',
|
||||||
|
[
|
||||||
([84, 69, 83, 84], 'TEST'),
|
([84, 69, 83, 84], 'TEST'),
|
||||||
([240, 159, 150, 150], '🖖'),
|
([240, 159, 150, 150], '🖖'),
|
||||||
([0, 1, 2, 10, 34, 39], '\\x00\\x01\\x02\\n"\''),
|
([0, 1, 2, 10, 34, 39], '\\x00\\x01\\x02\\n"\''),
|
||||||
])
|
],
|
||||||
|
)
|
||||||
def test_decode_ssid(ssid_bytes, expected):
|
def test_decode_ssid(ssid_bytes, expected):
|
||||||
result = decode_ssid(ssid_bytes)
|
result = decode_ssid(ssid_bytes)
|
||||||
assert result == expected
|
assert result == expected
|
||||||
|
|
|
@ -76,8 +76,7 @@ def test_repo_compact(qapp, qtbot, mocker, borg_json_output):
|
||||||
qtbot.mouseClick(tab.compactButton, QtCore.Qt.LeftButton)
|
qtbot.mouseClick(tab.compactButton, QtCore.Qt.LeftButton)
|
||||||
|
|
||||||
qtbot.waitUntil(
|
qtbot.waitUntil(
|
||||||
lambda: 'compaction freed about 56.00 kB repository space' in main.logText.text(),
|
lambda: 'compaction freed about 56.00 kB repository space' in main.logText.text(), **pytest._wait_defaults
|
||||||
**pytest._wait_defaults
|
|
||||||
)
|
)
|
||||||
vorta.utils.borg_compat.version = '1.1.0'
|
vorta.utils.borg_compat.version = '1.1.0'
|
||||||
|
|
||||||
|
@ -102,9 +101,7 @@ def psutil_disk_partitions(**kwargs):
|
||||||
DiskPartitions = namedtuple('DiskPartitions', ['device', 'mountpoint'])
|
DiskPartitions = namedtuple('DiskPartitions', ['device', 'mountpoint'])
|
||||||
return [DiskPartitions('borgfs', '/tmp')]
|
return [DiskPartitions('borgfs', '/tmp')]
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(psutil, "disk_partitions", psutil_disk_partitions)
|
||||||
psutil, "disk_partitions", psutil_disk_partitions
|
|
||||||
)
|
|
||||||
|
|
||||||
main = qapp.main_window
|
main = qapp.main_window
|
||||||
tab = main.archiveTab
|
tab = main.archiveTab
|
||||||
|
@ -116,9 +113,7 @@ def psutil_disk_partitions(**kwargs):
|
||||||
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
||||||
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
|
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(vorta.views.archive_tab, "choose_file_dialog", choose_file_dialog)
|
||||||
vorta.views.archive_tab, "choose_file_dialog", choose_file_dialog
|
|
||||||
)
|
|
||||||
|
|
||||||
tab.bmountarchive_clicked()
|
tab.bmountarchive_clicked()
|
||||||
qtbot.waitUntil(lambda: tab.mountErrors.text().startswith('Mounted'), **pytest._wait_defaults)
|
qtbot.waitUntil(lambda: tab.mountErrors.text().startswith('Mounted'), **pytest._wait_defaults)
|
||||||
|
|
|
@ -7,8 +7,9 @@
|
||||||
from vorta.views.diff_result import ChangeType, DiffData, DiffTree, FileType, parse_diff_json, parse_diff_lines
|
from vorta.views.diff_result import ChangeType, DiffData, DiffTree, FileType, parse_diff_json, parse_diff_lines
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('json_mock_file,folder_root', [
|
@pytest.mark.parametrize(
|
||||||
('diff_archives', 'test'), ('diff_archives_dict_issue', 'Users')])
|
'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):
|
def test_archive_diff(qapp, qtbot, mocker, borg_json_output, json_mock_file, folder_root):
|
||||||
main = qapp.main_window
|
main = qapp.main_window
|
||||||
tab = main.archiveTab
|
tab = main.archiveTab
|
||||||
|
@ -27,6 +28,7 @@ def check(feature_name):
|
||||||
if feature_name == 'DIFF_JSON_LINES':
|
if feature_name == 'DIFF_JSON_LINES':
|
||||||
return False
|
return False
|
||||||
return vorta.utils.BorgCompatibility.check(compat, feature_name)
|
return vorta.utils.BorgCompatibility.check(compat, feature_name)
|
||||||
|
|
||||||
mocker.patch.object(vorta.utils.borg_compat, 'check', check)
|
mocker.patch.object(vorta.utils.borg_compat, 'check', check)
|
||||||
|
|
||||||
selection_model: QItemSelectionModel = tab.archiveTable.selectionModel()
|
selection_model: QItemSelectionModel = tab.archiveTable.selectionModel()
|
||||||
|
@ -52,42 +54,74 @@ def check(feature_name):
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'line, expected',
|
'line, expected',
|
||||||
[
|
[
|
||||||
('changed link some/changed/link',
|
(
|
||||||
('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0,
|
'changed link some/changed/link',
|
||||||
None, None, None)),
|
('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0, None, None, None),
|
||||||
(' +77.8 kB -77.8 kB some/changed/file',
|
),
|
||||||
('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800,
|
(
|
||||||
0, None, None,
|
' +77.8 kB -77.8 kB some/changed/file',
|
||||||
(77800, 77800))),
|
('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800, 0, None, None, (77800, 77800)),
|
||||||
(' +77.8 kB -77.8 kB [-rw-rw-rw- -> -rw-r--r--] some/changed/file',
|
),
|
||||||
('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800, 0,
|
(
|
||||||
('-rw-rw-rw-', '-rw-r--r--'), None, (77800, 77800))),
|
' +77.8 kB -77.8 kB [-rw-rw-rw- -> -rw-r--r--] some/changed/file',
|
||||||
('[-rw-rw-rw- -> -rw-r--r--] some/changed/file',
|
(
|
||||||
('some/changed/file', FileType.FILE, ChangeType.MODE, 0, 0,
|
'some/changed/file',
|
||||||
('-rw-rw-rw-', '-rw-r--r--'), None, None)),
|
FileType.FILE,
|
||||||
('added directory some/changed/dir',
|
ChangeType.MODIFIED,
|
||||||
('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None,
|
2 * 77800,
|
||||||
None, None)),
|
0,
|
||||||
('removed directory some/changed/dir',
|
('-rw-rw-rw-', '-rw-r--r--'),
|
||||||
('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0,
|
None,
|
||||||
None, None, None)),
|
(77800, 77800),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'[-rw-rw-rw- -> -rw-r--r--] some/changed/file',
|
||||||
|
('some/changed/file', FileType.FILE, ChangeType.MODE, 0, 0, ('-rw-rw-rw-', '-rw-r--r--'), None, None),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'added directory some/changed/dir',
|
||||||
|
('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None, None, None),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'removed directory some/changed/dir',
|
||||||
|
('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0, None, None, None),
|
||||||
|
),
|
||||||
# Example from https://github.com/borgbase/vorta/issues/521
|
# Example from https://github.com/borgbase/vorta/issues/521
|
||||||
('[user:user -> nfsnobody:nfsnobody] home/user/arrays/test.txt',
|
(
|
||||||
('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0,
|
'[user:user -> nfsnobody:nfsnobody] home/user/arrays/test.txt',
|
||||||
None, ('user', 'user', 'nfsnobody', 'nfsnobody'), None)),
|
(
|
||||||
|
'home/user/arrays/test.txt',
|
||||||
|
FileType.FILE,
|
||||||
|
ChangeType.OWNER,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
('user', 'user', 'nfsnobody', 'nfsnobody'),
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
# Very short owner change, to check stripping whitespace from file path
|
# Very short owner change, to check stripping whitespace from file path
|
||||||
('[a:a -> b:b] home/user/arrays/test.txt',
|
(
|
||||||
('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0,
|
'[a:a -> b:b] home/user/arrays/test.txt',
|
||||||
None, ('a', 'a', 'b', 'b'), None)),
|
('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0, None, ('a', 'a', 'b', 'b'), None),
|
||||||
|
),
|
||||||
# All file-related changes in one test
|
# All file-related changes in one test
|
||||||
(' +77.8 kB -800 B [user:user -> nfsnobody:nfsnobody] [-rw-rw-rw- -> -rw-r--r--] home/user/arrays/test.txt',
|
(
|
||||||
('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER,
|
' +77.8 kB -800 B [user:user -> nfsnobody:nfsnobody] [-rw-rw-rw- -> -rw-r--r--] home/user/arrays/test.txt',
|
||||||
77800 + 800, 77000, ('-rw-rw-rw-', '-rw-r--r--'),
|
(
|
||||||
('user', 'user', 'nfsnobody', 'nfsnobody'), (77800, 800))),
|
'home/user/arrays/test.txt',
|
||||||
])
|
FileType.FILE,
|
||||||
|
ChangeType.OWNER,
|
||||||
|
77800 + 800,
|
||||||
|
77000,
|
||||||
|
('-rw-rw-rw-', '-rw-r--r--'),
|
||||||
|
('user', 'user', 'nfsnobody', 'nfsnobody'),
|
||||||
|
(77800, 800),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
def test_archive_diff_parser(line, expected):
|
def test_archive_diff_parser(line, expected):
|
||||||
model = DiffTree()
|
model = DiffTree()
|
||||||
model.setMode(model.DisplayMode.FLAT)
|
model.setMode(model.DisplayMode.FLAT)
|
||||||
|
@ -103,113 +137,110 @@ def test_archive_diff_parser(line, expected):
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'line, expected',
|
'line, expected',
|
||||||
[
|
[
|
||||||
({
|
(
|
||||||
'path': 'some/changed/link',
|
{'path': 'some/changed/link', 'changes': [{'type': 'changed link'}]},
|
||||||
'changes': [{
|
('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0, None, None, None),
|
||||||
'type': 'changed link'
|
),
|
||||||
}]
|
(
|
||||||
}, ('some/changed/link', FileType.LINK, ChangeType.CHANGED_LINK, 0, 0,
|
{'path': 'some/changed/file', 'changes': [{'type': 'modified', 'added': 77800, 'removed': 77800}]},
|
||||||
None, None, None)),
|
('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800, 0, None, None, (77800, 77800)),
|
||||||
({
|
),
|
||||||
|
(
|
||||||
|
{
|
||||||
'path': 'some/changed/file',
|
'path': 'some/changed/file',
|
||||||
'changes': [{
|
'changes': [
|
||||||
'type': 'modified',
|
{'type': 'modified', 'added': 77800, 'removed': 800},
|
||||||
'added': 77800,
|
{'type': 'mode', 'old_mode': '-rw-rw-rw-', 'new_mode': '-rw-r--r--'},
|
||||||
'removed': 77800
|
],
|
||||||
}]
|
},
|
||||||
}, ('some/changed/file', FileType.FILE, ChangeType.MODIFIED, 2 * 77800,
|
(
|
||||||
0, None, None, (77800, 77800))),
|
|
||||||
({
|
|
||||||
'path':
|
|
||||||
'some/changed/file',
|
'some/changed/file',
|
||||||
'changes': [{
|
FileType.FILE,
|
||||||
'type': 'modified',
|
ChangeType.MODIFIED,
|
||||||
'added': 77800,
|
77800 + 800,
|
||||||
'removed': 800
|
77000,
|
||||||
}, {
|
('-rw-rw-rw-', '-rw-r--r--'),
|
||||||
'type': 'mode',
|
None,
|
||||||
'old_mode': '-rw-rw-rw-',
|
(77800, 800),
|
||||||
'new_mode': '-rw-r--r--'
|
),
|
||||||
}]
|
),
|
||||||
}, ('some/changed/file', FileType.FILE, ChangeType.MODIFIED,
|
(
|
||||||
77800 + 800, 77000, ('-rw-rw-rw-', '-rw-r--r--'), None,
|
{
|
||||||
(77800, 800))),
|
'path': 'some/changed/file',
|
||||||
({
|
'changes': [{'type': 'mode', 'old_mode': '-rw-rw-rw-', 'new_mode': '-rw-r--r--'}],
|
||||||
'path':
|
},
|
||||||
'some/changed/file',
|
('some/changed/file', FileType.FILE, ChangeType.MODE, 0, 0, ('-rw-rw-rw-', '-rw-r--r--'), None, None),
|
||||||
'changes': [{
|
),
|
||||||
'type': 'mode',
|
(
|
||||||
'old_mode': '-rw-rw-rw-',
|
{'path': 'some/changed/dir', 'changes': [{'type': 'added directory'}]},
|
||||||
'new_mode': '-rw-r--r--'
|
('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0, None, None, None),
|
||||||
}]
|
),
|
||||||
}, ('some/changed/file', FileType.FILE, ChangeType.MODE, 0, 0,
|
(
|
||||||
('-rw-rw-rw-', '-rw-r--r--'), None, None)),
|
{'path': 'some/changed/dir', 'changes': [{'type': 'removed directory'}]},
|
||||||
({
|
('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0, 0, None, None, None),
|
||||||
'path': 'some/changed/dir',
|
),
|
||||||
'changes': [{
|
|
||||||
'type': 'added directory'
|
|
||||||
}]
|
|
||||||
}, ('some/changed/dir', FileType.DIRECTORY, ChangeType.ADDED, 0, 0,
|
|
||||||
None, None, None)),
|
|
||||||
({
|
|
||||||
'path': 'some/changed/dir',
|
|
||||||
'changes': [{
|
|
||||||
'type': 'removed directory'
|
|
||||||
}]
|
|
||||||
}, ('some/changed/dir', FileType.DIRECTORY, ChangeType.REMOVED_DIR, 0,
|
|
||||||
0, None, None, None)),
|
|
||||||
|
|
||||||
# Example from https://github.com/borgbase/vorta/issues/521
|
# Example from https://github.com/borgbase/vorta/issues/521
|
||||||
({
|
(
|
||||||
'path':
|
{
|
||||||
'home/user/arrays/test.txt',
|
'path': 'home/user/arrays/test.txt',
|
||||||
'changes': [{
|
'changes': [
|
||||||
|
{
|
||||||
'type': 'owner',
|
'type': 'owner',
|
||||||
'old_user': 'user',
|
'old_user': 'user',
|
||||||
'new_user': 'nfsnobody',
|
'new_user': 'nfsnobody',
|
||||||
'old_group': 'user',
|
'old_group': 'user',
|
||||||
'new_group': 'nfsnobody'
|
'new_group': 'nfsnobody',
|
||||||
}]
|
}
|
||||||
}, ('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0,
|
],
|
||||||
None, ('user', 'user', 'nfsnobody', 'nfsnobody'), None)),
|
},
|
||||||
|
(
|
||||||
|
'home/user/arrays/test.txt',
|
||||||
|
FileType.FILE,
|
||||||
|
ChangeType.OWNER,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
('user', 'user', 'nfsnobody', 'nfsnobody'),
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
# Very short owner change, to check stripping whitespace from file path
|
# Very short owner change, to check stripping whitespace from file path
|
||||||
({
|
(
|
||||||
'path':
|
{
|
||||||
'home/user/arrays/test.txt',
|
'path': 'home/user/arrays/test.txt',
|
||||||
'changes': [{
|
'changes': [{'type': 'owner', 'old_user': 'a', 'new_user': 'b', 'old_group': 'a', 'new_group': 'b'}],
|
||||||
'type': 'owner',
|
},
|
||||||
'old_user': 'a',
|
('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0, None, ('a', 'a', 'b', 'b'), None),
|
||||||
'new_user': 'b',
|
),
|
||||||
'old_group': 'a',
|
|
||||||
'new_group': 'b'
|
|
||||||
}]
|
|
||||||
}, ('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER, 0, 0,
|
|
||||||
None, ('a', 'a', 'b', 'b'), None)),
|
|
||||||
|
|
||||||
# All file-related changes in one test
|
# All file-related changes in one test
|
||||||
({
|
(
|
||||||
'path':
|
{
|
||||||
'home/user/arrays/test.txt',
|
'path': 'home/user/arrays/test.txt',
|
||||||
'changes': [{
|
'changes': [
|
||||||
'type': 'modified',
|
{'type': 'modified', 'added': 77800, 'removed': 77800},
|
||||||
'added': 77800,
|
{'type': 'mode', 'old_mode': '-rw-rw-rw-', 'new_mode': '-rw-r--r--'},
|
||||||
'removed': 77800
|
{
|
||||||
}, {
|
|
||||||
'type': 'mode',
|
|
||||||
'old_mode': '-rw-rw-rw-',
|
|
||||||
'new_mode': '-rw-r--r--'
|
|
||||||
}, {
|
|
||||||
'type': 'owner',
|
'type': 'owner',
|
||||||
'old_user': 'user',
|
'old_user': 'user',
|
||||||
'new_user': 'nfsnobody',
|
'new_user': 'nfsnobody',
|
||||||
'old_group': 'user',
|
'old_group': 'user',
|
||||||
'new_group': 'nfsnobody'
|
'new_group': 'nfsnobody',
|
||||||
}]
|
},
|
||||||
}, ('home/user/arrays/test.txt', FileType.FILE, ChangeType.OWNER,
|
],
|
||||||
2 * 77800, 0, ('-rw-rw-rw-', '-rw-r--r--'),
|
},
|
||||||
('user', 'user', 'nfsnobody', 'nfsnobody'), (77800, 77800))),
|
(
|
||||||
])
|
'home/user/arrays/test.txt',
|
||||||
|
FileType.FILE,
|
||||||
|
ChangeType.OWNER,
|
||||||
|
2 * 77800,
|
||||||
|
0,
|
||||||
|
('-rw-rw-rw-', '-rw-r--r--'),
|
||||||
|
('user', 'user', 'nfsnobody', 'nfsnobody'),
|
||||||
|
(77800, 77800),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
def test_archive_diff_json_parser(line, expected):
|
def test_archive_diff_json_parser(line, expected):
|
||||||
model = DiffTree()
|
model = DiffTree()
|
||||||
model.setMode(model.DisplayMode.FLAT)
|
model.setMode(model.DisplayMode.FLAT)
|
||||||
|
|
|
@ -52,9 +52,7 @@ def test_import_fail_not_json(qapp, rootdir, monkeypatch):
|
||||||
def getOpenFileName(*args, **kwargs):
|
def getOpenFileName(*args, **kwargs):
|
||||||
return [BAD_FILE]
|
return [BAD_FILE]
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(QFileDialog, "getOpenFileName", getOpenFileName)
|
||||||
QFileDialog, "getOpenFileName", getOpenFileName
|
|
||||||
)
|
|
||||||
|
|
||||||
alert_message = None
|
alert_message = None
|
||||||
|
|
||||||
|
@ -62,9 +60,7 @@ def critical(widget, title, message):
|
||||||
nonlocal alert_message
|
nonlocal alert_message
|
||||||
alert_message = message
|
alert_message = message
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(QMessageBox, "critical", critical)
|
||||||
QMessageBox, "critical", critical
|
|
||||||
)
|
|
||||||
|
|
||||||
main = qapp.main_window
|
main = qapp.main_window
|
||||||
main.profile_import_action()
|
main.profile_import_action()
|
||||||
|
@ -79,9 +75,7 @@ def test_export_success(qapp, qtbot, tmpdir, monkeypatch):
|
||||||
def getSaveFileName(*args, **kwargs):
|
def getSaveFileName(*args, **kwargs):
|
||||||
return [FILE_PATH]
|
return [FILE_PATH]
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(QFileDialog, "getSaveFileName", getSaveFileName)
|
||||||
QFileDialog, "getSaveFileName", getSaveFileName
|
|
||||||
)
|
|
||||||
|
|
||||||
main = qapp.main_window
|
main = qapp.main_window
|
||||||
main.profile_export_action()
|
main.profile_export_action()
|
||||||
|
@ -99,9 +93,7 @@ def test_export_fail_unwritable(qapp, qtbot, tmpdir, monkeypatch):
|
||||||
def getSaveFileName(*args, **kwargs):
|
def getSaveFileName(*args, **kwargs):
|
||||||
return [FILE_PATH]
|
return [FILE_PATH]
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(QFileDialog, "getSaveFileName", getSaveFileName)
|
||||||
QFileDialog, "getSaveFileName", getSaveFileName
|
|
||||||
)
|
|
||||||
|
|
||||||
alert_message = None
|
alert_message = None
|
||||||
|
|
||||||
|
@ -109,9 +101,7 @@ def critical(widget, title, message):
|
||||||
nonlocal alert_message
|
nonlocal alert_message
|
||||||
alert_message = message
|
alert_message = message
|
||||||
|
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(QMessageBox, "critical", critical)
|
||||||
QMessageBox, "critical", critical
|
|
||||||
)
|
|
||||||
|
|
||||||
main = qapp.main_window
|
main = qapp.main_window
|
||||||
main.profile_export_action()
|
main.profile_export_action()
|
||||||
|
|
|
@ -14,8 +14,7 @@ def test_autostart(qapp, qtbot):
|
||||||
|
|
||||||
def click_autostart():
|
def click_autostart():
|
||||||
for x in range(0, tab.checkboxLayout.count()):
|
for x in range(0, tab.checkboxLayout.count()):
|
||||||
item = tab.checkboxLayout.itemAt(x,
|
item = tab.checkboxLayout.itemAt(x, QFormLayout.ItemRole.FieldRole)
|
||||||
QFormLayout.ItemRole.FieldRole)
|
|
||||||
if not item:
|
if not item:
|
||||||
continue
|
continue
|
||||||
checkbox = item.widget()
|
checkbox = item.widget()
|
||||||
|
@ -29,14 +28,16 @@ def click_autostart():
|
||||||
click_autostart()
|
click_autostart()
|
||||||
|
|
||||||
if sys.platform == 'linux':
|
if sys.platform == 'linux':
|
||||||
autostart_path = Path(os.environ.get(
|
autostart_path = (
|
||||||
"XDG_CONFIG_HOME", os.path.expanduser("~") + '/.config') + "/autostart") / "vorta.desktop"
|
Path(os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~") + '/.config') + "/autostart")
|
||||||
|
/ "vorta.desktop"
|
||||||
|
)
|
||||||
qtbot.waitUntil(lambda: autostart_path.exists(), **pytest._wait_defaults)
|
qtbot.waitUntil(lambda: autostart_path.exists(), **pytest._wait_defaults)
|
||||||
|
|
||||||
with open(autostart_path) as desktop_file:
|
with open(autostart_path) as desktop_file:
|
||||||
desktop_file_text = desktop_file.read()
|
desktop_file_text = desktop_file.read()
|
||||||
|
|
||||||
assert (desktop_file_text.startswith("[Desktop Entry]"))
|
assert desktop_file_text.startswith("[Desktop Entry]")
|
||||||
|
|
||||||
click_autostart()
|
click_autostart()
|
||||||
if sys.platform == 'linux':
|
if sys.platform == 'linux':
|
||||||
|
|
|
@ -57,8 +57,9 @@ def test_repo_unlink(qapp, qtbot):
|
||||||
|
|
||||||
qtbot.mouseClick(main.createStartBtn, QtCore.Qt.LeftButton)
|
qtbot.mouseClick(main.createStartBtn, QtCore.Qt.LeftButton)
|
||||||
# -1 is the repo id in this test
|
# -1 is the repo id in this test
|
||||||
qtbot.waitUntil(lambda: main.progressText.text().startswith('Add a backup repository first.'),
|
qtbot.waitUntil(
|
||||||
**pytest._wait_defaults)
|
lambda: main.progressText.text().startswith('Add a backup repository first.'), **pytest._wait_defaults
|
||||||
|
)
|
||||||
assert main.progressText.text() == 'Add a backup repository first.'
|
assert main.progressText.text() == 'Add a backup repository first.'
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,7 +75,7 @@ def test_password_autofill(qapp, qtbot):
|
||||||
|
|
||||||
qtbot.keyClicks(add_repo_window.repoURL, test_repo_url)
|
qtbot.keyClicks(add_repo_window.repoURL, test_repo_url)
|
||||||
|
|
||||||
assert (add_repo_window.passwordLineEdit.text() == password)
|
assert add_repo_window.passwordLineEdit.text() == password
|
||||||
|
|
||||||
|
|
||||||
def test_repo_add_success(qapp, qtbot, mocker, borg_json_output):
|
def test_repo_add_success(qapp, qtbot, mocker, borg_json_output):
|
||||||
|
@ -93,9 +94,9 @@ def test_repo_add_success(qapp, qtbot, mocker, borg_json_output):
|
||||||
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
|
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
|
||||||
|
|
||||||
add_repo_window.run()
|
add_repo_window.run()
|
||||||
qtbot.waitUntil(lambda: EventLogModel.select()
|
qtbot.waitUntil(
|
||||||
.where(EventLogModel.returncode == 0).count() == 2,
|
lambda: EventLogModel.select().where(EventLogModel.returncode == 0).count() == 2, **pytest._wait_defaults
|
||||||
**pytest._wait_defaults)
|
)
|
||||||
|
|
||||||
assert RepoModel.get(id=2).url == test_repo_url
|
assert RepoModel.get(id=2).url == test_repo_url
|
||||||
|
|
||||||
|
|
|
@ -56,12 +56,14 @@ def test_schedule_tab(qapp: VortaApp, qtbot, clockmock):
|
||||||
profile = BackupProfileModel.get(name=PROFILE_NAME)
|
profile = BackupProfileModel.get(name=PROFILE_NAME)
|
||||||
profile.schedule_make_up_missed = False
|
profile.schedule_make_up_missed = False
|
||||||
profile.save()
|
profile.save()
|
||||||
event = EventLogModel(subcommand='create',
|
event = EventLogModel(
|
||||||
|
subcommand='create',
|
||||||
profile=profile.id,
|
profile=profile.id,
|
||||||
returncode=0,
|
returncode=0,
|
||||||
category='scheduled',
|
category='scheduled',
|
||||||
start_time=last_time,
|
start_time=last_time,
|
||||||
end_time=last_time)
|
end_time=last_time,
|
||||||
|
)
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
qapp.scheduler.set_timer_for_profile(profile.id)
|
qapp.scheduler.set_timer_for_profile(profile.id)
|
||||||
|
|
|
@ -25,15 +25,12 @@ def clockmock(monkeypatch):
|
||||||
|
|
||||||
def prepare(func):
|
def prepare(func):
|
||||||
"""Decorator adding common preparation steps."""
|
"""Decorator adding common preparation steps."""
|
||||||
|
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
def do(qapp, qtbot, mocker, borg_json_output):
|
def do(qapp, qtbot, mocker, borg_json_output):
|
||||||
stdout, stderr = borg_json_output('create')
|
stdout, stderr = borg_json_output('create')
|
||||||
popen_result = mocker.MagicMock(stdout=stdout,
|
popen_result = mocker.MagicMock(stdout=stdout, stderr=stderr, returncode=0)
|
||||||
stderr=stderr,
|
mocker.patch.object(vorta.borg.borg_job, 'Popen', return_value=popen_result)
|
||||||
returncode=0)
|
|
||||||
mocker.patch.object(vorta.borg.borg_job,
|
|
||||||
'Popen',
|
|
||||||
return_value=popen_result)
|
|
||||||
|
|
||||||
return func(qapp, qtbot, mocker, borg_json_output)
|
return func(qapp, qtbot, mocker, borg_json_output)
|
||||||
|
|
||||||
|
@ -81,12 +78,9 @@ def test_simple_schedule(clockmock):
|
||||||
profile.schedule_interval_count = 3
|
profile.schedule_interval_count = 3
|
||||||
profile.save()
|
profile.save()
|
||||||
|
|
||||||
event = EventLogModel(subcommand='create',
|
event = EventLogModel(
|
||||||
profile=profile.id,
|
subcommand='create', profile=profile.id, returncode=0, category='scheduled', start_time=time, end_time=time
|
||||||
returncode=0,
|
)
|
||||||
category='scheduled',
|
|
||||||
start_time=time,
|
|
||||||
end_time=time)
|
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
# test set timer and next_job
|
# test set timer and next_job
|
||||||
|
@ -94,7 +88,8 @@ def test_simple_schedule(clockmock):
|
||||||
assert len(scheduler.timers) == 1
|
assert len(scheduler.timers) == 1
|
||||||
assert scheduler.next_job() == '07:30 ({})'.format(PROFILE_NAME)
|
assert scheduler.next_job() == '07:30 ({})'.format(PROFILE_NAME)
|
||||||
assert scheduler.next_job_for_profile(profile.id) == ScheduleStatus(
|
assert scheduler.next_job_for_profile(profile.id) == ScheduleStatus(
|
||||||
ScheduleStatusType.SCHEDULED, dt(2020, 5, 6, 7, 30))
|
ScheduleStatusType.SCHEDULED, dt(2020, 5, 6, 7, 30)
|
||||||
|
)
|
||||||
|
|
||||||
# test remove_job and next_job
|
# test remove_job and next_job
|
||||||
scheduler.remove_job(profile.id)
|
scheduler.remove_job(profile.id)
|
||||||
|
@ -109,21 +104,17 @@ def test_simple_schedule(clockmock):
|
||||||
[
|
[
|
||||||
# simple
|
# simple
|
||||||
(td(), td(hours=4, minutes=30), 'hours', 3, td(hours=3)),
|
(td(), td(hours=4, minutes=30), 'hours', 3, td(hours=3)),
|
||||||
|
|
||||||
# next day
|
# next day
|
||||||
(td(), td(hours=4, minutes=30), 'hours', 20, td(hours=20)),
|
(td(), td(hours=4, minutes=30), 'hours', 20, td(hours=20)),
|
||||||
|
|
||||||
# passed by less than interval
|
# passed by less than interval
|
||||||
(td(hours=2), td(hours=4, minutes=30), 'hours', 3, td(hours=1)),
|
(td(hours=2), td(hours=4, minutes=30), 'hours', 3, td(hours=1)),
|
||||||
|
|
||||||
# passed by exactly interval
|
# passed by exactly interval
|
||||||
(td(hours=3), td(hours=4, minutes=30), 'hours', 3, td(hours=3)),
|
(td(hours=3), td(hours=4, minutes=30), 'hours', 3, td(hours=3)),
|
||||||
|
|
||||||
# passed by multiple times the interval
|
# passed by multiple times the interval
|
||||||
(td(hours=7), td(hours=4, minutes=30), 'hours', 3, td(hours=2))
|
(td(hours=7), td(hours=4, minutes=30), 'hours', 3, td(hours=2)),
|
||||||
])
|
],
|
||||||
def test_interval(clockmock, passed_time, scheduled, now, unit, count,
|
)
|
||||||
added_time):
|
def test_interval(clockmock, passed_time, scheduled, now, unit, count, added_time):
|
||||||
"""Test scheduling in interval mode."""
|
"""Test scheduling in interval mode."""
|
||||||
# setup
|
# setup
|
||||||
scheduler = VortaScheduler()
|
scheduler = VortaScheduler()
|
||||||
|
@ -138,12 +129,14 @@ def test_interval(clockmock, passed_time, scheduled, now, unit, count,
|
||||||
profile.schedule_interval_count = count
|
profile.schedule_interval_count = count
|
||||||
profile.save()
|
profile.save()
|
||||||
|
|
||||||
event = EventLogModel(subcommand='create',
|
event = EventLogModel(
|
||||||
|
subcommand='create',
|
||||||
profile=profile.id,
|
profile=profile.id,
|
||||||
returncode=0,
|
returncode=0,
|
||||||
category='scheduled' if scheduled else '',
|
category='scheduled' if scheduled else '',
|
||||||
start_time=time - passed_time,
|
start_time=time - passed_time,
|
||||||
end_time=time - passed_time)
|
end_time=time - passed_time,
|
||||||
|
)
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
# run test
|
# run test
|
||||||
|
@ -152,19 +145,16 @@ def test_interval(clockmock, passed_time, scheduled, now, unit, count,
|
||||||
|
|
||||||
|
|
||||||
@mark.parametrize("scheduled", [True, False])
|
@mark.parametrize("scheduled", [True, False])
|
||||||
@mark.parametrize(
|
@mark.parametrize("passed_time", [td(hours=0), td(hours=5), td(hours=14), td(hours=27)])
|
||||||
"passed_time",
|
|
||||||
[td(hours=0), td(hours=5),
|
|
||||||
td(hours=14), td(hours=27)])
|
|
||||||
@mark.parametrize(
|
@mark.parametrize(
|
||||||
"now, hour, minute",
|
"now, hour, minute",
|
||||||
[
|
[
|
||||||
# same day
|
# same day
|
||||||
(td(hours=4, minutes=30), 15, 00),
|
(td(hours=4, minutes=30), 15, 00),
|
||||||
|
|
||||||
# next day
|
# next day
|
||||||
(td(hours=4, minutes=30), 3, 30),
|
(td(hours=4, minutes=30), 3, 30),
|
||||||
])
|
],
|
||||||
|
)
|
||||||
def test_fixed(clockmock, passed_time, scheduled, now, hour, minute):
|
def test_fixed(clockmock, passed_time, scheduled, now, hour, minute):
|
||||||
"""Test scheduling in fixed mode."""
|
"""Test scheduling in fixed mode."""
|
||||||
# setup
|
# setup
|
||||||
|
@ -181,12 +171,14 @@ def test_fixed(clockmock, passed_time, scheduled, now, hour, minute):
|
||||||
profile.save()
|
profile.save()
|
||||||
|
|
||||||
last_time = time - passed_time
|
last_time = time - passed_time
|
||||||
event = EventLogModel(subcommand='create',
|
event = EventLogModel(
|
||||||
|
subcommand='create',
|
||||||
profile=profile.id,
|
profile=profile.id,
|
||||||
returncode=0,
|
returncode=0,
|
||||||
category='scheduled' if scheduled else '',
|
category='scheduled' if scheduled else '',
|
||||||
start_time=last_time,
|
start_time=last_time,
|
||||||
end_time=last_time)
|
end_time=last_time,
|
||||||
|
)
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
# run test
|
# run test
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
|
|
||||||
|
|
||||||
def test_add_folder(qapp, qtbot, mocker, monkeypatch, choose_file_dialog):
|
def test_add_folder(qapp, qtbot, mocker, monkeypatch, choose_file_dialog):
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(vorta.views.source_tab, "choose_file_dialog", choose_file_dialog)
|
||||||
vorta.views.source_tab, "choose_file_dialog", choose_file_dialog
|
|
||||||
)
|
|
||||||
main = qapp.main_window
|
main = qapp.main_window
|
||||||
main.tabWidget.setCurrentIndex(1)
|
main.tabWidget.setCurrentIndex(1)
|
||||||
tab = main.sourceTab
|
tab = main.sourceTab
|
||||||
|
|
|
@ -142,8 +142,7 @@ def test_basic_setup(self):
|
||||||
assert item is not None and item.data == 3
|
assert item is not None and item.data == 3
|
||||||
|
|
||||||
# test parent
|
# test parent
|
||||||
assert (model.parent(model.indexPath(
|
assert model.parent(model.indexPath(PurePath('test/subtest'))) == model.indexPath(PurePath('test'))
|
||||||
PurePath('test/subtest'))) == model.indexPath(PurePath('test')))
|
|
||||||
|
|
||||||
# test index
|
# test index
|
||||||
item1 = model.getItem(('test',))
|
item1 = model.getItem(('test',))
|
||||||
|
|
Loading…
Reference in a new issue