From 6498992f613f1bb0bb3d17148799721c2db5b361 Mon Sep 17 00:00:00 2001 From: jMyles Date: Mon, 24 Aug 2020 09:42:15 -0700 Subject: [PATCH] Deduplicating test; moving json validation utils to utils. --- .../control/test_rpc_control_blockchain.py | 68 +++++++++++----- .../control/test_rpc_control_federated.py | 81 ------------------- .../control/test_rpc_control_federated.py | 7 +- tests/utils/controllers.py | 22 ++++- 4 files changed, 73 insertions(+), 105 deletions(-) delete mode 100644 tests/acceptance/characters/control/test_rpc_control_federated.py diff --git a/tests/acceptance/characters/control/test_rpc_control_blockchain.py b/tests/acceptance/characters/control/test_rpc_control_blockchain.py index ec24d3b6f..1c3b72045 100644 --- a/tests/acceptance/characters/control/test_rpc_control_blockchain.py +++ b/tests/acceptance/characters/control/test_rpc_control_blockchain.py @@ -16,37 +16,61 @@ """ 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 -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.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 - 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 - ) + 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 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 +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_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): diff --git a/tests/acceptance/characters/control/test_rpc_control_federated.py b/tests/acceptance/characters/control/test_rpc_control_federated.py deleted file mode 100644 index 576da201c..000000000 --- a/tests/acceptance/characters/control/test_rpc_control_federated.py +++ /dev/null @@ -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 . -""" - -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) diff --git a/tests/integration/characters/control/test_rpc_control_federated.py b/tests/integration/characters/control/test_rpc_control_federated.py index ab9175cee..710d0e374 100644 --- a/tests/integration/characters/control/test_rpc_control_federated.py +++ b/tests/integration/characters/control/test_rpc_control_federated.py @@ -17,6 +17,9 @@ 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): 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 request_data = {'method': method_name, 'params': params} 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) diff --git a/tests/utils/controllers.py b/tests/utils/controllers.py index 2f39cff4c..2cec6bb09 100644 --- a/tests/utils/controllers.py +++ b/tests/utils/controllers.py @@ -16,13 +16,33 @@ """ import json - from io import StringIO from typing import Union 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: """A mock RPC response object"""