1
0
Fork 0
mirror of https://github.com/borgbase/vorta synced 2025-01-03 05:36:19 +00:00
vorta/tests/integration/test_diff.py
2024-10-20 14:04:25 +01:00

398 lines
13 KiB
Python

"""
These tests compare the output of the diff command with the expected output.
"""
import pytest
from packaging.version import Version
import vorta.borg
import vorta.utils
import vorta.views.archive_tab
from vorta.borg.diff import BorgDiffJob
from vorta.views.diff_result import (
ChangeType,
DiffTree,
FileType,
ParseThread,
)
@pytest.mark.parametrize(
"archive_name_1, archive_name_2, expected",
[
(
"test-archive1",
"test-archive2",
[
{
"subpath": "dir",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.MODIFIED,
"modified": None,
},
"min_version": "1.2.4",
"max_version": "1.4.0",
},
{
"subpath": "file",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.MODIFIED,
"modified": (0, 0),
},
"min_version": "1.2.4",
"max_version": "1.4.0",
},
{
"subpath": "chrdev",
"data": {
"file_type": FileType.CHRDEV,
"change_type": ChangeType.ADDED,
"modified": None,
},
},
{
"subpath": "fifo",
"data": {
"file_type": FileType.FIFO,
"change_type": ChangeType.ADDED,
"modified": None,
},
},
{
"subpath": "hardlink",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.ADDED,
"modified": None,
},
},
{
"subpath": "symlink",
"data": {
"file_type": FileType.LINK,
"change_type": ChangeType.ADDED,
"modified": None,
},
},
],
),
(
"test-archive2",
"test-archive3",
[
{
"subpath": "borg_src",
"match_startsWith": True,
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.MODIFIED,
"modified": None,
},
"min_version": "1.2.4",
"max_version": "1.4.0",
},
{
"subpath": "dir",
"data": {
"file_type": FileType.DIRECTORY,
"change_type": ChangeType.REMOVED,
"modified": None,
},
},
{
"subpath": "chrdev",
"data": {
"file_type": FileType.CHRDEV,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "fifo",
"data": {
"file_type": FileType.FIFO,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "file",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "hardlink",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "symlink",
"data": {
"file_type": FileType.LINK,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "dir1",
"data": {
"file_type": FileType.DIRECTORY,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "chrdev",
"data": {
"file_type": FileType.CHRDEV,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "fifo",
"data": {
"file_type": FileType.FIFO,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "file",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "hardlink",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "symlink",
"data": {
"file_type": FileType.LINK,
"change_type": ChangeType.ADDED,
},
},
],
),
(
"test-archive3",
"test-archive4",
[
{
"subpath": "dir1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.MODIFIED,
},
"min_version": "1.2.4",
"max_version": "1.4.0",
},
{
"subpath": "chrdev",
"data": {
"file_type": FileType.CHRDEV,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "chrdev1",
"data": {
"file_type": FileType.CHRDEV,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "fifo",
"data": {
"file_type": FileType.FIFO,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "fifo1",
"data": {
"file_type": FileType.FIFO,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "file",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "file1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "hardlink",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "hardlink1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.ADDED,
},
},
{
"subpath": "symlink",
"data": {
"file_type": FileType.LINK,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "symlink1",
"data": {
"file_type": FileType.LINK,
"change_type": ChangeType.ADDED,
},
},
],
),
(
"test-archive4",
"test-archive5",
[
{
"subpath": "dir1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.MODIFIED,
},
"min_version": "1.2.4",
"max_version": "1.4.0",
},
{
"subpath": "chrdev1",
"data": {
"file_type": FileType.CHRDEV,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "fifo1",
"data": {
"file_type": FileType.FIFO,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "file1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "hardlink1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.REMOVED,
},
},
{
"subpath": "symlink1",
"data": {
"file_type": FileType.LINK,
"change_type": ChangeType.REMOVED,
},
},
],
),
(
"test-archive5",
"test-archive6",
[
{
"subpath": "dir1",
"data": {
"file_type": FileType.FILE,
"change_type": ChangeType.MODIFIED,
},
"min_version": "1.2.4",
"max_version": "1.4.0",
},
],
),
],
)
def test_archive_diff_lines(
qapp,
qtbot,
borg_version,
create_test_repo,
archive_name_1,
archive_name_2,
expected,
):
"""Test that the diff lines are parsed correctly for supported borg versions"""
parsed_borg_version = borg_version[1]
supports_fifo = parsed_borg_version > Version("1.1.18")
supports_chrdev = create_test_repo[2]
params = BorgDiffJob.prepare(
vorta.store.models.BackupProfileModel.select().first(),
archive_name_1,
archive_name_2,
)
thread = BorgDiffJob(params["cmd"], params, qapp)
with qtbot.waitSignal(thread.result, **pytest._wait_defaults) as blocker:
blocker.connect(thread.updated)
thread.run()
diff_lines = blocker.args[0]["data"]
json_lines = blocker.args[0]["params"]["json_lines"]
model = DiffTree()
model.setMode(model.DisplayMode.FLAT)
# Use ParseThread to parse the diff lines
parse_thread = ParseThread(diff_lines, json_lines, model)
parse_thread.start()
qtbot.waitUntil(lambda: parse_thread.isFinished(), **pytest._wait_defaults)
expected = [
item
for item in expected
if (
("min_version" not in item or Version(item["min_version"]) <= parsed_borg_version)
and ("max_version" not in item or Version(item["max_version"]) >= parsed_borg_version)
and (item["data"]["file_type"] != FileType.FIFO or supports_fifo)
and (item["data"]["file_type"] != FileType.CHRDEV or supports_chrdev)
)
]
# diff versions of borg produce inconsistent ordering of diff lines so we sort the expected and model
expected = sorted(expected, key=lambda item: item["subpath"])
sorted_model = sorted(
[model.index(index, 0).internalPointer() for index in range(model.rowCount())],
key=lambda item: item.subpath,
)
assert len(sorted_model) == len(expected)
for index, item in enumerate(expected):
if "match_startsWith" in item and item["match_startsWith"]:
assert sorted_model[index].subpath.startswith(item["subpath"])
else:
assert sorted_model[index].subpath == item["subpath"]
for key, value in item["data"].items():
assert getattr(sorted_model[index].data, key) == value