def test_generate_conditions_single_owner_with_condition(user_pub):
    from bigchaindb_common.transaction import Condition
    from cryptoconditions import Ed25519Fulfillment

    expected = Ed25519Fulfillment(public_key=user_pub)
    cond = Condition.generate([expected])

    assert cond.fulfillment.to_dict() == expected.to_dict()
def test_generate_conditions_invalid_parameters(user_pub, user2_pub,
                                                user3_pub):
    from bigchaindb_common.transaction import Condition

    with raises(ValueError):
        Condition.generate([])
    with raises(TypeError):
        Condition.generate('not a list')
    with raises(ValueError):
        Condition.generate([[user_pub, [user2_pub, [user3_pub]]]])
    with raises(ValueError):
        Condition.generate([[user_pub]])
def test_generate_conditions_flat_ownage(user_pub, user2_pub, user3_pub):
    from bigchaindb_common.transaction import Condition
    from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment

    expected_simple1 = Ed25519Fulfillment(public_key=user_pub)
    expected_simple2 = Ed25519Fulfillment(public_key=user2_pub)
    expected_simple3 = Ed25519Fulfillment(public_key=user3_pub)

    expected = ThresholdSha256Fulfillment(threshold=3)
    expected.add_subfulfillment(expected_simple1)
    expected.add_subfulfillment(expected_simple2)
    expected.add_subfulfillment(expected_simple3)

    cond = Condition.generate([user_pub, user2_pub, expected_simple3])
    assert cond.fulfillment.to_dict() == expected.to_dict()
def test_generate_conditions_split_half_single_owner(user_pub, user2_pub,
                                                     user3_pub):
    from bigchaindb_common.transaction import Condition
    from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment

    expected_simple1 = Ed25519Fulfillment(public_key=user_pub)
    expected_simple2 = Ed25519Fulfillment(public_key=user2_pub)
    expected_simple3 = Ed25519Fulfillment(public_key=user3_pub)

    expected = ThresholdSha256Fulfillment(threshold=2)
    expected_threshold = ThresholdSha256Fulfillment(threshold=2)
    expected_threshold.add_subfulfillment(expected_simple2)
    expected_threshold.add_subfulfillment(expected_simple3)
    expected.add_subfulfillment(expected_threshold)
    expected.add_subfulfillment(expected_simple1)

    cond = Condition.generate([[expected_simple2, user3_pub], user_pub])
    assert cond.fulfillment.to_dict() == expected.to_dict()
def test_generate_conditions_split_half_recursive_custom_threshold(user_pub,
                                                                   user2_pub,
                                                                   user3_pub):
    from bigchaindb_common.transaction import Condition
    from cryptoconditions import Ed25519Fulfillment, ThresholdSha256Fulfillment

    expected_simple1 = Ed25519Fulfillment(public_key=user_pub)
    expected_simple2 = Ed25519Fulfillment(public_key=user2_pub)
    expected_simple3 = Ed25519Fulfillment(public_key=user3_pub)

    expected = ThresholdSha256Fulfillment(threshold=1)
    expected.add_subfulfillment(expected_simple1)
    expected_threshold = ThresholdSha256Fulfillment(threshold=1)
    expected_threshold.add_subfulfillment(expected_simple2)
    expected_threshold.add_subfulfillment(expected_simple3)
    expected.add_subfulfillment(expected_threshold)

    cond = Condition.generate(([user_pub, ([user2_pub, expected_simple3], 1)],
                              1))
    assert cond.fulfillment.to_dict() == expected.to_dict()
def test_generate_threshold_condition_with_hashlock(user_pub, user2_pub,
                                                    user3_pub):
    from bigchaindb_common.transaction import Condition
    from cryptoconditions import (PreimageSha256Fulfillment,
                                  Ed25519Fulfillment,
                                  ThresholdSha256Fulfillment)

    secret = b'much secret, wow'
    hashlock = PreimageSha256Fulfillment(preimage=secret)

    expected_simple1 = Ed25519Fulfillment(public_key=user_pub)
    expected_simple3 = Ed25519Fulfillment(public_key=user3_pub)

    expected = ThresholdSha256Fulfillment(threshold=2)
    expected_sub = ThresholdSha256Fulfillment(threshold=2)
    expected_sub.add_subfulfillment(expected_simple1)
    expected_sub.add_subfulfillment(hashlock)
    expected.add_subfulfillment(expected_simple3)

    cond = Condition.generate([[user_pub, hashlock], expected_simple3])
    assert cond.fulfillment.to_dict() == expected.to_dict()