def test_validate_args_throws_when_arg_types_or_values_are_changed(): user_call_args = (1, "b", ["c"]) user_call_kwargs = { "foo": ["bar"], } invalid_autologging_call_args_1 = copy.deepcopy(user_call_args) invalid_autologging_call_args_1 = (2,) + invalid_autologging_call_args_1[1:] invalid_autologging_call_kwargs_1 = copy.deepcopy(user_call_kwargs) invalid_autologging_call_kwargs_1["foo"] = ["biz"] with pytest.raises(Exception, match="does not match expected input"): _validate_args( user_call_args, user_call_kwargs, invalid_autologging_call_args_1, user_call_kwargs ) with pytest.raises(Exception, match="does not match expected input"): _validate_args( user_call_args, user_call_kwargs, user_call_args, invalid_autologging_call_kwargs_1 ) call_arg_1, call_arg_2, _ = copy.deepcopy(user_call_args) invalid_autologging_call_args_2 = ({"7": 1}, call_arg_1, call_arg_2) invalid_autologging_call_kwargs_2 = copy.deepcopy(user_call_kwargs) invalid_autologging_call_kwargs_2["foo"] = 8 with pytest.raises(Exception, match="does not match expected type"): _validate_args( user_call_args, user_call_kwargs, invalid_autologging_call_args_2, user_call_kwargs ) with pytest.raises(Exception, match="does not match expected type"): _validate_args( user_call_args, user_call_kwargs, user_call_args, invalid_autologging_call_kwargs_2 )
def test_validate_args_succeeds_when_extra_args_are_exception_safe_functions_or_classes( baseclass, metaclass ): user_call_args = (1, "b", ["c"]) user_call_kwargs = { "foo": ["bar"], } class Safe(baseclass, metaclass=metaclass): pass autologging_call_args = copy.deepcopy(user_call_args) autologging_call_args[2].append(Safe()) autologging_call_args += (exception_safe_function(lambda: "foo"),) autologging_call_kwargs = copy.deepcopy(user_call_kwargs) autologging_call_kwargs["foo"].append(exception_safe_function(lambda: "foo")) autologging_call_kwargs["new"] = Safe() _validate_args(user_call_args, user_call_kwargs, autologging_call_args, autologging_call_kwargs)
def test_validate_args_throws_when_extra_args_are_not_functions_classes_or_lists(): user_call_args = (1, "b", ["c"]) user_call_kwargs = { "foo": ["bar"], "biz": {"baz": 5}, } invalid_type_autologging_call_args = copy.deepcopy(user_call_args) invalid_type_autologging_call_args[2].append(10) invalid_type_autologging_call_kwargs = copy.deepcopy(user_call_kwargs) invalid_type_autologging_call_kwargs["new"] = {} with pytest.raises(Exception, match="Invalid new input"): _validate_args( user_call_args, user_call_kwargs, invalid_type_autologging_call_args, user_call_kwargs ) with pytest.raises(Exception, match="Invalid new input"): _validate_args( user_call_args, user_call_kwargs, user_call_args, invalid_type_autologging_call_kwargs )
def test_validate_args_throws_when_extra_args_are_not_exception_safe(): user_call_args = (1, "b", ["c"]) user_call_kwargs = { "foo": ["bar"], "biz": {"baz": 5}, } class Unsafe: pass unsafe_autologging_call_args = copy.deepcopy(user_call_args) unsafe_autologging_call_args += (lambda: "foo",) unsafe_autologging_call_kwargs1 = copy.deepcopy(user_call_kwargs) unsafe_autologging_call_kwargs1["foo"].append(Unsafe()) with pytest.raises(Exception, match="not exception-safe"): _validate_args( user_call_args, user_call_kwargs, unsafe_autologging_call_args, user_call_kwargs ) with pytest.raises(Exception, match="Invalid new input"): _validate_args( user_call_args, user_call_kwargs, user_call_args, unsafe_autologging_call_kwargs1 ) unsafe_autologging_call_kwargs2 = copy.deepcopy(user_call_kwargs) unsafe_autologging_call_kwargs2["biz"]["new"] = Unsafe() with pytest.raises(Exception, match="Invalid new input"): _validate_args( user_call_args, user_call_kwargs, user_call_args, unsafe_autologging_call_kwargs2 )
def test_validate_args_throws_when_args_are_omitted(): user_call_args = (1, "b", ["c"], {"d": "e"}) user_call_kwargs = { "foo": ["bar"], "biz": {"baz": 4, "fuzz": 5}, } invalid_autologging_call_args_1 = copy.deepcopy(user_call_args) invalid_autologging_call_args_1[2].pop() invalid_autologging_call_kwargs_1 = copy.deepcopy(user_call_kwargs) invalid_autologging_call_kwargs_1["foo"].pop() with pytest.raises(Exception, match="missing from the call"): _validate_args( user_call_args, user_call_kwargs, invalid_autologging_call_args_1, user_call_kwargs ) with pytest.raises(Exception, match="missing from the call"): _validate_args( user_call_args, user_call_kwargs, user_call_args, invalid_autologging_call_kwargs_1 ) invalid_autologging_call_args_2 = copy.deepcopy(user_call_args)[1:] invalid_autologging_call_kwargs_2 = copy.deepcopy(user_call_kwargs) invalid_autologging_call_kwargs_2.pop("foo") with pytest.raises(Exception, match="missing from the call"): _validate_args( user_call_args, user_call_kwargs, invalid_autologging_call_args_2, user_call_kwargs ) with pytest.raises(Exception, match="omit one or more expected keys"): _validate_args( user_call_args, user_call_kwargs, user_call_args, invalid_autologging_call_kwargs_2 ) invalid_autologging_call_args_3 = copy.deepcopy(user_call_args) invalid_autologging_call_args_3[3].pop("d") invalid_autologging_call_kwargs_3 = copy.deepcopy(user_call_kwargs) invalid_autologging_call_kwargs_3["biz"].pop("baz") with pytest.raises(Exception, match="omit one or more expected keys"): _validate_args( user_call_args, user_call_kwargs, invalid_autologging_call_args_3, user_call_kwargs ) with pytest.raises(Exception, match="omit one or more expected keys"): _validate_args( user_call_args, user_call_kwargs, user_call_args, invalid_autologging_call_kwargs_3 )
def test_validate_args_succeeds_when_arg_sets_are_equivalent_or_identical(): args = (1, "b", ["c"]) kwargs = { "foo": ["bar"], "biz": {"baz": 5}, } _validate_args(args, kwargs, args, kwargs) _validate_args(args, None, args, None) _validate_args(None, kwargs, None, kwargs) args_copy = copy.deepcopy(args) kwargs_copy = copy.deepcopy(kwargs) _validate_args(args, kwargs, args_copy, kwargs_copy) _validate_args(args, None, args_copy, None) _validate_args(None, kwargs, None, kwargs_copy)