Пример #1
0
def test_load_active_delegate_wallets_raises_for_wrong_height():
    manager = WalletManager()

    with pytest.raises(Exception) as excinfo:
        manager.load_active_delegate_wallets(1337)

    assert str(excinfo.value) == "Trying to build delegates outside of round change"
Пример #2
0
def test_update_vote_balances_correctly_for_transaction_type_vote_minus_revert(redis):
    manager = WalletManager()

    transaction = VoteTransaction()
    transaction.fee = 10000
    transaction.amount = 430000
    transaction.type = TRANSACTION_TYPE_VOTE
    transaction.asset = {
        "votes": ["-03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"]
    }

    redis.set(
        "wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW",
        json.dumps(
            {"address": "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW", "vote_balance": 10000000}
        ),
    )

    sender = Wallet(
        {"address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof", "balance": 1337000}
    )

    manager._update_vote_balances(sender, None, transaction, revert=True)

    delegate = json.loads(
        redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW")
    )
    assert delegate["vote_balance"] == 11337000
Пример #3
0
def test_apply_transaction_raises_if_cant_be_applied_to_sender_wallet(redis, mocker):
    manager = WalletManager()

    block = Block()
    transaction = TransferTransaction()
    transaction.type = TRANSACTION_TYPE_TRANSFER
    transaction.fee = 10000
    transaction.amount = 430000
    transaction.id = "hehe"
    transaction.sender_public_key = (
        "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    )
    transaction.recipient_id = "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"

    redis.set(
        "wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
        Wallet(
            {
                "address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
                "public_key": (
                    "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
                ),
                "balance": 5,
            }
        ).to_json(),
    )
    with pytest.raises(Exception) as excinfo:
        manager.apply_transaction(transaction, block)

    assert str(excinfo.value) == (
        "Can't apply transaction hehe from sender AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
    )
Пример #4
0
def test_save_wallet_saves_wallet_to_redis(redis):
    manager = WalletManager()
    wallet = Wallet({"address": "spongebob", "username": "******"})
    manager.save_wallet(wallet)

    keys = redis.keys("*")
    assert keys == [b"wallets:address:spongebob"]
Пример #5
0
def test_load_active_delegate_wallets_raises_for_not_enough_delegates():
    manager = WalletManager()

    with pytest.raises(Exception) as excinfo:
        manager.load_active_delegate_wallets(103)

    assert str(excinfo.value) == "Expected to find 51 delegates but only found 0."
Пример #6
0
def test_apply_block_updates_vote_balance_of_voted_delegate(redis, mocker):
    manager = WalletManager()

    apply_transaction_mock = mocker.patch(
        "chain.plugins.database.wallet_manager.WalletManager.apply_transaction"
    )
    transaction_1 = TransferTransaction()
    transaction_2 = TransferTransaction()

    block = Block()
    block.height = 1337
    block.reward = 2
    block.transactions = [transaction_1, transaction_2]
    block.generator_public_key = (
        "0316510c1409d3307d9f205cac58f1a871499c3ffea3878ddbbb48c821cfbc079a"
    )

    redis.set(
        "wallets:address:AWoysqF1xm1LXYLQvmRDpfVNKzzaLVwPVM",
        json.dumps(
            {
                "address": "AWoysqF1xm1LXYLQvmRDpfVNKzzaLVwPVM",
                "public_key": (
                    "0316b3dc139c1a35927ecbdcb8d8b628ad06bd4f1869fe3ad0e23c8106678a460f"
                ),
                "vote_balance": 2000000,
            }
        ),
    )

    redis.set(
        "wallets:address:ASt5oBHKDW8AeJe2Ybc1RucMLS7mRCiuRe",
        Wallet(
            {
                "address": "ASt5oBHKDW8AeJe2Ybc1RucMLS7mRCiuRe",
                "public_key": (
                    "0316510c1409d3307d9f205cac58f1a871499c3ffea3878ddbbb48c821cfbc079a"
                ),
                "balance": 0,
                "vote": (
                    "0316b3dc139c1a35927ecbdcb8d8b628ad06bd4f1869fe3ad0e23c8106678a460f"
                ),
            }
        ).to_json(),
    )

    manager.apply_block(block)

    assert apply_transaction_mock.call_count == 2
    delegate = Wallet(
        json.loads(redis.get("wallets:address:ASt5oBHKDW8AeJe2Ybc1RucMLS7mRCiuRe"))
    )
    assert delegate.balance == 2

    vote_wallet = Wallet(
        json.loads(redis.get("wallets:address:AWoysqF1xm1LXYLQvmRDpfVNKzzaLVwPVM"))
    )
    assert vote_wallet.vote_balance == 2000002
Пример #7
0
def test_is_delegate_returns_true_if_is_delegate(redis):
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    manager = WalletManager()

    redis.set(
        "wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
        json.dumps({"username": "******"}),
    )
    redis.set("wallets:username:test", "")
    assert manager.is_delegate(public_key) is True
Пример #8
0
def test_find_by_address_returns_a_new_wallet_if_does_not_exist(redis):
    address = "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"

    manager = WalletManager()
    wallet = manager.find_by_address(address)

    assert wallet.address == address
    assert wallet.public_key is None

    keys = redis.keys("*")
    assert keys == []
Пример #9
0
def test_apply_transaction_force_apply_skips_can_be_applied_check(redis, mocker):
    manager = WalletManager()

    balances_mock = mocker.patch(
        "chain.plugins.database.wallet_manager.WalletManager._update_vote_balances"
    )

    mocker.patch(
        "chain.plugins.database.wallet_manager.is_transaction_exception",
        return_value=True,
    )

    block = Block()
    transaction = TransferTransaction()
    transaction.type = TRANSACTION_TYPE_TRANSFER
    transaction.fee = 10000
    transaction.amount = 430000
    transaction.id = "hehe"
    transaction.sender_public_key = (
        "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    )
    transaction.recipient_id = "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"

    redis.set(
        "wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
        Wallet(
            {
                "address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
                "public_key": (
                    "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
                ),
                "balance": 0,
            }
        ).to_json(),
    )

    manager.apply_transaction(transaction, block)

    # updated sender wallet is saved back to redis
    sender = Wallet(
        json.loads(redis.get("wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"))
    )
    assert sender.balance == -440000

    # updated recipient wallet is saved back to redis
    recipient = Wallet(
        json.loads(redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"))
    )
    assert recipient.balance == 430000

    balances_mock.assert_called_once()
Пример #10
0
def test_find_by_public_key_returns_a_new_wallet_if_does_not_exist(redis):
    address = "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
    key = "wallets:address:{}".format(address).encode()
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"

    manager = WalletManager()
    wallet = manager.find_by_public_key(public_key)

    assert wallet.address == address
    assert wallet.public_key == public_key

    # find_by_public_key saves the wallet as it adds public_key to it
    keys = redis.keys("*")
    assert keys == [key]
Пример #11
0
def test_find_by_address_returns_existing_wallet(redis):
    address = "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
    key = "wallets:address:{}".format(address).encode()
    manager = WalletManager()

    redis.set(key, Wallet({"address": address, "username": "******"}).to_json())

    wallet = manager.find_by_address(address)

    assert wallet.address == address
    assert wallet.username == "spongebob"

    keys = redis.keys("*")
    assert keys == [key]
Пример #12
0
def test_get_wallet_by_address_returns_correct_wallet(redis):
    manager = WalletManager()

    redis.set(
        "wallets:address:spongebob",
        Wallet({"address": "spongebob", "username": "******"}).to_json(),
    )
    redis.set(
        "wallets:address:patrick",
        Wallet({"address": "patrick", "username": "******"}).to_json(),
    )

    wallet = manager._get_wallet_by_address("spongebob")
    assert wallet.address == "spongebob"
    assert wallet.username == "squarepants"
Пример #13
0
def test_find_by_public_key_returns_existing_wallet(redis):
    address = "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    key = "wallets:address:{}".format(address).encode()
    manager = WalletManager()

    redis.set(key, Wallet({"address": address, "public_key": public_key}).to_json())

    wallet = manager.find_by_public_key(public_key)

    assert wallet.address == address
    assert wallet.public_key == public_key

    keys = redis.keys("*")
    assert keys == [key]
Пример #14
0
def test_build_delegate(empty_db, redis):
    manager = WalletManager()
    block = BlockFactory(
        total_fee=10,
        reward=2,
        total_amount=12,
        generator_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    BlockFactory(
        total_fee=333,
        reward=666,
        total_amount=999,
        generator_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_DELEGATE_REGISTRATION,
        asset={"delegate": {"username": "******"}},
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    manager._build_delegates()

    data = json.loads(redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"))
    assert data["address"] == "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"
    assert data["username"] == "spongebob"
    assert data["forged_fees"] == 343
    assert data["forged_rewards"] == 668
    assert data["produced_blocks"] == 2
Пример #15
0
def test_apply_transaction_raises_if_voted_delegate_doesnt_exist():
    """
    Should raise exception if delegate already exists
    """
    manager = WalletManager()
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    block = Block()
    transaction = TransferTransaction()
    transaction.type = TRANSACTION_TYPE_VOTE
    transaction.id = "hehe"
    transaction.asset["votes"] = ["+{}".format(public_key)]

    with pytest.raises(Exception) as excinfo:
        manager.apply_transaction(transaction, block)

    assert str(
        excinfo.value
    ) == "Can't apply transaction hehe: delegate {} does not exist".format(public_key)
Пример #16
0
def test_build_second_signatures(empty_db, redis):
    block = BlockFactory()

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_SECOND_SIGNATURE,
        asset={
            "signature": {
                "publicKey": (
                    "120f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a334"
                )
            }
        },
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        amount=13000,
        fee=3000,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    manager = WalletManager()
    manager._build_second_signatures()

    data = json.loads(redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"))

    assert data["address"] == "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"
    assert (
        data["public_key"]
        == "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
    )
    assert (
        data["second_public_key"]
        == "120f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a334"
    )
Пример #17
0
def test_apply_block_raises_if_not_genesis_and_no_delegate(redis):
    manager = WalletManager()

    transaction_1 = TransferTransaction()
    transaction_2 = TransferTransaction()

    block = Block()
    block.height = 1337
    block.reward = 2
    block.transactions = [transaction_1, transaction_2]
    block.generator_public_key = (
        "0316510c1409d3307d9f205cac58f1a871499c3ffea3878ddbbb48c821cfbc079a"
    )

    with pytest.raises(Exception) as excinfo:
        manager.apply_block(block)

    assert str(excinfo.value) == (
        "Could not find a delegate with public key: "
        "0316510c1409d3307d9f205cac58f1a871499c3ffea3878ddbbb48c821cfbc079a"
    )
Пример #18
0
def test_apply(redis, mocker):
    transaction = DelegateRegistrationTransaction()
    manager = WalletManager()
    sender_wallet = Wallet({
        "address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
        "username": "******"
    })
    transaction.apply(sender_wallet, None, manager)

    data = redis.get("wallets:username:harambe")

    assert data == b"AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
Пример #19
0
def test_apply(redis, mocker):
    transaction = TransferTransaction()
    transaction.recipient_id = "DB4gFuDztmdGALMb8i1U4Z4R5SktxpNTAY"
    manager = WalletManager()
    recipient = Wallet({"address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"})
    apply_mock = mocker.patch.object(transaction, "apply_to_recipient_wallet")

    transaction.apply(None, recipient, manager)

    data = json.loads(
        redis.get("wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"))
    assert data["address"] == recipient.address
    assert apply_mock.call_count == 1
Пример #20
0
def test_build_multi_signatures(empty_db, redis):
    manager = WalletManager()
    block = BlockFactory()
    multisig = {
        "multisignature": {
            "min": 2,
            "lifetime": 72,
            "keysgroup": [
                "034a7aca6841cfbdc688f09d55345f21c7ffbd1844693fa68d607fc94f729cbbea",
                "02fd6743ddfdc7c5bac24145e449c2e4f2d569b5297dd7bf088c3bc219f582a2f0",
            ],
        }
    }
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_MULTI_SIGNATURE,
        asset=multisig,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    manager._build_multi_signatures()

    data = json.loads(redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"))
    assert data["address"] == "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"
    assert (
        data["public_key"]
        == "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
    )
    assert data["multisignature"] == multisig["multisignature"]
Пример #21
0
def test_apply_block_correctly_handles_genesis_block(redis, mocker):
    manager = WalletManager()

    apply_transaction_mock = mocker.patch(
        "chain.plugins.database.wallet_manager.WalletManager.apply_transaction"
    )
    transaction_1 = TransferTransaction()
    transaction_2 = TransferTransaction()

    block = Block()
    block.height = 1
    block.reward = 2
    block.transactions = [transaction_1, transaction_2]
    block.generator_public_key = (
        "0316510c1409d3307d9f205cac58f1a871499c3ffea3878ddbbb48c821cfbc079a"
    )
    manager.apply_block(block)

    assert apply_transaction_mock.call_count == 2
    delegate = Wallet(
        json.loads(redis.get("wallets:address:ASt5oBHKDW8AeJe2Ybc1RucMLS7mRCiuRe"))
    )
    assert delegate.balance == 2
Пример #22
0
def test_apply_transaction_raises_if_delegate_already_exists_for_delegate_reg(redis):
    """
    Should raise exception if delegate already exists
    """
    manager = WalletManager()

    block = Block()
    transaction = TransferTransaction()
    transaction.type = TRANSACTION_TYPE_DELEGATE_REGISTRATION
    transaction.id = "hehe"
    transaction.asset["delegate"] = {"username": "******"}

    manager = WalletManager()

    redis.set("wallets:username:harambe", "")

    with pytest.raises(Exception) as excinfo:
        manager.apply_transaction(transaction, block)

    assert "Can't apply transaction hehe: delegate name harambe already taken" == str(
        excinfo.value
    )
Пример #23
0
def test_build_sent_transactions(empty_db, redis):
    block = BlockFactory()

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        amount=5000,
        fee=1000,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        amount=2000,
        fee=4500,
        sender_public_key=(
            "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
        ),
    )
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        amount=13000,
        fee=1300,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_DELEGATE_REGISTRATION,
        amount=13000,
        fee=3000,
        sender_public_key=(
            "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
        ),
    )

    manager = WalletManager()
    manager._build_sent_transactions()

    keys = redis.keys("*")

    key_1 = b"wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
    key_2 = b"wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"
    assert sorted(keys) == sorted([key_1, key_2])

    # TODO: They need to have a negative wallet balance as they've spent this money
    # and in the build code we substract this from their total balance.
    wallet_1 = json.loads(redis.get(key_1))
    assert wallet_1 == {
        "address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
        "public_key": (
            "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
        ),
        "second_public_key": None,
        "multisignature": None,
        "vote": None,
        "username": None,
        "balance": -22500,
        "vote_balance": 0,
        "produced_blocks": 0,
        "missed_blocks": 0,
        "forged_fees": 0,
        "forged_rewards": 0,
    }

    wallet_2 = json.loads(redis.get(key_2))
    assert wallet_2 == {
        "address": "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW",
        "public_key": (
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
        "second_public_key": None,
        "multisignature": None,
        "vote": None,
        "username": None,
        "balance": -20300,
        "vote_balance": 0,
        "produced_blocks": 0,
        "missed_blocks": 0,
        "forged_fees": 0,
        "forged_rewards": 0,
    }
Пример #24
0
def test_update_vote_balances_correctly_for_transaction_revert(redis):
    manager = WalletManager()

    transaction = TransferTransaction()
    transaction.fee = 10000
    transaction.amount = 430000
    transaction.type = TRANSACTION_TYPE_TRANSFER

    redis.set(
        "wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW",
        json.dumps(
            {
                "address": "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW",
                "public_key": (
                    "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
                ),
                "vote_balance": 10000000,
            }
        ),
    )
    redis.set(
        "wallets:address:AWoysqF1xm1LXYLQvmRDpfVNKzzaLVwPVM",
        json.dumps(
            {
                "address": "AWoysqF1xm1LXYLQvmRDpfVNKzzaLVwPVM",
                "public_key": (
                    "0316b3dc139c1a35927ecbdcb8d8b628ad06bd4f1869fe3ad0e23c8106678a460f"
                ),
                "vote_balance": 2000000,
            }
        ),
    )

    sender = Wallet(
        {
            "address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
            "public_key": (
                "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
            ),
            "balance": 1337000,
            "vote": (
                "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
            ),
        }
    )

    recipient = Wallet(
        {
            "address": "ASt5oBHKDW8AeJe2Ybc1RucMLS7mRCiuRe",
            "public_key": (
                "0316510c1409d3307d9f205cac58f1a871499c3ffea3878ddbbb48c821cfbc079a"
            ),
            "balance": 66000,
            "vote": (
                "0316b3dc139c1a35927ecbdcb8d8b628ad06bd4f1869fe3ad0e23c8106678a460f"
            ),
        }
    )

    manager._update_vote_balances(sender, recipient, transaction, revert=True)

    delegate1 = json.loads(
        redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW")
    )
    assert delegate1["vote_balance"] == 10440000

    delegate2 = json.loads(
        redis.get("wallets:address:AWoysqF1xm1LXYLQvmRDpfVNKzzaLVwPVM")
    )
    assert delegate2["vote_balance"] == 1570000
Пример #25
0
def test_build_votes(empty_db, redis):
    manager = WalletManager()
    block = BlockFactory()

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_VOTE,
        asset={
            "votes": [
                "+03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
            ]
        },
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )
    redis.set(
        "wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW",
        Wallet(
            {
                "address": "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW",
                "public_key": (
                    "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
                ),
                "username": "******",
                "vote_balance": 1,
                "balance": 4,
            }
        ).to_json(),
    )

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_VOTE,
        asset={
            "votes": [
                "+022eedf9f1cdae0cfaae635fe415b6a8f1912bc89bc3880ec41135d62cbbebd3d3"
            ]
        },
        sender_public_key=(
            "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
        ),
        timestamp=1234,
        sequence=1,
    )
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_VOTE,
        asset={
            "votes": [
                "+022eedf9f1cdae0cfaae635fe415b6a8f1912bc89bc3880ec41135d62cbbebd3d3"
            ]
        },
        sender_public_key=(
            "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
        ),
        timestamp=1234,
        sequence=2,
    )
    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_VOTE,
        asset={
            "votes": [
                "+03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
            ]
        },
        sender_public_key=(
            "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
        ),
        timestamp=1234,
        sequence=0,
    )
    redis.set(
        "wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
        Wallet(
            {
                "address": "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof",
                "public_key": (
                    "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
                ),
                "balance": 1000,
            }
        ).to_json(),
    )

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_VOTE,
        asset={
            "votes": [
                "-03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
            ]
        },
        sender_public_key=(
            "022eedf9f1cdae0cfaae635fe415b6a8f1912bc89bc3880ec41135d62cbbebd3d3"
        ),
    )
    redis.set(
        "wallets:address:AcHFimRcEinGcJ1gBD3QAXKcFe8ZwNBkN7",
        Wallet(
            {
                "address": "AcHFimRcEinGcJ1gBD3QAXKcFe8ZwNBkN7",
                "public_key": (
                    "022eedf9f1cdae0cfaae635fe415b6a8f1912bc89bc3880ec41135d62cbbebd3d3"
                ),
                "balance": 1337,
            }
        ).to_json(),
    )

    TransactionFactory(
        block_id=block.id,
        type=TRANSACTION_TYPE_TRANSFER,
        amount=13000,
        fee=3000,
        sender_public_key=(
            "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
        ),
    )

    manager._build_votes()

    data_1 = json.loads(redis.get("wallets:address:AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"))
    assert data_1["address"] == "AZYnpgXS3x43nxqhT4q29sZScRwZeNKLpW"
    assert (
        data_1["vote"]
        == "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
    )
    assert data_1["vote_balance"] == 1005
    assert data_1["balance"] == 4

    data_2 = json.loads(redis.get("wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"))
    assert data_2["address"] == "AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"
    assert (
        data_2["vote"]
        == "03b12f99375c3b0e4f5f5c7ea74e723f0b84a6f169b47d9105ed2a179f30c82df2"
    )
    assert data_2["balance"] == 1000

    data_3 = json.loads(redis.get("wallets:address:AcHFimRcEinGcJ1gBD3QAXKcFe8ZwNBkN7"))
    assert data_3["address"] == "AcHFimRcEinGcJ1gBD3QAXKcFe8ZwNBkN7"
    assert data_3["vote"] is None
    assert data_3["balance"] == 1337
Пример #26
0
def test_find_by_address_raises_value_error_if_address_is_not_str(redis):
    address = b"AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof"

    manager = WalletManager()
    with pytest.raises(ValueError):
        manager.find_by_address(address)
Пример #27
0
def test_exists_returns_true_if_exists(redis):
    manager = WalletManager()
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"

    redis.set("wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof", "")
    assert manager.exists(public_key) is True
Пример #28
0
def test_is_delegate_returns_false_if_not_a_delegate(redis):
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    manager = WalletManager()

    redis.set("wallets:address:AThM5PNSKdU9pu1ydqQnzRWVeNCGr8HKof", json.dumps({}))
    assert manager.is_delegate(public_key) is False
Пример #29
0
def test_delegate_exists_returns_true_if_exists(redis):
    manager = WalletManager()

    redis.set("wallets:username:test", "")
    assert manager.delegate_exists("test") is True
Пример #30
0
def test_delegate_exists_returns_false_if_does_not_exist(redis):
    public_key = "020f5df4d2bc736d12ce43af5b1663885a893fade7ee5e62b3cc59315a63e6a325"
    manager = WalletManager()
    assert manager.delegate_exists(public_key) is False