Skip to content

Commit f5ffd2d

Browse files
authored
Merge pull request #192 from thenewboston-developers/BC-272-add-block-to-blockchain-once-it-gets-enough-confirmations
Unittest submitting block confirmation with invalid signature
2 parents 8966b25 + 3bee90e commit f5ffd2d

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

node/blockchain/tests/test_rest_api/test_block_confirmation.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import json
2+
13
import pytest
4+
from django.db import connection
25

36
from node.blockchain.facade import BlockchainFacade
47
from node.blockchain.inner_models.block_confirmation import BlockConfirmation
@@ -25,3 +28,30 @@ def test_send_confirmation_to_cv(confirmation_validator_key_pair_2, api_client):
2528
assert confirmation_orm
2629
assert confirmation_orm.signer == confirmation_validator_key_pair_2.public
2730
assert confirmation_orm.body == payload
31+
32+
33+
@pytest.mark.usefixtures('rich_blockchain', 'as_confirmation_validator')
34+
def test_confirmation_with_invalid_signature_is_not_accepted(confirmation_validator_key_pair_2, api_client):
35+
assert not ORMBlockConfirmation.objects.exists()
36+
37+
facade = BlockchainFacade.get_instance()
38+
assert facade.get_next_block_number() >= 4
39+
block = facade.get_block_by_number(4)
40+
41+
hash_ = block.make_hash()
42+
block_confirmation = BlockConfirmation.create(
43+
block.get_block_number(), hash_, confirmation_validator_key_pair_2.private
44+
)
45+
payload_dict = block_confirmation.dict()
46+
payload_dict['signature'] = '0' * 128
47+
payload = json.dumps(payload_dict)
48+
response = api_client.post('/api/block-confirmations/', payload, content_type='application/json')
49+
50+
assert response.status_code == 400
51+
assert response.json() == {'non_field_errors': [{'code': 'invalid', 'message': 'Invalid signature'}]}
52+
53+
# This is because we have queried the database and nested transactions (save points) are not supported
54+
assert connection.needs_rollback
55+
connection.set_rollback(False)
56+
57+
assert not ORMBlockConfirmation.objects.exists()

node/core/custom_djongo/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def _close(self):
6868
super()._close()
6969

7070
def _rollback(self):
71+
logger.debug('Rolling back...')
7172
if self.is_autocommit:
7273
self.on_rollback_callables.clear()
7374
return
@@ -80,6 +81,7 @@ def _rollback(self):
8081
on_rollback_callables.popleft()()
8182

8283
def _commit(self):
84+
logger.debug('Committing...')
8385
if self.is_autocommit:
8486
self.on_rollback_callables.clear()
8587
return

0 commit comments

Comments
 (0)