Skip to content

Commit d5ee9a3

Browse files
committed
NodeClient.send_block_confirmation()
1 parent 948f139 commit d5ee9a3

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

node/core/clients/node.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import requests
88

9-
from node.blockchain.inner_models import AccountState, Block, Node, SignedChangeRequest
9+
from node.blockchain.inner_models import AccountState, Block, BlockConfirmation, Node, SignedChangeRequest
1010
from node.blockchain.types import AccountNumber
1111

1212
logger = logging.getLogger(__name__)
@@ -194,6 +194,11 @@ def send_block(self, /, address: str, block: Union[Block, str]):
194194
logger.debug('Sending %s to %s', block, address)
195195
return self.http_post(address, 'blocks', data=block.json() if isinstance(block, Block) else block)
196196

197+
@with_node
198+
def send_block_confirmation(self, /, address: str, block_confirmation: BlockConfirmation):
199+
logger.debug('Sending %s to %s', block_confirmation, address)
200+
return self.http_post(address, 'block-confirmations', data=block_confirmation.json())
201+
197202
def yield_nodes(self, /, address: str) -> Generator[Node, None, None]:
198203
for item in self.yield_resource(address, 'nodes', by_limit=LIST_NODES_LIMIT):
199204
yield Node.parse_obj(item)

node/core/tests/test_node_client.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
from requests.exceptions import HTTPError
66

77
from node.blockchain.facade import BlockchainFacade
8-
from node.blockchain.inner_models import Block
8+
from node.blockchain.inner_models import Block, BlockConfirmation
99
from node.blockchain.inner_models import Node as InnerNode
1010
from node.blockchain.models import Block as ORMBlock
11+
from node.blockchain.models import BlockConfirmation as ORMBlockConfirmation
1112
from node.blockchain.models import Node as ORMNode
1213
from node.blockchain.models import PendingBlock
1314
from node.blockchain.tests.factories.block import make_block
@@ -114,6 +115,28 @@ def test_send_block_to_address_integration(
114115
PendingBlock.objects.all().delete()
115116

116117

118+
@pytest.mark.usefixtures('rich_blockchain', 'as_confirmation_validator')
119+
def test_send_confirmation_to_cv(test_server_address, confirmation_validator_key_pair_2, smart_mocked_node_client):
120+
assert not ORMBlockConfirmation.objects.exists()
121+
122+
facade = BlockchainFacade.get_instance()
123+
assert facade.get_next_block_number() >= 4
124+
block = facade.get_block_by_number(4)
125+
126+
hash_ = block.make_hash()
127+
block_confirmation = BlockConfirmation.create(
128+
block.get_block_number(), hash_, confirmation_validator_key_pair_2.private
129+
)
130+
payload = block_confirmation.json()
131+
response = smart_mocked_node_client.send_block_confirmation(test_server_address, block_confirmation)
132+
133+
assert response.status_code == 201
134+
confirmation_orm = ORMBlockConfirmation.objects.get_or_none(number=block_confirmation.get_number(), hash=hash_)
135+
assert confirmation_orm
136+
assert confirmation_orm.signer == confirmation_validator_key_pair_2.public
137+
assert confirmation_orm.body == payload
138+
139+
117140
@pytest.mark.django_db
118141
@pytest.mark.usefixtures('rich_blockchain')
119142
@pytest.mark.parametrize('block_identifier, block_number', (

0 commit comments

Comments
 (0)