def test_type_checks_enums_in_named_hashes(self): rpc = RpcProcessor() enum = JsonEnumType('PhoneType', 'Type of a phone number') enum.add_value('HOME', 'Home phone') enum.add_value('WORK', 'Work phone') enum.add_value('MOBILE', 'Mobile phone') enum.add_value('FAX', 'FAX number') rpc.add_custom_type(enum) custom_hash = JsonHashType('CustomHash', 'Dummy named hash for testing') custom_hash.add_field('phonetype', 'PhoneType', 'Type of phone number') rpc.add_custom_type(custom_hash) echo_hash_func = RpcFunction(echo_hash, 'echo_hash', 'Returns what it was given', 'hash', 'Same value as the first parameter') echo_hash_func.add_param('CustomHash', 'custom_hash', 'Some custom hash instance') rpc.add_function(echo_hash_func) rpc.enable_named_hash_validation() reply = rpc.process_request('{"method": "echo_hash", "params": [{"phonetype": "TEST"}], "id": 1}') self.assertEqual(reply['result'], None) self.assertEqual(reply['error'], {'name': 'TypeError', 'message': "echo_hash: 'TEST' is not a valid value for parameter 'custom_hash.phonetype' of enum type 'PhoneType'"}) reply = rpc.process_request('{"method": "echo_hash", "params": [{"phonetype": []}], "id": 2}') self.assertEqual(reply['result'], None) self.assertEqual(reply['error'], {'name': 'TypeError', 'message': "echo_hash: Enum parameter 'custom_hash.phonetype' requires a value of type 'int' or 'string' but type was 'array'"}) reply = rpc.process_request('{"method": "echo_hash", "params": [{"phonetype": "HOME"}], "id": 3}') self.assertEqual(reply['error'], None) self.assertEqual(reply['result'], {'phonetype': 'HOME'})
def test_type_checks_enums_in_named_hashes(self): rpc = RpcProcessor() enum = JsonEnumType('PhoneType', 'Type of a phone number') enum.add_value('HOME', 'Home phone') enum.add_value('WORK', 'Work phone') enum.add_value('MOBILE', 'Mobile phone') enum.add_value('FAX', 'FAX number') rpc.add_custom_type(enum) custom_hash = JsonHashType('CustomHash', 'Dummy named hash for testing') custom_hash.add_field('phonetype', 'PhoneType', 'Type of phone number') rpc.add_custom_type(custom_hash) echo_hash_func = RpcFunction(echo_hash, 'echo_hash', 'Returns what it was given', 'hash', 'Same value as the first parameter') echo_hash_func.add_param('CustomHash', 'custom_hash', 'Some custom hash instance') rpc.add_function(echo_hash_func) rpc.enable_named_hash_validation() reply = rpc.process_request( '{"method": "echo_hash", "params": [{"phonetype": "TEST"}], "id": 1}' ) self.assertEqual(reply['result'], None) self.assertEqual( reply['error'], { 'name': 'TypeError', 'message': "echo_hash: 'TEST' is not a valid value for parameter 'custom_hash.phonetype' of enum type 'PhoneType'" }) reply = rpc.process_request( '{"method": "echo_hash", "params": [{"phonetype": []}], "id": 2}') self.assertEqual(reply['result'], None) self.assertEqual( reply['error'], { 'name': 'TypeError', 'message': "echo_hash: Enum parameter 'custom_hash.phonetype' requires a value of type 'int' or 'string' but type was 'array'" }) reply = rpc.process_request( '{"method": "echo_hash", "params": [{"phonetype": "HOME"}], "id": 3}' ) self.assertEqual(reply['error'], None) self.assertEqual(reply['result'], {'phonetype': 'HOME'})
def test_type_checks_for_fields_of_named_hashes(self): rpc = RpcProcessor() custom_type = JsonHashType('CustomHash', 'Dummy named hash for testing') custom_type.add_field('boolfield', 'bool', 'Some bool') custom_type.add_field('stringfield', 'string', 'Some string') custom_type.add_field('intfield', 'int', 'Some integer') custom_type.add_field('floatfield', 'float', 'Some float') custom_type.add_field('arrayfield', 'array', 'City') custom_type.add_field('hashfield', 'hash', 'City') rpc.add_custom_type(custom_type) rpc.enable_named_hash_validation() echo_hash_func = RpcFunction(echo_hash, 'echo_hash', 'Returns what it was given', 'hash', 'Same value as the first parameter') echo_hash_func.add_param('CustomHash', 'custom_hash', 'Some custom hash instance') rpc.add_function(echo_hash_func) # Call with an empty hash should get us an error mentioning the first missing field reply = rpc.process_request('{"method": "echo_hash", "params": [{}], "id": 1}') self.assertEqual(reply['result'], None) self.assertEqual(reply['error'], {'name': 'TypeError', 'message': "echo_hash: Named hash parameter 'custom_hash' of type 'CustomHash': Missing field 'boolfield'" }) # Call with an invalid field should return the corresponding error reply = rpc.process_request('{"method": "echo_hash", "params": [{"boolfield": true, "stringfield": 5, "intfield": 5, "floatfield": 5.5, "arrayfield": [], "hashfield": {}}], "id": 2}') self.assertEqual(reply['result'], None) self.assertEqual(reply['error'], {'name': 'TypeError', 'message': "echo_hash: Expected value of type 'string' for parameter 'custom_hash.stringfield' but got value of type 'int'"}) # Call with a valid hash should return the same hash without error reply = rpc.process_request('{"method": "echo_hash", "params": [{"boolfield": true, "stringfield": "test", "intfield": 5, "floatfield": 5.5, "arrayfield": [], "hashfield": {}}], "id": 3}') self.assertEqual(reply['error'], None) self.assertEqual(reply['result'], {"boolfield": True, "stringfield": "test", "intfield": 5, "floatfield": 5.5, "arrayfield": [], "hashfield": {}})
def test_type_checks_for_fields_of_named_hashes(self): rpc = RpcProcessor() custom_type = JsonHashType('CustomHash', 'Dummy named hash for testing') custom_type.add_field('boolfield', 'bool', 'Some bool') custom_type.add_field('stringfield', 'string', 'Some string') custom_type.add_field('intfield', 'int', 'Some integer') custom_type.add_field('floatfield', 'float', 'Some float') custom_type.add_field('arrayfield', 'array', 'City') custom_type.add_field('hashfield', 'hash', 'City') rpc.add_custom_type(custom_type) rpc.enable_named_hash_validation() echo_hash_func = RpcFunction(echo_hash, 'echo_hash', 'Returns what it was given', 'hash', 'Same value as the first parameter') echo_hash_func.add_param('CustomHash', 'custom_hash', 'Some custom hash instance') rpc.add_function(echo_hash_func) # Call with an empty hash should get us an error mentioning the first missing field reply = rpc.process_request( '{"method": "echo_hash", "params": [{}], "id": 1}') self.assertEqual(reply['result'], None) self.assertEqual( reply['error'], { 'name': 'TypeError', 'message': "echo_hash: Named hash parameter 'custom_hash' of type 'CustomHash': Missing field 'boolfield'" }) # Call with an invalid field should return the corresponding error reply = rpc.process_request( '{"method": "echo_hash", "params": [{"boolfield": true, "stringfield": 5, "intfield": 5, "floatfield": 5.5, "arrayfield": [], "hashfield": {}}], "id": 2}' ) self.assertEqual(reply['result'], None) self.assertEqual( reply['error'], { 'name': 'TypeError', 'message': "echo_hash: Expected value of type 'string' for parameter 'custom_hash.stringfield' but got value of type 'int'" }) # Call with a valid hash should return the same hash without error reply = rpc.process_request( '{"method": "echo_hash", "params": [{"boolfield": true, "stringfield": "test", "intfield": 5, "floatfield": 5.5, "arrayfield": [], "hashfield": {}}], "id": 3}' ) self.assertEqual(reply['error'], None) self.assertEqual( reply['result'], { "boolfield": True, "stringfield": "test", "intfield": 5, "floatfield": 5.5, "arrayfield": [], "hashfield": {} })