File: test_source.py

package info (click to toggle)
vorta 0.11.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,532 kB
  • sloc: python: 12,262; makefile: 89; xml: 65; sh: 51
file content (121 lines) | stat: -rw-r--r-- 4,882 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import pytest
from PyQt6 import QtCore
from PyQt6.QtWidgets import QMessageBox


@pytest.fixture()
def source_env(qapp, qtbot):
    """Handles setup and teardown for source tab tests."""
    main = qapp.main_window

    main.show()
    qtbot.waitUntil(main.isVisible, timeout=2000)

    main.tabWidget.setCurrentIndex(1)  # activate source tab
    tab = main.sourceTab

    qtbot.waitUntil(tab.isVisible, timeout=2000)  # wait for the tab
    qtbot.waitUntil(lambda: tab.sourceFilesWidget.rowCount() >= 0, timeout=2000)
    yield main, tab

    qapp.processEvents()  # cleanup


@pytest.mark.skip(reason="prone to failure due to background thread")
def test_source_add_remove(qapp, qtbot, mocker, source_env):
    main, tab = source_env
    qtbot.waitUntil(tab.isVisible, timeout=2000)  # visibility check

    mocker.patch.object(QMessageBox, "exec")
    mocker.patch('vorta.filedialog.VortaFileSelector.get_paths', return_value=["/tmp/test"])
    mocker.patch('os.access', return_value=True)

    initial_count = tab.sourceFilesWidget.rowCount()

    # test add
    tab.source_add()
    qtbot.waitUntil(lambda: tab.sourceFilesWidget.rowCount() > initial_count, timeout=2000)

    # test remove
    tab.sourceFilesWidget.selectRow(initial_count)  # Select the new row
    qtbot.mouseClick(tab.removeButton, QtCore.Qt.MouseButton.LeftButton)
    qtbot.waitUntil(lambda: tab.sourceFilesWidget.rowCount() == initial_count, timeout=2000)


@pytest.mark.skip(reason="prone to failure due to background thread")
def test_sources_update(qapp, qtbot, mocker, source_env):
    """
    Tests the source update button in the source tab
    """
    main, tab = source_env
    update_path_info_spy = mocker.spy(tab, "update_path_info")

    # test that `update_path_info()` has been called for each source path
    qtbot.mouseClick(tab.updateButton, QtCore.Qt.MouseButton.LeftButton)
    assert tab.sourceFilesWidget.rowCount() == 1
    assert update_path_info_spy.call_count == 1

    # add a new source and reset mock
    mocker.patch('os.access', return_value=True)
    mocker.patch('vorta.filedialog.VortaFileSelector.get_paths', return_value=["/tmp", "/tmp/another"])
    tab.source_add()
    qtbot.waitUntil(lambda: tab.sourceFilesWidget.rowCount() == 2, **pytest._wait_defaults)
    update_path_info_spy.reset_mock()

    # retest that `update_path_info()` has been called for each source path
    qtbot.mouseClick(tab.updateButton, QtCore.Qt.MouseButton.LeftButton)
    assert tab.sourceFilesWidget.rowCount() == 2
    assert update_path_info_spy.call_count == 2


@pytest.mark.skip(reason="prone to failure due to background thread")
def test_source_copy(qapp, qtbot, mocker, source_env):
    main, tab = source_env
    qtbot.waitUntil(tab.isVisible, timeout=2000)

    mock_clipboard = mocker.patch.object(qapp.clipboard(), "setMimeData")
    mocker.patch('os.access', return_value=True)
    mocker.patch('vorta.filedialog.VortaFileSelector.get_paths', return_value=["/tmp"])

    initial_count = tab.sourceFilesWidget.rowCount()
    tab.source_add()
    qtbot.waitUntil(lambda: tab.sourceFilesWidget.rowCount() > initial_count, timeout=2000)

    tab.sourceFilesWidget.selectRow(initial_count)
    tab.source_copy()
    assert mock_clipboard.call_count == 1


# This test is for the paste_text() feature that was removed. Kept here for reference or possible future use.
# @pytest.mark.skip(reason="prone to failure due to background thread")
# @pytest.mark.parametrize(
#     "path, valid",
#     [
#         (__file__, True),  # valid path
#         ("test", False),  # invalid path
#         (f"file://{__file__}", True),  # valid - normal path with prefix that will be stripped
#         (f"file://{__file__}\n{__file__}", True),  # valid - two files separated by new line
#         (f"file://{__file__}{__file__}", False),  # invalid - no new line separating file names
#     ],
# )
# def test_valid_and_invalid_source_paths(qapp, qtbot, mocker, source_env, path, valid):
#     """
#     Valid paths will be added as a source.
#     Invalid paths will trigger an alert and not be added as a source.
#     """
#     main, tab = source_env
#     mock_clipboard = mocker.Mock()
#     mock_clipboard.text.return_value = path

#     mocker.patch.object(vorta.views.source_tab.QApplication, 'clipboard', return_value=mock_clipboard)
#     mocker.patch.object(QMessageBox, "exec")  # prevent QMessageBox from stopping test
#     tab.paste_text()

#     if valid:
#         assert not hasattr(tab, '_msg')
#         qtbot.waitUntil(lambda: tab.sourceFilesWidget.rowCount() == 2, **pytest._wait_defaults)
#         assert tab.sourceFilesWidget.rowCount() == 2
#     else:
#         qtbot.waitUntil(lambda: hasattr(tab, "_msg"), **pytest._wait_defaults)
#         assert tab._msg.text().startswith("Some of your sources are invalid")
#         assert tab.sourceFilesWidget.rowCount() == 1