def test_valid_map(): tmap = TMap(key_type=TI32(), value_type=TString()) assert tmap.validate_arg({}) is None assert tmap.validate_arg({3: "dog", 4: "cat"}) is None nested_tmap = TMap(key_type=TI32(), value_type=TMap(key_type=TString(), value_type=TI32())) assert nested_tmap.validate_arg({3: {"test": 4}, 1: {"map": 3231}}) is None
def test_exception(): exceptional_thrift = load_thrift_from_testdir("exceptional.thrift") expected = ServiceEndpoint( name="ping", args=[], results=[ ThriftSpec( field_id=1, name="omg", type_info=TStruct( name="OMGException", fields=[ ThriftSpec( field_id=1, name="description", type_info=TString(), required=True, ) ], ), required=False, ) ], ) assert expected == thrift_parser._parse_thrift_endpoint( exceptional_thrift.__thrift_meta__["services"][0], "ping")
def test_set_list_types(): collections_thrift = load_thrift_from_testdir("collections.thrift") expected = ServiceEndpoint( name="setsAndLists", args=[ ThriftSpec( field_id=1, name="listOfDoubles", type_info=TList(value_type=TDouble()), required=False, ), ThriftSpec( field_id=2, name="binarySet", type_info=TSet(value_type=TString()), required=False, ), ], results=[ ThriftSpec( field_id=0, name="success", type_info=TSet(value_type=TByte()), required=False, ) ], ) result = thrift_parser._parse_thrift_endpoint( collections_thrift.__thrift_meta__["services"][0], "setsAndLists") assert expected == result
def superhero_struct(): return TStruct( name="super_hero", fields=[ ThriftSpec(field_id=1, name="name", type_info=TString(), required=True), ThriftSpec( field_id=2, name="villains", type_info=TList(value_type=TString()), required=False, ), ], )
def test_struct_type(): struct_thrift = load_thrift_from_testdir("structThrift.thrift") my_int_struct = ThriftSpec(name="myIntStruct", type_info=TI64(), required=True) my_other_struct = ThriftSpec( name="myOtherStruct", type_info=TStruct( name="MyOtherStruct", fields=[ ThriftSpec(name="id", type_info=TString(), required=True), ThriftSpec(name="ints", type_info=TList(value_type=TI64()), required=True), ], ), required=False, ) expected = ServiceEndpoint( name="getMyStruct", args=[], results=[ ThriftSpec( name="success", type_info=TStruct(name="MyStruct", fields=[my_int_struct, my_other_struct]), required=False, ) ], ) result = thrift_parser._parse_thrift_endpoint( struct_thrift.__thrift_meta__["services"][0], "getMyStruct") assert expected == result
def test_required_argument_missing(example_thrift_manager): request = _build_request(endpoint_name="completeTask", request_body={}) assert [ FieldError( arg_spec=ThriftSpec(name="taskId", type_info=TString(), required=True), code=ErrorCode.REQUIRED_FIELD_MISSING, message="Required Field 'taskId' not found", ) ] == example_thrift_manager.validate_request(request)
def test_request_body_has_invalid_data(example_thrift_manager): request = _build_request(endpoint_name="completeTask", request_body={"taskId": [4]}) assert [ FieldError( arg_spec=ThriftSpec(name="taskId", type_info=TString(), required=True), code=ErrorCode.FIELD_VALIDATION_ERROR, message="Expected str but got list", ) ] == example_thrift_manager.validate_request(request)
def test_basic_thrift_types(): simple_type_thrift = load_thrift_from_testdir("simpleType.thrift") expected = ServiceEndpoint( name="returnInt", args=[ ThriftSpec(name="intParameter", type_info=TI32(), required=False), ThriftSpec(name="stringParameter", type_info=TString(), required=False), ], results=[ThriftSpec(name="success", type_info=TI32(), required=False)], ) assert expected == thrift_parser._parse_thrift_endpoint( simple_type_thrift.__thrift_meta__["services"][0], "returnInt")
def test_invalid_map(): tmap = TMap(key_type=TI32(), value_type=TString()) assert tmap.validate_arg(4) == ["Expected dict but got int"] assert tmap.validate_arg({ 3: 4, 5: 2 }) == [ "Value for key '3' in map invalid: 'Expected str but got int'", "Value for key '5' in map invalid: 'Expected str but got int'", ] assert tmap.validate_arg({ "3": 4, 5: "2" }) == [ "Key '3' in map invalid: 'Expected int but got str'", "Value for key '3' in map invalid: 'Expected str but got int'", ]
def test_super_nesting(): turducken_thrift = load_thrift_from_testdir("turducken.thrift") dog_names_to_values = {"GOLDEN": 0, "CORGI": 1, "BASSET": 2} dog_enum = TEnum( name="DOG", names_to_values=dog_names_to_values, values_to_names={ value: key for key, value in dog_names_to_values.items() }, ) outer_value = TI64() inner_value = TList(value_type=TString()) inner_key = TSet(value_type=TList(value_type=dog_enum)) outer_key = TMap(key_type=inner_key, value_type=inner_value) map_field = TMap(key_type=outer_key, value_type=outer_value) expected = ServiceEndpoint( name="getTheStruct", args=[], results=[ ThriftSpec( field_id=0, name="success", type_info=TStruct( name="TheStruct", fields=[ ThriftSpec( field_id=1, name="myInsaneStruct", type_info=map_field, required=True, ) ], ), required=False, ) ], ) assert expected == thrift_parser._parse_thrift_endpoint( turducken_thrift.__thrift_meta__["services"][0], "getTheStruct")
def test_invalid_string(): assert TString().validate_arg(b"Batman") == "Expected str but got bytes" assert TString().validate_arg(4) == "Expected str but got int"
def test_valid_string(): assert TString().validate_arg("Batman") is None
def test_translate_string(): assert "Dog" == TString().format_arg_for_thrift("Dog", None)
def test_invalid_set(): assert TSet(value_type=TString()).validate_arg( []) == ["Expected set but got list"] assert TSet(value_type=TString()).validate_arg( {4}) == ["Invalid value in set: Expected str but got int"]
def test_valid_set(): assert TSet(value_type=TString()).validate_arg({"1", "2", "3"}) is None assert TSet(value_type=TString()).validate_arg(set()) is None
def test_invalid_list(): assert TList(value_type=TString()).validate_arg( set()) == ["Expected list but got set"] assert TList(value_type=TString()).validate_arg( [4]) == ["Index 0: Expected str but got int"]
def test_valid_list(): assert TList(value_type=TString()).validate_arg(["1", "2", "3"]) is None assert TList(value_type=TString()).validate_arg([]) is None assert (TList(value_type=TList(value_type=TI32())).validate_arg( [[1, 2], [4, 4]]) is None)