Fixed bug regarding replacement of context variable when value is 0.

Added tests for return value test key as it pertains to tuples.
pull/3002/head
derekpierre 2022-11-14 15:50:18 -05:00
parent 6567d4d30e
commit 853fa5406c
2 changed files with 183 additions and 2 deletions

View File

@ -108,7 +108,7 @@ def get_context_value(context_variable: str, **context) -> Any:
# fallback for context variable without directive - assume key,value pair
# handles the case for user customized context variables
value = context.get(context_variable)
if not value:
if value is None:
raise RequiredContextVariable(
f'"No value provided for unrecognized context variable "{context_variable}"'
)

View File

@ -24,12 +24,17 @@ from unittest import mock
import pytest
from web3 import Web3
from nucypher.blockchain.eth.agents import ContractAgency, SubscriptionManagerAgent
from nucypher.blockchain.eth.constants import NULL_ADDRESS
from nucypher.policy.conditions.context import (
USER_ADDRESS_CONTEXT,
_recover_user_address,
)
from nucypher.policy.conditions.evm import RPCCondition, get_context_value
from nucypher.policy.conditions.evm import (
ContractCondition,
RPCCondition,
get_context_value,
)
from nucypher.policy.conditions.exceptions import (
ContextVariableVerificationFailed,
InvalidContextVariableData,
@ -378,6 +383,182 @@ def test_subscription_manager_get_policy_policy_struct_condition_evaluation(
assert condition_result is True # zeroized policy was indeed returned
def test_subscription_manager_get_policy_policy_struct_condition_key_tuple_evaluation(
testerchain,
agency,
test_registry,
idle_blockchain_policy,
enacted_blockchain_policy,
condition_providers,
):
# enacted policy created from idle policy
size = len(idle_blockchain_policy.kfrags)
start = idle_blockchain_policy.commencement
end = idle_blockchain_policy.expiration
sponsor = idle_blockchain_policy.publisher.checksum_address
context = {
":hrac": bytes(enacted_blockchain_policy.hrac),
} # user-defined context vars
subscription_manager = ContractAgency.get_agent(
SubscriptionManagerAgent, registry=test_registry
)
# test "sponsor" key (owner is the same as sponsor for this policy)
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="==", value=sponsor, key=0),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert condition_result
# test "sponsor" key not equal to correct value
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="!=", value=sponsor, key=0),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert not condition_result
# test "start" key
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="==", value=start, key=1),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert condition_result
# test "start" key not equal to correct value
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="!=", value=start, key=1),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert not condition_result
# test "end" key
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="==", value=end, key=2),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert condition_result
# test "size" key
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="==", value=size, key=3),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert condition_result
# test "owner" key (owner is sponsor, so owner is set to null address)
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(comparator="==", value=NULL_ADDRESS, key=4),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert condition_result
def test_subscription_manager_get_policy_policy_struct_condition_key_context_var_evaluation(
testerchain,
agency,
test_registry,
idle_blockchain_policy,
enacted_blockchain_policy,
condition_providers,
):
# enacted policy created from idle policy
sponsor = idle_blockchain_policy.publisher.checksum_address
context = {
":hrac": bytes(enacted_blockchain_policy.hrac),
":sponsor": sponsor,
":sponsorIndex": 0,
} # user-defined context vars
subscription_manager = ContractAgency.get_agent(
SubscriptionManagerAgent, registry=test_registry
)
# test "sponsor" key (owner is the same as sponsor for this policy)
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(
comparator="==",
value=sponsor, # don't use sponsor context var
key=":sponsorIndex",
),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert condition_result
# test "sponsor" key not equal to correct value
condition = ContractCondition(
contract_address=subscription_manager.contract.address,
function_abi=subscription_manager.contract.get_function_by_name(
"getPolicy"
).abi,
method="getPolicy",
chain=TESTERCHAIN_CHAIN_ID,
return_value_test=ReturnValueTest(
comparator="!=",
value=":sponsor", # use sponsor sponsor context var
key=":sponsorIndex",
),
parameters=[":hrac"],
)
condition_result, _ = condition.verify(providers=condition_providers, **context)
assert not condition_result
def test_time_condition_evaluation(testerchain, timelock_condition, condition_providers):
condition_result, call_result = timelock_condition.verify(
providers=condition_providers