PSA abstraction layer with provider pattern, ConnectWise integration (connection management, ticket linking, note posting, status updates, member mapping), Integrations page UI, Fernet credential encryption, in-memory TTL cache, 6 DB migrations, ConnectWise API reference docs.
45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
"""Tests for PSA credential encryption/decryption."""
|
|
import pytest
|
|
from app.services.psa.encryption import encrypt_credentials, decrypt_credentials
|
|
|
|
|
|
class TestCredentialEncryption:
|
|
def test_round_trip(self):
|
|
"""Encrypt then decrypt returns original credentials."""
|
|
creds = {
|
|
"public_key": "abc123",
|
|
"private_key": "secret456",
|
|
"client_id": "my-client-id",
|
|
}
|
|
encrypted = encrypt_credentials(creds)
|
|
|
|
# Encrypted should be a non-empty string, different from input
|
|
assert isinstance(encrypted, str)
|
|
assert len(encrypted) > 0
|
|
assert "secret456" not in encrypted
|
|
|
|
decrypted = decrypt_credentials(encrypted)
|
|
assert decrypted == creds
|
|
|
|
def test_different_inputs_produce_different_outputs(self):
|
|
creds1 = {"public_key": "key1", "private_key": "priv1", "client_id": "cid1"}
|
|
creds2 = {"public_key": "key2", "private_key": "priv2", "client_id": "cid2"}
|
|
|
|
enc1 = encrypt_credentials(creds1)
|
|
enc2 = encrypt_credentials(creds2)
|
|
assert enc1 != enc2
|
|
|
|
def test_tampered_ciphertext_raises(self):
|
|
creds = {"public_key": "k", "private_key": "p", "client_id": "c"}
|
|
encrypted = encrypt_credentials(creds)
|
|
tampered = encrypted[:-5] + "XXXXX"
|
|
with pytest.raises(Exception):
|
|
decrypt_credentials(tampered)
|
|
|
|
def test_mask_private_key(self):
|
|
from app.services.psa.encryption import mask_credential
|
|
assert mask_credential("abcdefghij") == "\u2022\u2022\u2022\u2022\u2022\u2022ghij"
|
|
assert mask_credential("abc") == "\u2022\u2022\u2022\u2022\u2022\u2022abc"
|
|
assert mask_credential("") == "\u2022\u2022\u2022\u2022\u2022\u2022"
|
|
assert mask_credential(None) == "\u2022\u2022\u2022\u2022\u2022\u2022"
|