Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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)
Esempio n. 5
0
    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"])
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)