mirror of https://github.com/nucypher/nucypher.git
Deduplicating test; moving json validation utils to utils.
parent
59bcbcf70d
commit
6498992f61
|
@ -16,37 +16,61 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
from nucypher.policy.collections import TreasureMap, DecentralizedTreasureMap
|
|
||||||
from nucypher.crypto.powers import DecryptingPower, SigningPower
|
|
||||||
from nucypher.characters.lawful import Ursula
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from nucypher.characters.control.interfaces import AliceInterface, BobInterface, EnricoInterface
|
from nucypher.characters.control.interfaces import AliceInterface
|
||||||
|
from nucypher.characters.control.interfaces import BobInterface, EnricoInterface
|
||||||
from nucypher.crypto.powers import DecryptingPower, SigningPower
|
from nucypher.crypto.powers import DecryptingPower, SigningPower
|
||||||
from nucypher.policy.collections import TreasureMap
|
from nucypher.policy.collections import DecentralizedTreasureMap
|
||||||
|
from tests.utils.controllers import get_fields, validate_json_rpc_response_data
|
||||||
|
|
||||||
|
|
||||||
def get_fields(interface, method_name):
|
def test_bob_rpc_character_control_join_policy(bob_rpc_controller, join_control_request, enacted_blockchain_policy):
|
||||||
|
# Simulate passing in a teacher-uri
|
||||||
|
enacted_blockchain_policy.bob.remember_node(list(enacted_blockchain_policy.accepted_ursulas)[0])
|
||||||
|
|
||||||
spec = getattr(interface, method_name)._schema
|
method_name, params = join_control_request
|
||||||
input_fields = [k for k, f in spec.load_fields.items() if f.required]
|
request_data = {'method': method_name, 'params': params}
|
||||||
optional_fields = [k for k, f in spec.load_fields.items() if not f.required]
|
response = bob_rpc_controller.send(request_data)
|
||||||
required_output_fileds = list(spec.dump_fields.keys())
|
assert validate_json_rpc_response_data(response=response,
|
||||||
|
method_name=method_name,
|
||||||
return (
|
interface=BobInterface)
|
||||||
input_fields,
|
|
||||||
optional_fields,
|
|
||||||
required_output_fileds
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_json_rpc_response_data(response, method_name, interface):
|
def test_enrico_rpc_character_control_encrypt_message(enrico_rpc_controller_test_client, encrypt_control_request):
|
||||||
required_output_fields = get_fields(interface, method_name)[-1]
|
method_name, params = encrypt_control_request
|
||||||
assert 'jsonrpc' in response.data
|
request_data = {'method': method_name, 'params': params}
|
||||||
for output_field in required_output_fields:
|
response = enrico_rpc_controller_test_client.send(request_data)
|
||||||
assert output_field in response.content
|
assert validate_json_rpc_response_data(response=response,
|
||||||
return True
|
method_name=method_name,
|
||||||
|
interface=EnricoInterface)
|
||||||
|
|
||||||
|
|
||||||
|
def test_bob_rpc_character_control_retrieve_with_tmap(
|
||||||
|
enacted_blockchain_policy, blockchain_bob, blockchain_alice,
|
||||||
|
bob_rpc_controller, retrieve_control_request):
|
||||||
|
tmap_64 = b64encode(bytes(enacted_blockchain_policy.treasure_map)).decode()
|
||||||
|
method_name, params = retrieve_control_request
|
||||||
|
params['treasure_map'] = tmap_64
|
||||||
|
request_data = {'method': method_name, 'params': params}
|
||||||
|
response = bob_rpc_controller.send(request_data)
|
||||||
|
assert response.data['result']['cleartexts'][0] == 'Welcome to flippering number 1.'
|
||||||
|
|
||||||
|
# Make a wrong (empty) treasure map
|
||||||
|
|
||||||
|
wrong_tmap = DecentralizedTreasureMap(m=0)
|
||||||
|
wrong_tmap.prepare_for_publication(
|
||||||
|
blockchain_bob.public_keys(DecryptingPower),
|
||||||
|
blockchain_bob.public_keys(SigningPower),
|
||||||
|
blockchain_alice.stamp,
|
||||||
|
b'Wrong!')
|
||||||
|
wrong_tmap._blockchain_signature = b"this is not a signature, but we don't need one for this test....." # ...because it only matters when Ursula looks at it.
|
||||||
|
tmap_bytes = bytes(wrong_tmap)
|
||||||
|
tmap_64 = b64encode(tmap_bytes).decode()
|
||||||
|
request_data['params']['treasure_map'] = tmap_64
|
||||||
|
with pytest.raises(DecentralizedTreasureMap.IsDisorienting):
|
||||||
|
bob_rpc_controller.send(request_data)
|
||||||
|
|
||||||
|
|
||||||
def test_alice_rpc_character_control_create_policy(alice_rpc_test_client, create_policy_control_request):
|
def test_alice_rpc_character_control_create_policy(alice_rpc_test_client, create_policy_control_request):
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
"""
|
|
||||||
This file is part of nucypher.
|
|
||||||
|
|
||||||
nucypher is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
nucypher is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with nucypher. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from base64 import b64encode
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
|
|
||||||
from nucypher.characters.control.interfaces import BobInterface, EnricoInterface
|
|
||||||
from nucypher.crypto.powers import DecryptingPower, SigningPower
|
|
||||||
from nucypher.policy.collections import DecentralizedTreasureMap
|
|
||||||
from tests.acceptance.characters.control.test_rpc_control_blockchain import validate_json_rpc_response_data
|
|
||||||
|
|
||||||
|
|
||||||
def test_bob_rpc_character_control_join_policy(bob_rpc_controller, join_control_request, enacted_blockchain_policy):
|
|
||||||
# Simulate passing in a teacher-uri
|
|
||||||
enacted_blockchain_policy.bob.remember_node(list(enacted_blockchain_policy.accepted_ursulas)[0])
|
|
||||||
|
|
||||||
method_name, params = join_control_request
|
|
||||||
request_data = {'method': method_name, 'params': params}
|
|
||||||
response = bob_rpc_controller.send(request_data)
|
|
||||||
assert validate_json_rpc_response_data(response=response,
|
|
||||||
method_name=method_name,
|
|
||||||
interface=BobInterface)
|
|
||||||
|
|
||||||
|
|
||||||
def test_enrico_rpc_character_control_encrypt_message(enrico_rpc_controller_test_client, encrypt_control_request):
|
|
||||||
method_name, params = encrypt_control_request
|
|
||||||
request_data = {'method': method_name, 'params': params}
|
|
||||||
response = enrico_rpc_controller_test_client.send(request_data)
|
|
||||||
assert validate_json_rpc_response_data(response=response,
|
|
||||||
method_name=method_name,
|
|
||||||
interface=EnricoInterface)
|
|
||||||
|
|
||||||
|
|
||||||
def test_bob_rpc_character_control_retrieve(bob_rpc_controller, retrieve_control_request):
|
|
||||||
method_name, params = retrieve_control_request
|
|
||||||
request_data = {'method': method_name, 'params': params}
|
|
||||||
response = bob_rpc_controller.send(request_data)
|
|
||||||
assert validate_json_rpc_response_data(response=response,
|
|
||||||
method_name=method_name,
|
|
||||||
interface=BobInterface)
|
|
||||||
|
|
||||||
|
|
||||||
def test_bob_rpc_character_control_retrieve_with_tmap(
|
|
||||||
enacted_blockchain_policy, blockchain_bob, blockchain_alice,
|
|
||||||
bob_rpc_controller, retrieve_control_request):
|
|
||||||
tmap_64 = b64encode(bytes(enacted_blockchain_policy.treasure_map)).decode()
|
|
||||||
method_name, params = retrieve_control_request
|
|
||||||
params['treasure_map'] = tmap_64
|
|
||||||
request_data = {'method': method_name, 'params': params}
|
|
||||||
response = bob_rpc_controller.send(request_data)
|
|
||||||
assert response.data['result']['cleartexts'][0] == 'Welcome to flippering number 1.'
|
|
||||||
|
|
||||||
# Make a wrong (empty) treasure map
|
|
||||||
|
|
||||||
wrong_tmap = DecentralizedTreasureMap(m=0)
|
|
||||||
wrong_tmap.prepare_for_publication(
|
|
||||||
blockchain_bob.public_keys(DecryptingPower),
|
|
||||||
blockchain_bob.public_keys(SigningPower),
|
|
||||||
blockchain_alice.stamp,
|
|
||||||
b'Wrong!')
|
|
||||||
wrong_tmap._blockchain_signature = b"this is not a signature, but we don't need one for this test....." # ...because it only matters when Ursula looks at it.
|
|
||||||
tmap_bytes = bytes(wrong_tmap)
|
|
||||||
tmap_64 = b64encode(tmap_bytes).decode()
|
|
||||||
request_data['params']['treasure_map'] = tmap_64
|
|
||||||
with pytest.raises(DecentralizedTreasureMap.IsDisorienting):
|
|
||||||
bob_rpc_controller.send(request_data)
|
|
|
@ -17,6 +17,9 @@
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from nucypher.characters.control.interfaces import BobInterface
|
||||||
|
from tests.utils.controllers import validate_json_rpc_response_data
|
||||||
|
|
||||||
|
|
||||||
def test_alice_rpc_character_control_create_policy(alice_rpc_test_client, create_policy_control_request):
|
def test_alice_rpc_character_control_create_policy(alice_rpc_test_client, create_policy_control_request):
|
||||||
alice_rpc_test_client.__class__.MESSAGE_ID = 0
|
alice_rpc_test_client.__class__.MESSAGE_ID = 0
|
||||||
|
@ -91,4 +94,6 @@ def test_bob_rpc_character_control_retrieve(bob_rpc_controller, retrieve_control
|
||||||
method_name, params = retrieve_control_request
|
method_name, params = retrieve_control_request
|
||||||
request_data = {'method': method_name, 'params': params}
|
request_data = {'method': method_name, 'params': params}
|
||||||
response = bob_rpc_controller.send(request_data)
|
response = bob_rpc_controller.send(request_data)
|
||||||
assert 'jsonrpc' in response.data
|
assert validate_json_rpc_response_data(response=response,
|
||||||
|
method_name=method_name,
|
||||||
|
interface=BobInterface)
|
||||||
|
|
|
@ -16,13 +16,33 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
import nucypher
|
import nucypher
|
||||||
|
|
||||||
|
|
||||||
|
def get_fields(interface, method_name):
|
||||||
|
spec = getattr(interface, method_name)._schema
|
||||||
|
input_fields = [k for k, f in spec.load_fields.items() if f.required]
|
||||||
|
optional_fields = [k for k, f in spec.load_fields.items() if not f.required]
|
||||||
|
required_output_fileds = list(spec.dump_fields.keys())
|
||||||
|
|
||||||
|
return (
|
||||||
|
input_fields,
|
||||||
|
optional_fields,
|
||||||
|
required_output_fileds
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_json_rpc_response_data(response, method_name, interface):
|
||||||
|
required_output_fields = get_fields(interface, method_name)[-1]
|
||||||
|
assert 'jsonrpc' in response.data
|
||||||
|
for output_field in required_output_fields:
|
||||||
|
assert output_field in response.content
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class TestRPCResponse:
|
class TestRPCResponse:
|
||||||
"""A mock RPC response object"""
|
"""A mock RPC response object"""
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue