def test_account_add_block_not_block( self, account_factory, pocketable_block_factory): account = Account(**ACCOUNT_KWARGS) link_block = pocketable_block_factory( account_id=ACCOUNT_ID, amount=1000) with pytest.raises(TypeError) as exc: account.add_block(link_block) assert "Argument has to be a Block instance" in str(exc.value)
def test_account_add_block_different_account( self, account_factory): account = Account(**ACCOUNT_KWARGS) block = account_factory(balance=1000).blocks[0] with pytest.raises(InvalidAccountBlock) as exc: account.add_block(block) assert "The block doesn't belong to this account's blockchain" \ in str(exc.value)
def test_account_legacy_send_balance(self): """ Test that balance is calculated correctly for legacy send blocks """ account = Account( account_id="xrb_1jeqoxg7cpo5xgyxhcwzsndeuqp6yyr9m63k8tfu9mskjdfo7iq95p1ktb8j", source=AccountSource.WATCHING, representative="xrb_3dmtrrws3pocycmbqwawk6xs7446qxa36fcncush4s1pejk16ksbmakis78m" ) account.add_block( Block( block_data={ "account": "xrb_1jeqoxg7cpo5xgyxhcwzsndeuqp6yyr9m63k8tfu9mskjdfo7iq95p1ktb8j", "type": "open", "representative": "xrb_3dmtrrws3pocycmbqwawk6xs7446qxa36fcncush4s1pejk16ksbmakis78m", "source": "01BB6121002B428124BB0C546B3195F36108D30F8E664DC60777F3B4102A705F", "work": "e847031ddf0c4cef", "signature": "E23FA05FC070E176195A4860EC2E73966AE040A91B6F972B5843B31879BBBD32EF0D0186FF9EC2EF1714274FF45B7FF715FDF99BB3ED4571AD8798A28BAF1B0E", }, link_block=LinkBlock( block_data={ "account": "xrb_1uz6t43ztbffhft3zonpwf4hrjd9gorg53j8ac48ijppo6t4kj1px9jnimwj", "destination": "xrb_1jeqoxg7cpo5xgyxhcwzsndeuqp6yyr9m63k8tfu9mskjdfo7iq95p1ktb8j", "type": "send", "previous": "D04DEDF65FE1A99AA6759285512A6DE6708961443538C80CA588B032017497D6", "work": "547ac17fc277bd4c", "signature": "60C7D5546289179A480477BBEB62CB9BE8ABDD6B52DA4FC95D3BB28D0C88922D1D9022537626D835E67A407C8CDDFE376DE2C46EE4F04F1FEE88D2AABEAA6D09", "balance": "00018CE88D23D425E48205A276400000" }, amount=1000000000000000000000000000 ) ) ) account.add_block( Block( block_data={ "account": "xrb_1jeqoxg7cpo5xgyxhcwzsndeuqp6yyr9m63k8tfu9mskjdfo7iq95p1ktb8j", "destination": "xrb_384jppoodym71cppdj3a9gaim197q9uq365u5jqt6c4zhth13t9as4sj5zs8", "type": "send", "previous": "2453CA428DE7BCA437CDCBCD587646B4E508701E78E5B364F1DF5CF3A80B9F24", "work": "6692fe717be16f9c", "signature": "11E5BFB1304CD12D6960403B98778F76A6023FFFF30174DD21304EE757BD264E8F87FC6649E916BC9DFA861ACB94631C5E388C6ABF412C08891F9818C6CA1B09", "balance": "00000000033A5A7A8401B34F47000000" } ) ) assert account.balance == 999000000000000000000000000 assert account.blocks[1].balance == 999000000000000000000000000 assert account.blocks[1].amount == -1000000000000000000000000
def test_account_add_block_first_non_open(self, pocketable_block_factory): """ Try adding a non-open block as the first block to an account """ account = Account(**ACCOUNT_KWARGS) for _ in range(0, 2): account.receive_block( pocketable_block_factory(account_id=ACCOUNT_ID, amount=1000) ) block_b = account.blocks[1] # Recreate account account = Account(**ACCOUNT_KWARGS) with pytest.raises(InvalidAccountBlock) as exc: account.add_block(block_b) assert "First block for an account has to be an 'open' block" in str(exc.value)
def test_account_complete_blockchain(self): """ Complete account's blockchain one block at a time and check the account's balance after each block """ from tests.wallet.data.account_blocks import ACCOUNTS for account_entry in ACCOUNTS: block_entries = account_entry["blocks"] account_id = account_entry["account_id"] account = Account( account_id=account_id, source=AccountSource.WATCHING ) assert account.balance == 0 for entry in block_entries: block_data = entry["block_data"] link_block_entry = entry.get("link_block", None) link_block = None if link_block_entry: link_block = LinkBlock( block_data=link_block_entry["block_data"], amount=int(link_block_entry["amount"]) ) block = Block( block_data=block_data, link_block=link_block ) account.add_block(block) assert account.balance == int(entry["balance"]) assert account.blocks[-1].balance == int(entry["balance"]) assert account.blocks[-1].tx_type == entry["tx_type"] assert account.blocks[-1].amount == int(entry["amount"])
def test_account_legacy_block_disallowed_after_state( self, pocketable_block_factory, legacy_receive_block_factory): """ Add a state block and then try adding a legacy receive block """ account = Account(**ACCOUNT_KWARGS) account.receive_block( pocketable_block_factory(account_id=ACCOUNT_ID, amount=10000) ) with pytest.raises(InvalidAccountBlock) as exc: # Once a state block is added to a chain, only state blocks are # allowed account.add_block( legacy_receive_block_factory( prev_block=account.blocks[0], private_key=PRIVATE_KEY, amount=20000 ) ) assert "State block can't be followed by a legacy block" in str(exc.value)
def test_account_add_block_wrong_order(self, pocketable_block_factory): """ Try adding blocks to an account in wrong order """ account = Account(**ACCOUNT_KWARGS) for _ in range(0, 3): account.receive_block( pocketable_block_factory(account_id=ACCOUNT_ID, amount=1000) ) block_a = account.blocks[0] block_c = account.blocks[2] # Recreate account account = Account(**ACCOUNT_KWARGS) account.add_block(block_a) # Block added in wrong order with pytest.raises(InvalidAccountBlock) as exc: account.add_block(block_c) assert "isn't a successor to the current head" in str(exc.value)