import sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from src.p2pk import generate_p2pk SECRETSCAN_URL = "https://secretscan.org/Bitcoin?address={}" NETWORKS = ['mainnet', 'testnet', 'regtest'] def test_p2pk_fields(): result = generate_p2pk('mainnet', compressed=True) assert set(result.keys()) == {'network', 'script_type', 'private_key_hex', 'private_key_wif', 'public_key_hex'} def test_p2pk_script_type(): result = generate_p2pk('mainnet') assert result['script_type'] == 'p2pk' def test_p2pk_private_key_length(): result = generate_p2pk('mainnet') assert len(result['private_key_hex']) == 64 def test_p2pk_compressed_pubkey_length(): result = generate_p2pk('mainnet', compressed=True) assert len(result['public_key_hex']) == 66 assert result['public_key_hex'][:2] in ('02', '03') def test_p2pk_uncompressed_pubkey_length(): result = generate_p2pk('mainnet', compressed=False) assert len(result['public_key_hex']) == 130 assert result['public_key_hex'][:2] == '04' def test_p2pk_wif_mainnet(): result = generate_p2pk('mainnet', compressed=True) assert result['private_key_wif'][0] in ('K', 'L') def test_p2pk_wif_testnet(): result = generate_p2pk('testnet', compressed=True) assert result['private_key_wif'][0] == 'c' def test_p2pk_all_networks(): for network in NETWORKS: result = generate_p2pk(network) assert result['network'] == network def test_p2pk_unique_keys(): r1 = generate_p2pk('mainnet') r2 = generate_p2pk('mainnet') assert r1['private_key_hex'] != r2['private_key_hex'] def test_p2pk_print_secretscan(capsys): # P2PK has no address — print the public key for manual reference result = generate_p2pk('mainnet') print(f"\n[P2PK] Public key: {result['public_key_hex']}") print(f"[P2PK] SecretScan (search by pubkey): https://secretscan.org/") captured = capsys.readouterr() assert 'secretscan.org' in captured.out # --- Error cases --- def test_p2pk_invalid_network_raises(): import pytest with pytest.raises(ValueError): generate_p2pk('invalid_net') # --- P2PK has no address field --- def test_p2pk_no_address_field(): result = generate_p2pk('mainnet') assert 'address' not in result # --- Regtest WIF same as testnet --- def test_p2pk_wif_regtest_compressed_starts_c(): result = generate_p2pk('regtest', compressed=True) assert result['private_key_wif'][0] == 'c' # --- Uncompressed WIF mainnet starts with 5 --- def test_p2pk_wif_mainnet_uncompressed_starts_5(): result = generate_p2pk('mainnet', compressed=False) assert result['private_key_wif'][0] == '5'