mirror of https://github.com/nucypher/nucypher.git
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
parent
6567d4d30e
commit
853fa5406c
|
@ -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}"'
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue