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
|
from unittest.mock import patch
import pytest
from PyQt6.QtCore import QVariant
from vorta.keyring.kwallet import KWalletNotAvailableException, VortaKWallet5Keyring
@pytest.fixture
def kwallet_keyring():
with patch('vorta.keyring.kwallet.QtDBus.QDBusInterface') as MockInterface:
mock_iface = MockInterface.return_value
mock_iface.isValid.return_value = True
with patch.object(VortaKWallet5Keyring, 'get_result') as mock_get_result:
mock_get_result.side_effect = lambda method, args=[]: (True if method == "isEnabled" else None)
mock_iface.callWithArgumentList.return_value.arguments.return_value = [1]
yield VortaKWallet5Keyring()
@patch('vorta.keyring.kwallet.QtDBus.QDBusInterface')
def test_init_valid(mock_iface):
mock_iface.return_value.isValid.return_value = True
with patch.object(VortaKWallet5Keyring, 'get_result', return_value=True):
keyring = VortaKWallet5Keyring()
assert keyring.iface.isValid()
@patch('vorta.keyring.kwallet.QtDBus.QDBusInterface')
def test_init_invalid(mock_iface):
mock_iface.return_value.isValid.return_value = False
with pytest.raises(KWalletNotAvailableException):
VortaKWallet5Keyring()
def test_set_password(kwallet_keyring):
with patch.object(kwallet_keyring, 'get_result', return_value=None) as mock_get_result:
kwallet_keyring.set_password('test_service', 'test_repo', 'test_password')
mock_get_result.assert_called_once_with(
"writePassword",
args=[kwallet_keyring.handle, kwallet_keyring.folder_name, 'test_repo', 'test_password', 'test_service'],
)
@patch('vorta.keyring.kwallet.QInputDialog.getText', return_value=('', False))
def test_get_password(mock_dialog, kwallet_keyring):
wId = QVariant(0)
with patch.object(kwallet_keyring, 'get_result') as mock_get_result:
mock_get_result.side_effect = [
'test_wallet', # networkWallet
42, # open (wallet handle)
True, # hasEntry
'test_password', # readPassword
]
password = kwallet_keyring.get_password('test_service', 'test_repo')
# Debug assertions to ensure proper flow
mock_get_result.assert_any_call("networkWallet")
mock_get_result.assert_any_call("open", args=['test_wallet', wId, 'vorta-repo'])
mock_get_result.assert_any_call(
"hasEntry", args=[kwallet_keyring.handle, kwallet_keyring.folder_name, 'test_repo', 'test_service']
)
mock_get_result.assert_any_call(
"readPassword", args=[kwallet_keyring.handle, kwallet_keyring.folder_name, 'test_repo', 'test_service']
)
assert password == 'test_password'
@patch('vorta.keyring.kwallet.QInputDialog.getText', return_value=('', False))
def test_get_password_not_found(mock_dialog, kwallet_keyring):
kwallet_keyring.iface.callWithArgumentList.return_value.arguments.return_value = [False]
password = kwallet_keyring.get_password('test_service', 'test_repo')
assert password is None
@patch('vorta.keyring.kwallet.QInputDialog.getText', return_value=('', False))
def test_try_unlock(mock_dialog, kwallet_keyring):
with patch.object(kwallet_keyring, 'get_result') as mock_get_result:
mock_get_result.side_effect = [
'test_wallet', # networkWallet
42, # open (wallet handle)
]
kwallet_keyring.try_unlock()
assert kwallet_keyring.handle == 42
|