Add tests/test_crypto.py (22 tests) and tests/test_single_wallet.py (46 tests) for previously uncovered modules; extend existing test files with WIF format checks, error/validation cases, BIP39 passphrase, account index, words_num, and redeem script structure tests
109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
from src.p2pkh import generate_legacy_address
|
|
|
|
SECRETSCAN_URL = "https://secretscan.org/Bitcoin?address={}"
|
|
|
|
NETWORKS = ['mainnet', 'testnet', 'regtest']
|
|
|
|
|
|
def test_p2pkh_fields():
|
|
result = generate_legacy_address('mainnet')
|
|
assert set(result.keys()) == {'network', 'script_type', 'private_key_hex', 'private_key_wif', 'public_key_hex', 'address'}
|
|
|
|
|
|
def test_p2pkh_script_type():
|
|
result = generate_legacy_address('mainnet')
|
|
assert result['script_type'] == 'p2pkh'
|
|
|
|
|
|
def test_p2pkh_address_mainnet():
|
|
result = generate_legacy_address('mainnet')
|
|
assert result['address'].startswith('1')
|
|
|
|
|
|
def test_p2pkh_address_testnet():
|
|
result = generate_legacy_address('testnet')
|
|
assert result['address'][0] in ('m', 'n')
|
|
|
|
|
|
def test_p2pkh_address_regtest():
|
|
result = generate_legacy_address('regtest')
|
|
assert result['address'][0] in ('m', 'n')
|
|
|
|
|
|
def test_p2pkh_private_key_length():
|
|
result = generate_legacy_address('mainnet')
|
|
assert len(result['private_key_hex']) == 64
|
|
|
|
|
|
def test_p2pkh_compressed_pubkey():
|
|
result = generate_legacy_address('mainnet', compressed=True)
|
|
assert len(result['public_key_hex']) == 66
|
|
assert result['public_key_hex'][:2] in ('02', '03')
|
|
|
|
|
|
def test_p2pkh_uncompressed_pubkey():
|
|
result = generate_legacy_address('mainnet', compressed=False)
|
|
assert len(result['public_key_hex']) == 130
|
|
assert result['public_key_hex'][:2] == '04'
|
|
|
|
|
|
def test_p2pkh_unique_addresses():
|
|
r1 = generate_legacy_address('mainnet')
|
|
r2 = generate_legacy_address('mainnet')
|
|
assert r1['address'] != r2['address']
|
|
|
|
|
|
def test_p2pkh_print_secretscan(capsys):
|
|
result = generate_legacy_address('mainnet')
|
|
url = SECRETSCAN_URL.format(result['address'])
|
|
print(f"\n[P2PKH] Address: {result['address']}")
|
|
print(f"[P2PKH] Verify on SecretScan: {url}")
|
|
captured = capsys.readouterr()
|
|
assert 'secretscan.org' in captured.out
|
|
|
|
|
|
# --- WIF format validation ---
|
|
|
|
def test_p2pkh_wif_mainnet_compressed_starts_k_or_l():
|
|
result = generate_legacy_address('mainnet', compressed=True)
|
|
assert result['private_key_wif'][0] in ('K', 'L')
|
|
|
|
|
|
def test_p2pkh_wif_mainnet_uncompressed_starts_5():
|
|
result = generate_legacy_address('mainnet', compressed=False)
|
|
assert result['private_key_wif'][0] == '5'
|
|
|
|
|
|
def test_p2pkh_wif_testnet_compressed_starts_c():
|
|
result = generate_legacy_address('testnet', compressed=True)
|
|
assert result['private_key_wif'][0] == 'c'
|
|
|
|
|
|
def test_p2pkh_wif_testnet_uncompressed_starts_9():
|
|
result = generate_legacy_address('testnet', compressed=False)
|
|
assert result['private_key_wif'][0] == '9'
|
|
|
|
|
|
# --- Error cases ---
|
|
|
|
def test_p2pkh_invalid_network_raises():
|
|
import pytest
|
|
with pytest.raises(ValueError):
|
|
generate_legacy_address('invalid_net')
|
|
|
|
|
|
# --- Address format for uncompressed keys ---
|
|
|
|
def test_p2pkh_uncompressed_address_mainnet_starts_1():
|
|
result = generate_legacy_address('mainnet', compressed=False)
|
|
assert result['address'].startswith('1')
|
|
|
|
|
|
def test_p2pkh_uncompressed_address_testnet():
|
|
result = generate_legacy_address('testnet', compressed=False)
|
|
assert result['address'][0] in ('m', 'n')
|