Skip to content

Commit e0db6e2

Browse files
authored
chore: Increase test coverage for transactions (#119)
1 parent e3c15c0 commit e0db6e2

11 files changed

Lines changed: 303 additions & 4 deletions

tests/configuration/test_network.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from crypto.configuration.network import get_network, set_custom_network, set_network
44
from crypto.networks.devnet import Devnet
55
from crypto.networks.mainnet import Mainnet
6+
from crypto.networks.testnet import Testnet
67

78

89
def test_get_network():
@@ -11,9 +12,16 @@ def test_get_network():
1112

1213

1314
def test_set_network():
15+
# test main net
1416
set_network(Mainnet)
1517
result = get_network()
1618
assert result['version'] == 23
19+
assert result['wif'] == 170
20+
# test test net
21+
set_network(Testnet)
22+
result = get_network()
23+
assert result['version'] == 23
24+
assert result['wif'] == 186
1725
set_network(Devnet) # set back to devnet so other tests don't fail
1826

1927

tests/transactions/builder/test_delegate_registration.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,28 @@ def test_delegate_registration_transaction():
2323
assert transaction_dict['type'] is TRANSACTION_DELEGATE_REGISTRATION
2424
assert transaction_dict['typeGroup'] == 1
2525
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
26+
assert transaction_dict['fee'] == 2500000000
27+
28+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
29+
30+
31+
def test_delegate_registration_transaction_custom_fee():
32+
"""Test if a delegate registration transaction gets built with a custom fee
33+
"""
34+
delegate_name = 'mr.delegate'
35+
36+
transaction = DelegateRegistration(delegate_name, 5)
37+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
38+
transaction.set_nonce(1)
39+
transaction.schnorr_sign('testing')
40+
transaction_dict = transaction.to_dict()
41+
42+
assert transaction_dict['nonce'] == 1
43+
assert transaction_dict['signature']
44+
assert transaction_dict['asset']['delegate']['username'] == delegate_name
45+
assert transaction_dict['type'] is TRANSACTION_DELEGATE_REGISTRATION
46+
assert transaction_dict['typeGroup'] == 1
47+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
48+
assert transaction_dict['fee'] == 5
2649

2750
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid

tests/transactions/builder/test_delegate_resignation.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,25 @@ def test_delegate_resignation_transaction():
2020
assert transaction_dict['type'] is TRANSACTION_DELEGATE_RESIGNATION
2121
assert transaction_dict['typeGroup'] == 1
2222
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
23+
assert transaction_dict['fee'] == 2500000000
24+
25+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
26+
27+
28+
def test_delegate_resignation_transaction_custom_fee():
29+
"""Test if delegate resignation transaction gets built with a custom fee
30+
"""
31+
transaction = DelegateResignation(5)
32+
transaction.set_nonce(1)
33+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
34+
transaction.schnorr_sign('testing')
35+
transaction_dict = transaction.to_dict()
36+
37+
assert transaction_dict['nonce'] == 1
38+
assert transaction_dict['signature']
39+
assert transaction_dict['type'] is TRANSACTION_DELEGATE_RESIGNATION
40+
assert transaction_dict['typeGroup'] == 1
41+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
42+
assert transaction_dict['fee'] == 5
2343

2444
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid

tests/transactions/builder/test_htlc_claim.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,33 @@ def test_htlc_claim_transaction():
2525
assert transaction_dict['type'] is TRANSACTION_HTLC_CLAIM
2626
assert transaction_dict['typeGroup'] == 1
2727
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
28+
assert transaction_dict['fee'] == 0
29+
assert transaction_dict['asset']['claim']['lockTransactionId'] == '943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4'
30+
assert transaction_dict['asset']['claim']['unlockSecret'] == 'my secret that should be 32bytes'
31+
32+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
33+
34+
35+
def test_htlc_claim_transaction_custom_fee():
36+
"""Test if timelock transaction gets built with a custom fee
37+
"""
38+
lock_transaction_id = '943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4'
39+
40+
# This should be the hashed secret used for HTLC Lock transaction
41+
unlock_secret = 'my secret that should be 32bytes'
42+
43+
transaction = HtlcClaim(lock_transaction_id, unlock_secret, 5)
44+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
45+
transaction.set_nonce(1)
46+
transaction.schnorr_sign('testing')
47+
transaction_dict = transaction.to_dict()
48+
49+
assert transaction_dict['nonce'] == 1
50+
assert transaction_dict['signature']
51+
assert transaction_dict['type'] is TRANSACTION_HTLC_CLAIM
52+
assert transaction_dict['typeGroup'] == 1
53+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
54+
assert transaction_dict['fee'] == 5
2855
assert transaction_dict['asset']['claim']['lockTransactionId'] == '943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4'
2956
assert transaction_dict['asset']['claim']['unlockSecret'] == 'my secret that should be 32bytes'
3057

tests/transactions/builder/test_htlc_lock.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import pytest
2+
13
from crypto.configuration.network import set_network
24
from crypto.constants import TRANSACTION_HTLC_LOCK, TRANSACTION_TYPE_GROUP
35
from crypto.networks.devnet import Devnet
46
from crypto.transactions.builder.htlc_lock import HtlcLock
5-
import pytest
67

78
set_network(Devnet)
89

@@ -69,6 +70,39 @@ def test_htlc_lock_transaction():
6970
assert transaction_dict['type'] is TRANSACTION_HTLC_LOCK
7071
assert transaction_dict['typeGroup'] == 1
7172
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
73+
assert transaction_dict['fee'] == 10000000
74+
assert transaction_dict['asset']['lock']['secretHash'] == '0f128d401958b1b30ad0d10406f47f9489321017b4614e6cb993fc63913c5454'
75+
assert transaction_dict['asset']['lock']['expiration']['type'] == 1
76+
assert transaction_dict['asset']['lock']['expiration']['value'] == 1573455822
77+
78+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
79+
80+
81+
def test_htlc_lock_transaction_custom_fee():
82+
"""Test if timelock transaction gets built with a custom fee
83+
"""
84+
transaction = HtlcLock(
85+
recipient_id='AGeYmgbg2LgGxRW2vNNJvQ88PknEJsYizC',
86+
amount=200000000,
87+
secret_hash='0f128d401958b1b30ad0d10406f47f9489321017b4614e6cb993fc63913c5454',
88+
expiration_type=1,
89+
expiration_value=1573455822,
90+
fee=5
91+
)
92+
93+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
94+
transaction.set_nonce(1)
95+
transaction.schnorr_sign('testing')
96+
transaction_dict = transaction.to_dict()
97+
98+
assert transaction_dict['recipientId'] == 'AGeYmgbg2LgGxRW2vNNJvQ88PknEJsYizC'
99+
assert transaction_dict['amount'] == 200000000
100+
assert transaction_dict['nonce'] == 1
101+
assert transaction_dict['signature']
102+
assert transaction_dict['type'] is TRANSACTION_HTLC_LOCK
103+
assert transaction_dict['typeGroup'] == 1
104+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
105+
assert transaction_dict['fee'] == 5
72106
assert transaction_dict['asset']['lock']['secretHash'] == '0f128d401958b1b30ad0d10406f47f9489321017b4614e6cb993fc63913c5454'
73107
assert transaction_dict['asset']['lock']['expiration']['type'] == 1
74108
assert transaction_dict['asset']['lock']['expiration']['value'] == 1573455822

tests/transactions/builder/test_htlc_refund.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,31 @@ def test_timelock_refund_transaction():
2323
assert transaction_dict['type'] is TRANSACTION_HTLC_REFUND
2424
assert transaction_dict['typeGroup'] == 1
2525
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
26+
assert transaction_dict['fee'] == 0
27+
assert transaction_dict['asset']['refund']['lockTransactionId'] == '943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4'
28+
29+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
30+
31+
32+
def test_timelock_refund_transaction_custom_fee():
33+
"""Test if timelock transaction gets built with custom fee
34+
"""
35+
transaction = HtlcRefund(
36+
lock_transaction_id='943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4',
37+
fee=5
38+
)
39+
40+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
41+
transaction.set_nonce(1)
42+
transaction.schnorr_sign('testing')
43+
transaction_dict = transaction.to_dict()
44+
45+
assert transaction_dict['nonce'] == 1
46+
assert transaction_dict['signature']
47+
assert transaction_dict['type'] is TRANSACTION_HTLC_REFUND
48+
assert transaction_dict['typeGroup'] == 1
49+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
50+
assert transaction_dict['fee'] == 5
2651
assert transaction_dict['asset']['refund']['lockTransactionId'] == '943c220691e711c39c79d437ce185748a0018940e1a4144293af9d05627d2eb4'
2752

2853
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid

tests/transactions/builder/test_ipfs.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,29 @@ def test_ipfs_transaction():
2424
assert transaction_dict['type'] is TRANSACTION_IPFS
2525
assert transaction_dict['typeGroup'] == 1
2626
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
27+
assert transaction_dict['fee'] == 500000000
28+
assert transaction_dict['asset']['ipfs'] == ipfs_id
29+
30+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
31+
32+
33+
def test_ipfs_transaction_custom_fee():
34+
"""Test if ipfs transaction gets built with custom fee
35+
"""
36+
ipfs_id = b58encode('hello')
37+
38+
transaction = IPFS(ipfs_id, 5)
39+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
40+
transaction.set_nonce(1)
41+
transaction.schnorr_sign('testing')
42+
transaction_dict = transaction.to_dict()
43+
44+
assert transaction_dict['nonce'] == 1
45+
assert transaction_dict['signature']
46+
assert transaction_dict['type'] is TRANSACTION_IPFS
47+
assert transaction_dict['typeGroup'] == 1
48+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
49+
assert transaction_dict['fee'] == 5
2750
assert transaction_dict['asset']['ipfs'] == ipfs_id
2851

2952
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid

tests/transactions/builder/test_multi_payment.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,32 @@ def test_multi_payment_transaction():
2222
assert transaction_dict['type'] is TRANSACTION_MULTI_PAYMENT
2323
assert transaction_dict['typeGroup'] == 1
2424
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
25+
assert transaction_dict['fee'] == 10000000
26+
assert transaction_dict['asset']['payments'][0]['amount'] == 1
27+
assert transaction_dict['asset']['payments'][0]['recipientId'] == 'AHXtmB84sTZ9Zd35h9Y1vfFvPE2Xzqj8ri'
28+
assert transaction_dict['asset']['payments'][1]['amount'] == 2
29+
assert transaction_dict['asset']['payments'][1]['recipientId'] == 'ATK14wxyYxbELq2b91bAfBY8Vmh9J6MDej'
30+
31+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
32+
33+
34+
def test_multi_payment_transaction_custom_fee():
35+
"""Test if multi payment transaction gets built with a custom fee
36+
"""
37+
transaction = MultiPayment(fee=5)
38+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
39+
transaction.set_nonce(1)
40+
transaction.add_payment(1, 'AHXtmB84sTZ9Zd35h9Y1vfFvPE2Xzqj8ri')
41+
transaction.add_payment(2, 'ATK14wxyYxbELq2b91bAfBY8Vmh9J6MDej')
42+
transaction.schnorr_sign('testing')
43+
transaction_dict = transaction.to_dict()
44+
45+
assert transaction_dict['nonce'] == 1
46+
assert transaction_dict['signature']
47+
assert transaction_dict['type'] is TRANSACTION_MULTI_PAYMENT
48+
assert transaction_dict['typeGroup'] == 1
49+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
50+
assert transaction_dict['fee'] == 5
2551
assert transaction_dict['asset']['payments'][0]['amount'] == 1
2652
assert transaction_dict['asset']['payments'][0]['recipientId'] == 'AHXtmB84sTZ9Zd35h9Y1vfFvPE2Xzqj8ri'
2753
assert transaction_dict['asset']['payments'][1]['amount'] == 2

tests/transactions/builder/test_second_signature_registration.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,25 @@ def test_second_signature_registration_transaction():
2020
assert transaction_dict['type'] is TRANSACTION_SECOND_SIGNATURE_REGISTRATION
2121
assert transaction_dict['typeGroup'] == 1
2222
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
23+
assert transaction_dict['fee'] == 500000000
24+
25+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
26+
27+
28+
def test_second_signature_registration_transaction_custom_fee():
29+
"""Test if a second signature registration transaction gets built with a custom fee
30+
"""
31+
transaction = SecondSignatureRegistration('this is a top secret passphrase', 5)
32+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
33+
transaction.set_nonce(1)
34+
transaction.schnorr_sign('testing')
35+
transaction_dict = transaction.to_dict()
36+
37+
assert transaction_dict['nonce'] == 1
38+
assert transaction_dict['signature']
39+
assert transaction_dict['type'] is TRANSACTION_SECOND_SIGNATURE_REGISTRATION
40+
assert transaction_dict['typeGroup'] == 1
41+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
42+
assert transaction_dict['fee'] == 5
2343

2444
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid

tests/transactions/builder/test_transfer.py

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import pytest
2+
13
from crypto.configuration.network import set_network
24
from crypto.constants import TRANSACTION_TRANSFER, TRANSACTION_TYPE_GROUP
35
from crypto.identity.public_key import PublicKey
46
from crypto.networks.devnet import Devnet
57
from crypto.transactions.builder.transfer import Transfer
68

9+
710
set_network(Devnet)
811

912

@@ -24,6 +27,53 @@ def test_transfer_transaction():
2427
assert transaction_dict['type'] is TRANSACTION_TRANSFER
2528
assert transaction_dict['typeGroup'] == 1
2629
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
30+
assert transaction_dict['fee'] == 10000000
31+
32+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
33+
34+
35+
def test_transfer_transaction_update_amount():
36+
"""Test if a transfer transaction can update an amount
37+
"""
38+
transaction = Transfer(
39+
recipientId='AGeYmgbg2LgGxRW2vNNJvQ88PknEJsYizC',
40+
amount=200000000
41+
)
42+
transaction.set_amount(10)
43+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
44+
transaction.set_nonce(1)
45+
transaction.schnorr_sign('this is a top secret passphrase')
46+
transaction_dict = transaction.to_dict()
47+
48+
assert transaction_dict['nonce'] == 1
49+
assert transaction_dict['signature']
50+
assert transaction_dict['type'] is TRANSACTION_TRANSFER
51+
assert transaction_dict['typeGroup'] == 1
52+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
53+
assert transaction_dict['amount'] == 10
54+
55+
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
56+
57+
58+
def test_transfer_transaction_custom_fee():
59+
"""Test if a transfer transaction gets built with a custom fee
60+
"""
61+
transaction = Transfer(
62+
recipientId='AGeYmgbg2LgGxRW2vNNJvQ88PknEJsYizC',
63+
amount=200000000,
64+
fee=5
65+
)
66+
transaction.set_type_group(TRANSACTION_TYPE_GROUP.CORE)
67+
transaction.set_nonce(1)
68+
transaction.schnorr_sign('this is a top secret passphrase')
69+
transaction_dict = transaction.to_dict()
70+
71+
assert transaction_dict['nonce'] == 1
72+
assert transaction_dict['signature']
73+
assert transaction_dict['type'] is TRANSACTION_TRANSFER
74+
assert transaction_dict['typeGroup'] == 1
75+
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
76+
assert transaction_dict['fee'] == 5
2777

2878
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
2979

@@ -49,9 +99,9 @@ def test_transfer_secondsig_transaction():
4999
assert transaction_dict['typeGroup'] == TRANSACTION_TYPE_GROUP.CORE.value
50100

51101
transaction.schnorr_verify() # if no exception is raised, it means the transaction is valid
52-
transaction.schnorr_verify_second(PublicKey.from_passphrase('second top secret passphrase')) # if no exception is raised, it means the transaction is valid
53-
54-
102+
transaction.schnorr_verify_second(PublicKey.from_passphrase('second top secret passphrase')) # if no exception is raised, it means the transaction is valid
103+
104+
55105
def test_parse_signatures(transaction_type_0):
56106
"""Test if parse signature works when parsing serialized data
57107
"""
@@ -62,3 +112,23 @@ def test_parse_signatures(transaction_type_0):
62112
assert transfer.transaction.signature is None
63113
transfer.transaction.parse_signatures(transaction_type_0['serialized'], 166)
64114
assert transfer.transaction.signature
115+
116+
117+
def test_transfer_transaction_amount_not_int():
118+
with pytest.raises(ValueError):
119+
"""Test error handling in constructor for non-integer amount
120+
"""
121+
Transfer(
122+
recipientId='AGeYmgbg2LgGxRW2vNNJvQ88PknEJsYizC',
123+
amount='bad amount'
124+
)
125+
126+
127+
def test_transfer_transaction_amount_zero():
128+
with pytest.raises(ValueError):
129+
"""Test error handling in constructor for non-integer amount
130+
"""
131+
Transfer(
132+
recipientId='AGeYmgbg2LgGxRW2vNNJvQ88PknEJsYizC',
133+
amount=0
134+
)

0 commit comments

Comments
 (0)