Files
seedPass/src/tests/test_nostr_index_size.py
2025-07-02 12:51:50 -04:00

72 lines
2.7 KiB
Python

import os
import time
from pathlib import Path
from tempfile import TemporaryDirectory
from unittest.mock import patch
import sys
import pytest
from cryptography.fernet import Fernet
sys.path.append(str(Path(__file__).resolve().parents[1]))
from password_manager.encryption import EncryptionManager
from password_manager.entry_management import EntryManager
from password_manager.vault import Vault
from nostr.client import NostrClient, Kind, KindStandard
@pytest.mark.desktop
@pytest.mark.network
def test_nostr_index_size_limits():
"""Manually explore maximum index size for Nostr backups."""
seed = (
"abandon abandon abandon abandon abandon abandon abandon "
"abandon abandon abandon abandon about"
)
results = []
with TemporaryDirectory() as tmpdir:
key = Fernet.generate_key()
enc_mgr = EncryptionManager(key, Path(tmpdir))
with patch.object(enc_mgr, "decrypt_parent_seed", return_value=seed):
client = NostrClient(
enc_mgr,
"size_test_fp",
relays=["wss://relay.snort.social"],
)
npub = client.key_manager.get_npub()
vault = Vault(enc_mgr, tmpdir)
entry_mgr = EntryManager(vault, Path(tmpdir))
sizes = [16, 64, 256, 1024, 2048, 4096, 8192]
delay = float(os.getenv("NOSTR_TEST_DELAY", "5"))
for size in sizes:
try:
entry_mgr.add_entry(
website_name=f"site-{size}",
length=12,
username="u" * size,
url="https://example.com/" + "a" * size,
)
encrypted = vault.get_encrypted_index()
payload_size = len(encrypted) if encrypted else 0
published = client.publish_json_to_nostr(encrypted or b"")
time.sleep(delay)
retrieved = client.retrieve_json_from_nostr_sync()
retrieved_ok = retrieved == encrypted
results.append((size, payload_size, published, retrieved_ok))
if not published or not retrieved_ok:
break
except Exception:
results.append((size, None, False, False))
break
client.close_client_pool()
note_kind = Kind.from_std(KindStandard.TEXT_NOTE).as_u16()
print(f"\nNostr note Kind: {note_kind}")
print(f"Nostr account npub: {npub}")
print("Size | Payload Bytes | Published | Retrieved")
for size, payload, pub, ret in results:
print(f"{size:>4} | {payload:>13} | {pub} | {ret}")