|
2 | 2 | from unittest.mock import patch
|
3 | 3 |
|
4 | 4 | import pytest
|
| 5 | +from django.db import connection |
5 | 6 |
|
6 | 7 | from node.blockchain.facade import BlockchainFacade
|
| 8 | +from node.blockchain.inner_models import NodeDeclarationBlockMessage |
7 | 9 | from node.blockchain.models import Block, PendingBlock
|
8 | 10 | from node.blockchain.tests.factories.block import make_block
|
9 | 11 | from node.blockchain.tests.factories.block_message.node_declaration import make_node_declaration_block_message
|
@@ -109,3 +111,31 @@ def test_create_pending_block(regular_node, regular_node_key_pair, primary_valid
|
109 | 111 | pending_block = PendingBlock.objects.get_or_none(number=block.get_block_number(), hash=block.make_hash())
|
110 | 112 | assert pending_block
|
111 | 113 | assert pending_block.body == payload
|
| 114 | + |
| 115 | + |
| 116 | +@pytest.mark.usefixtures('rich_blockchain') |
| 117 | +def test_try_to_create_outdated_block(regular_node, regular_node_key_pair, primary_validator_key_pair, api_client): |
| 118 | + assert not PendingBlock.objects.exists() |
| 119 | + |
| 120 | + facade = BlockchainFacade.get_instance() |
| 121 | + block_message = make_node_declaration_block_message(regular_node, regular_node_key_pair, facade) |
| 122 | + block_message_dict = block_message.dict() |
| 123 | + block_message_dict['number'] = facade.get_next_block_number() - 1 |
| 124 | + block_message = NodeDeclarationBlockMessage.parse_obj(block_message_dict) |
| 125 | + |
| 126 | + assert facade.get_primary_validator().identifier == primary_validator_key_pair.public |
| 127 | + block = make_block(block_message, primary_validator_key_pair.private) |
| 128 | + |
| 129 | + payload = block.json() |
| 130 | + with patch('node.blockchain.views.block.start_process_pending_blocks_task') as mock: |
| 131 | + response = api_client.post('/api/blocks/', payload, content_type='application/json') |
| 132 | + |
| 133 | + assert response.status_code == 400 |
| 134 | + assert response.json() == {'message': [{'code': 'invalid', 'message': 'Invalid number'}]} |
| 135 | + mock.assert_not_called() |
| 136 | + |
| 137 | + # This is because we have queried the database and nested transactions (save points) are not supported |
| 138 | + assert connection.needs_rollback |
| 139 | + connection.set_rollback(False) |
| 140 | + |
| 141 | + assert not PendingBlock.objects.exists() |
0 commit comments