hug icon indicating copy to clipboard operation
hug copied to clipboard

Some tests fail

Open piegamesde opened this issue 5 years ago • 1 comments

Reproduce with nix-shell -p python37Packages.hug or nix-shell -p python38Packages.hug.

============================= test session starts ==============================
platform linux -- Python 3.8.2, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: /build/source, inifile: setup.cfg
collected 474 items / 4 deselected / 470 selected                              

tests/test_api.py .........                                              [  1%]
tests/test_async.py .....                                                [  2%]
tests/test_authentication.py .....                                       [  4%]
tests/test_context_factory.py ...F.....F.....F..                         [  7%]
tests/test_coroutines.py .....                                           [  8%]
tests/test_decorators.py ........................s...................... [ 18%]
............................................                             [ 28%]
tests/test_directives.py ..............                                  [ 31%]
tests/test_documentation.py ....                                         [ 32%]
tests/test_exceptions.py .                                               [ 32%]
tests/test_full_request.py .                                             [ 32%]
tests/test_global_context.py .                                           [ 32%]
tests/test_input_format.py .....                                         [ 33%]
tests/test_interface.py ....                                             [ 34%]
tests/test_introspect.py .......                                         [ 36%]
tests/test_main.py .                                                     [ 36%]
tests/test_middleware.py ...                                             [ 37%]
tests/test_output_format.py .................                            [ 40%]
tests/test_redirect.py ......                                            [ 41%]
tests/test_route.py ................                                     [ 45%]
tests/test_routing.py .................................................. [ 55%]
........................................................................ [ 71%]
..................................................................       [ 85%]
tests/test_store.py .                                                    [ 85%]
tests/test_test.py .                                                     [ 85%]
tests/test_this.py .                                                     [ 85%]
tests/test_transform.py ....                                             [ 86%]
tests/test_types.py .............................F.F....F                [ 94%]
tests/test_use.py ......................                                 [ 99%]
tests/test_validate.py ...                                               [100%]

=================================== FAILURES ===================================
____________________ TestContextFactoryLocal.test_transform ____________________

self = <Local object at 0x7fffe5822d40>, args = (), kwargs = {}
context = {'test': 'context', 'test_number': 43}, errors = {}

    def __call__(self, *args, **kwargs):
        context = self.api.context_factory(api=self.api, api_version=self.version, interface=self)
        """Defines how calling the function locally should be handled"""
    
        for _requirement in self.requires:
            lacks_requirement = self.check_requirements(context=context)
            if lacks_requirement:
                self.api.delete_context(context, lacks_requirement=lacks_requirement)
                return self.outputs(lacks_requirement) if self.outputs else lacks_requirement
    
        for index, argument in enumerate(args):
            kwargs[self.parameters[index]] = argument
    
        if not getattr(self, "skip_directives", False):
            for parameter, directive in self.directives.items():
                if parameter in kwargs:
                    continue
                arguments = (self.defaults[parameter],) if parameter in self.defaults else ()
                kwargs[parameter] = directive(
                    *arguments,
                    api=self.api,
                    api_version=self.version,
                    interface=self,
                    context=context
                )
    
        if not getattr(self, "skip_validation", False):
            errors = self.validate(kwargs, context)
            if errors:
                errors = {"errors": errors}
                if getattr(self, "on_invalid", False):
                    errors = self.on_invalid(errors)
                outputs = getattr(self, "invalid_outputs", self.outputs)
                self.api.delete_context(context, errors=errors)
                return outputs(errors) if outputs else errors
    
        self._rewrite_params(kwargs)
        try:
            result = self.interface(**kwargs)
            if self.transform:
                if hasattr(self.transform, "context"):
                    self.transform.context = context
>               result = self.transform(result)

/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:436: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <hug.types.MarshmallowReturnSchema object at 0x7fffe57fd280>
value = {'name': 'test'}

    def __call__(self, value):
        # In marshmallow 2 schemas return tuple (`data`, `errors`) upon loading. They might also raise on invalid data
        # if configured so, but will still return a tuple.
        # In marshmallow 3 schemas always raise Validation error on load if input data is invalid and a single
        # value `data` is returned.
        if MARSHMALLOW_MAJOR_VERSION is None or MARSHMALLOW_MAJOR_VERSION == 2:
            value, errors = self.schema.dump(value)
        else:
            errors = {}
            try:
>               value = self.schema.dump(value)

/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/types.py:727: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <UserSchema(many=False)>, obj = {'name': 'test'}

    def dump(self, obj: typing.Any, *, many: bool = None):
        """Serialize an object to native Python data types according to this
        Schema's fields.
    
        :param obj: The object to serialize.
        :param many: Whether to serialize `obj` as a collection. If `None`, the value
            for `self.many` is used.
        :return: A dict of serialized data
        :rtype: dict
    
        .. versionadded:: 1.0.0
        .. versionchanged:: 3.0.0b7
            This method returns the serialized data rather than a ``(data, errors)`` duple.
            A :exc:`ValidationError <marshmallow.exceptions.ValidationError>` is raised
            if ``obj`` is invalid.
        .. versionchanged:: 3.0.0rc9
            Validation no longer occurs upon serialization.
        """
        many = self.many if many is None else bool(many)
        if many and is_iterable_but_not_string(obj):
            obj = list(obj)
    
        if self._has_processors(PRE_DUMP):
            processed_obj = self._invoke_dump_processors(
                PRE_DUMP, obj, many=many, original_data=obj
            )
        else:
            processed_obj = obj
    
        result = self._serialize(processed_obj, many=many)
    
        if self._has_processors(POST_DUMP):
>           result = self._invoke_dump_processors(
                POST_DUMP, result, many=many, original_data=obj
            )

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:556: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <UserSchema(many=False)>, tag = 'post_dump', data = {'name': 'test'}

    def _invoke_dump_processors(
        self, tag: str, data, *, many: bool, original_data=None
    ):
        # The pass_many post-dump processors may do things like add an envelope, so
        # invoke those after invoking the non-pass_many processors which will expect
        # to get a list of items.
>       data = self._invoke_processors(
            tag, pass_many=False, data=data, many=many, original_data=original_data
        )

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:1053: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <UserSchema(many=False)>, tag = 'post_dump', pass_many = False
data = {'name': 'test'}, many = False, original_data = {'name': 'test'}
kwargs = {}, key = ('post_dump', False), attr_name = 'check_context'
processor_kwargs = {'pass_original': False}

    def _invoke_processors(
        self,
        tag: str,
        *,
        pass_many: bool,
        data,
        many: bool,
        original_data=None,
        **kwargs
    ):
        key = (tag, pass_many)
        for attr_name in self._hooks[key]:
            # This will be a bound method.
            processor = getattr(self, attr_name)
    
            processor_kwargs = processor.__marshmallow_hook__[key]
            pass_original = processor_kwargs.get("pass_original", False)
    
            if many and not pass_many:
                if pass_original:
                    data = [
                        processor(item, original, many=many, **kwargs)
                        for item, original in zip(data, original_data)
                    ]
                else:
                    data = [processor(item, many=many, **kwargs) for item in data]
            else:
                if pass_original:
                    data = processor(data, original_data, many=many, **kwargs)
                else:
>                   data = processor(data, many=many, **kwargs)
E                   TypeError: check_context() got an unexpected keyword argument 'many'

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:1212: TypeError

During handling of the above exception, another exception occurred:

self = <tests.test_context_factory.TestContextFactoryLocal object at 0x7fffe5e725b0>

    def test_transform(self):
        custom_context = dict(test="context", test_number=43)
    
        @hug.context_factory()
        def return_context(**kwargs):
            return custom_context
    
        @hug.delete_context()
        def delete_context(context, exception=None, errors=None, lacks_requirement=None):
            assert context == custom_context
            assert not exception
            assert not errors
            assert not lacks_requirement
            custom_context["launched_delete_context"] = True
    
        class UserSchema(Schema):
            name = fields.Str()
    
            @post_dump()
            def check_context(self, data):
                assert self.context["test"] == "context"
                self.context["test_number"] += 1
    
        @hug.local()
        def validation_local_function() -> UserSchema():
            return {"name": "test"}
    
>       validation_local_function()

tests/test_context_factory.py:139: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:439: in __call__
    self.api.delete_context(context, exception=exception)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

context = {'test': 'context', 'test_number': 43}
exception = TypeError("check_context() got an unexpected keyword argument 'many'")
errors = None, lacks_requirement = None

    @hug.delete_context()
    def delete_context(context, exception=None, errors=None, lacks_requirement=None):
        assert context == custom_context
>       assert not exception
E       assert not TypeError("check_context() got an unexpected keyword argument 'many'")

tests/test_context_factory.py:122: AssertionError
_____________________ TestContextFactoryCLI.test_transform _____________________

self = <tests.test_context_factory.TestContextFactoryCLI object at 0x7fffe5f6a4c0>

    def test_transform(self):
        custom_context = dict(test="context", test_number=43)
    
        @hug.context_factory()
        def return_context(**kwargs):
            return custom_context
    
        @hug.delete_context()
        def delete_context(context, exception=None, errors=None, lacks_requirement=None):
            assert not exception
            assert context == custom_context
            assert not errors
            assert not lacks_requirement
            custom_context["launched_delete_context"] = True
    
        class UserSchema(Schema):
            name = fields.Str()
    
            @post_dump()
            def check_context(self, data):
                assert self.context["test"] == "context"
                self.context["test_number"] += 1
    
        @hug.cli()
        def transform_cli_function() -> UserSchema():
            custom_context["launched_cli_function"] = True
            return {"name": "test"}
    
        hug.test.cli(transform_cli_function)
        assert "launched_cli_function" in custom_context
>       assert "launched_delete_context" in custom_context
E       AssertionError: assert 'launched_delete_context' in {'launched_cli_function': True, 'test': 'context', 'test_number': 43}

tests/test_context_factory.py:318: AssertionError
____________________ TestContextFactoryHTTP.test_transform _____________________

self = <hug.interface.HTTP object at 0x7fffe5fae890>
request = <Request: GET 'http://falconframework.org/validation_function'>
response = <Response: 200 OK>, api_version = None, kwargs = {}
context = {'launched_local_function': True, 'test': 'context', 'test_number': 43}
exception_types = (), input_parameters = {}, lacks_requirement = None
errors = {}

    def __call__(self, request, response, api_version=None, **kwargs):
        context = self.api.context_factory(
            response=response,
            request=request,
            api=self.api,
            api_version=api_version,
            interface=self,
        )
        """Call the wrapped function over HTTP pulling information as needed"""
        if isinstance(api_version, str) and api_version.isdigit():
            api_version = int(api_version)
        else:
            api_version = None
        if not self.catch_exceptions:
            exception_types = ()
        else:
            exception_types = self.api.http.exception_handlers(api_version)
            exception_types = tuple(exception_types.keys()) if exception_types else ()
        input_parameters = {}
        try:
            self.set_response_defaults(response, request)
            lacks_requirement = self.check_requirements(request, response, context)
            if lacks_requirement:
                response.data = self.outputs(
                    lacks_requirement,
                    **self._arguments(self._params_for_outputs, request, response)
                )
                self.api.delete_context(context, lacks_requirement=lacks_requirement)
                return
    
            input_parameters = self.gather_parameters(
                request, response, context, api_version, **kwargs
            )
            errors = self.validate(input_parameters, context)
            if errors:
                self.api.delete_context(context, errors=errors)
                return self.render_errors(errors, request, response)
    
>           self.render_content(
                self.call_function(input_parameters), context, request, response, **kwargs
            )

/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:916: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <hug.interface.HTTP object at 0x7fffe5fae890>, content = None
context = {'launched_local_function': True, 'test': 'context', 'test_number': 43}
request = <Request: GET 'http://falconframework.org/validation_function'>
response = <Response: 200 OK>, kwargs = {}

    def render_content(self, content, context, request, response, **kwargs):
        if hasattr(content, "interface") and (
            content.interface is True or hasattr(content.interface, "http")
        ):
            if content.interface is True:
                content(request, response, api_version=None, **kwargs)
            else:
                content.interface.http(request, response, api_version=None, **kwargs)
            return
    
>       content = self.transform_data(content, request, response, context)

/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:851: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <hug.interface.HTTP object at 0x7fffe5fae890>, data = None
request = <Request: GET 'http://falconframework.org/validation_function'>
response = <Response: 200 OK>
context = {'launched_local_function': True, 'test': 'context', 'test_number': 43}

    def transform_data(self, data, request=None, response=None, context=None):
        transform = self.transform
        if hasattr(transform, "context"):
            self.transform.context = context
        """Runs the transforms specified on this endpoint with the provided data, returning the data modified"""
        if transform and not (isinstance(transform, type) and isinstance(data, transform)):
            if self._params_for_transform:
                return transform(
                    data, **self._arguments(self._params_for_transform, request, response)
                )
            else:
>               return transform(data)

/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:778: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <hug.types.MarshmallowReturnSchema object at 0x7fffe5db2a80>
value = None

    def __call__(self, value):
        # In marshmallow 2 schemas return tuple (`data`, `errors`) upon loading. They might also raise on invalid data
        # if configured so, but will still return a tuple.
        # In marshmallow 3 schemas always raise Validation error on load if input data is invalid and a single
        # value `data` is returned.
        if MARSHMALLOW_MAJOR_VERSION is None or MARSHMALLOW_MAJOR_VERSION == 2:
            value, errors = self.schema.dump(value)
        else:
            errors = {}
            try:
>               value = self.schema.dump(value)

/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/types.py:727: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <UserSchema(many=False)>, obj = None

    def dump(self, obj: typing.Any, *, many: bool = None):
        """Serialize an object to native Python data types according to this
        Schema's fields.
    
        :param obj: The object to serialize.
        :param many: Whether to serialize `obj` as a collection. If `None`, the value
            for `self.many` is used.
        :return: A dict of serialized data
        :rtype: dict
    
        .. versionadded:: 1.0.0
        .. versionchanged:: 3.0.0b7
            This method returns the serialized data rather than a ``(data, errors)`` duple.
            A :exc:`ValidationError <marshmallow.exceptions.ValidationError>` is raised
            if ``obj`` is invalid.
        .. versionchanged:: 3.0.0rc9
            Validation no longer occurs upon serialization.
        """
        many = self.many if many is None else bool(many)
        if many and is_iterable_but_not_string(obj):
            obj = list(obj)
    
        if self._has_processors(PRE_DUMP):
            processed_obj = self._invoke_dump_processors(
                PRE_DUMP, obj, many=many, original_data=obj
            )
        else:
            processed_obj = obj
    
        result = self._serialize(processed_obj, many=many)
    
        if self._has_processors(POST_DUMP):
>           result = self._invoke_dump_processors(
                POST_DUMP, result, many=many, original_data=obj
            )

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:556: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <UserSchema(many=False)>, tag = 'post_dump', data = {}

    def _invoke_dump_processors(
        self, tag: str, data, *, many: bool, original_data=None
    ):
        # The pass_many post-dump processors may do things like add an envelope, so
        # invoke those after invoking the non-pass_many processors which will expect
        # to get a list of items.
>       data = self._invoke_processors(
            tag, pass_many=False, data=data, many=many, original_data=original_data
        )

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:1053: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <UserSchema(many=False)>, tag = 'post_dump', pass_many = False, data = {}
many = False, original_data = None, kwargs = {}, key = ('post_dump', False)
attr_name = 'check_context', processor_kwargs = {'pass_original': False}

    def _invoke_processors(
        self,
        tag: str,
        *,
        pass_many: bool,
        data,
        many: bool,
        original_data=None,
        **kwargs
    ):
        key = (tag, pass_many)
        for attr_name in self._hooks[key]:
            # This will be a bound method.
            processor = getattr(self, attr_name)
    
            processor_kwargs = processor.__marshmallow_hook__[key]
            pass_original = processor_kwargs.get("pass_original", False)
    
            if many and not pass_many:
                if pass_original:
                    data = [
                        processor(item, original, many=many, **kwargs)
                        for item, original in zip(data, original_data)
                    ]
                else:
                    data = [processor(item, many=many, **kwargs) for item in data]
            else:
                if pass_original:
                    data = processor(data, original_data, many=many, **kwargs)
                else:
>                   data = processor(data, many=many, **kwargs)
E                   TypeError: check_context() got an unexpected keyword argument 'many'

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:1212: TypeError

During handling of the above exception, another exception occurred:

self = <tests.test_context_factory.TestContextFactoryHTTP object at 0x7fffe5e546d0>

    def test_transform(self):
        custom_context = dict(test="context", test_number=43)
    
        @hug.context_factory()
        def return_context(**kwargs):
            return custom_context
    
        @hug.delete_context()
        def delete_context(context, exception=None, errors=None, lacks_requirement=None):
            assert context == custom_context
            assert not exception
            assert not errors
            assert not lacks_requirement
            custom_context["launched_delete_context"] = True
    
        class UserSchema(Schema):
            name = fields.Str()
    
            @post_dump()
            def check_context(self, data):
                assert self.context["test"] == "context"
                self.context["test_number"] += 1
    
        @hug.get("/validation_function")
        def validation_http_function() -> UserSchema():
            custom_context["launched_local_function"] = True
    
>       hug.test.get(module, "/validation_function", 43)

tests/test_context_factory.py:490: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/test.py:81: in call
    result = api(
/nix/store/j7k4y6z6xrdlfl5nk6n05sb0ypjb1lql-python3.8-falcon-2.0.0/lib/python3.8/site-packages/falcon/api.py:269: in __call__
    responder(req, resp, **params)
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:945: in __call__
    self.api.delete_context(context, exception=exception)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

context = {'launched_local_function': True, 'test': 'context', 'test_number': 43}
exception = TypeError("check_context() got an unexpected keyword argument 'many'")
errors = None, lacks_requirement = None

    @hug.delete_context()
    def delete_context(context, exception=None, errors=None, lacks_requirement=None):
        assert context == custom_context
>       assert not exception
E       assert not TypeError("check_context() got an unexpected keyword argument 'many'")

tests/test_context_factory.py:473: AssertionError
___________________________ test_marshmallow_schema ____________________________

    def test_marshmallow_schema():
        """Test hug's marshmallow schema support"""
    
        class UserSchema(Schema):
            name = fields.Int()
    
        schema_type = hug.types.MarshmallowInputSchema(UserSchema())
        assert schema_type({"name": 23}, {}) == {"name": 23}
        assert schema_type("""{"name": 23}""", {}) == {"name": 23}
        assert schema_type.__doc__ == "UserSchema"
        with pytest.raises(InvalidTypeData):
            schema_type({"name": "test"}, {})
    
        schema_type = hug.types.MarshmallowReturnSchema(UserSchema())
        assert schema_type({"name": 23}) == {"name": 23}
        assert schema_type.__doc__ == "UserSchema"
        with pytest.raises(InvalidTypeData):
>           schema_type({"name": "test"})

tests/test_types.py:400: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/types.py:727: in __call__
    value = self.schema.dump(value)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:553: in dump
    result = self._serialize(processed_obj, many=many)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:517: in _serialize
    value = field_obj.serialize(attr_name, obj, accessor=self.get_attribute)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/fields.py:325: in serialize
    return self._serialize(value, attr, obj, **kwargs)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/fields.py:916: in _serialize
    ret = self._format_num(value)  # type: _T
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fields.Integer(default=<marshmallow.missing>, attribute=None, validate=None, required=False, load_only=False, dump_on...be null.', 'validator_failed': 'Invalid value.', 'invalid': 'Not a valid integer.', 'too_large': 'Number too large.'})>
value = 'test'

    def _format_num(self, value) -> typing.Any:
        """Return the number value for value, given this field's `num_type`."""
>       return self.num_type(value)
E       ValueError: invalid literal for int() with base 10: 'test'

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/fields.py:891: ValueError
_______________________ test_marshmallow_custom_context ________________________

    def test_marshmallow_custom_context():
        custom_context = dict(context="global", factory=0, delete=0, marshmallow=0)
    
        @hug.context_factory(apply_globally=True)
        def create_context(*args, **kwargs):
            custom_context["factory"] += 1
            return custom_context
    
        @hug.delete_context(apply_globally=True)
        def delete_context(context, *args, **kwargs):
            assert context == custom_context
            custom_context["delete"] += 1
    
        class MarshmallowContextSchema(Schema):
            name = fields.String()
    
            @validates_schema
            def check_context(self, data):
                assert self.context == custom_context
                self.context["marshmallow"] += 1
    
        @hug.get()
        def made_up_hello(test: MarshmallowContextSchema()):
            return "hi"
    
>       assert hug.test.get(api, "/made_up_hello", {"test": {"name": "test"}}).data == "hi"
E       assert {'errors': {'test': "__call__() missing 1 required positional argument: 'context'"}} == 'hi'
E        +  where {'errors': {'test': "__call__() missing 1 required positional argument: 'context'"}} = <falcon.testing.srmock.StartResponseMock object at 0x7fffe5627c10>.data
E        +    where <falcon.testing.srmock.StartResponseMock object at 0x7fffe5627c10> = functools.partial(<function call at 0x7fffe69f3280>, 'GET')(<hug.api.API object at 0x7fffe6053c10>, '/made_up_hello', {'test': {'name': 'test'}})
E        +      where functools.partial(<function call at 0x7fffe69f3280>, 'GET') = <module 'hug.test' from '/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/test.py'>.get
E        +        where <module 'hug.test' from '/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/test.py'> = hug.test

tests/test_types.py:475: AssertionError
____________________ test_validate_route_args_negative_case ____________________

    def test_validate_route_args_negative_case():
        @hug.get("/hello", raise_on_invalid=True, args={"foo": fields.Integer()})
        def hello(foo: int):
            return str(foo)
    
        with pytest.raises(ValidationError):
            hug.test.get(api, "/hello", **{"foo": "a"})
    
        class TestSchema(Schema):
            bar = fields.Integer()
    
        @hug.get("/foo", raise_on_invalid=True, args={"return": TestSchema()})
        def foo():
            return {"bar": "a"}
    
        with pytest.raises(InvalidTypeData):
>           hug.test.get(api, "/foo")

tests/test_types.py:828: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/test.py:81: in call
    result = api(
/nix/store/j7k4y6z6xrdlfl5nk6n05sb0ypjb1lql-python3.8-falcon-2.0.0/lib/python3.8/site-packages/falcon/api.py:269: in __call__
    responder(req, resp, **params)
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:946: in __call__
    raise exception
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:916: in __call__
    self.render_content(
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:851: in render_content
    content = self.transform_data(content, request, response, context)
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/interface.py:778: in transform_data
    return transform(data)
/nix/store/sbm03ivynvxfnbbm7rkqdxcyxdhqcdg1-python3.8-hug-2.6.0/lib/python3.8/site-packages/hug/types.py:727: in __call__
    value = self.schema.dump(value)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:553: in dump
    result = self._serialize(processed_obj, many=many)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/schema.py:517: in _serialize
    value = field_obj.serialize(attr_name, obj, accessor=self.get_attribute)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/fields.py:325: in serialize
    return self._serialize(value, attr, obj, **kwargs)
/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/fields.py:916: in _serialize
    ret = self._format_num(value)  # type: _T
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fields.Integer(default=<marshmallow.missing>, attribute=None, validate=None, required=False, load_only=False, dump_on...be null.', 'validator_failed': 'Invalid value.', 'invalid': 'Not a valid integer.', 'too_large': 'Number too large.'})>
value = 'a'

    def _format_num(self, value) -> typing.Any:
        """Return the number value for value, given this field's `num_type`."""
>       return self.num_type(value)
E       ValueError: invalid literal for int() with base 10: 'a'

/nix/store/k9q33lax3gqnj0jnibq3xnk573mbl526-python3.8-marshmallow-3.3.0/lib/python3.8/site-packages/marshmallow/fields.py:891: ValueError
=============================== warnings summary ===============================
/nix/store/q5wyf15ymsq73ny992c3aiy5fh0qsbdl-python3.8-pytest-5.3.5/lib/python3.8/site-packages/_pytest/mark/structures.py:323
  /nix/store/q5wyf15ymsq73ny992c3aiy5fh0qsbdl-python3.8-pytest-5.3.5/lib/python3.8/site-packages/_pytest/mark/structures.py:323: PytestUnknownMarkWarning: Unknown pytest.mark.extnetwork - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/latest/mark.html
    warnings.warn(

tests/test_coroutines.py::test_basic_call_coroutine
  /build/source/tests/test_coroutines.py:35: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def hello_world():

tests/test_coroutines.py::test_nested_basic_call_coroutine
  /build/source/tests/test_coroutines.py:46: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def hello_world():

tests/test_coroutines.py::test_nested_basic_call_coroutine
  /build/source/tests/test_coroutines.py:51: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def nested_hello_world():

tests/test_coroutines.py::test_basic_call_on_method_coroutine
  /build/source/tests/test_coroutines.py:63: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def hello_world(self=None):

tests/test_coroutines.py::test_basic_call_on_method_through_api_instance_coroutine
  /build/source/tests/test_coroutines.py:83: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def hello_world():

tests/test_coroutines.py::test_basic_call_on_method_registering_without_decorator_coroutine
  /build/source/tests/test_coroutines.py:98: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def hello_world_method(self):

tests/test_decorators.py::test_startup
  /build/source/tests/test_decorators.py:1589: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
    def async_happens_on_startup(api):

-- Docs: https://docs.pytest.org/en/latest/warnings.html
===== 6 failed, 463 passed, 1 skipped, 4 deselected, 8 warnings in 17.69s ======

piegamesde avatar Jun 04 '20 21:06 piegamesde

The underlying reason seems to be that an old unstable 3.x version of marshmallow is used in hug, while the reporter is likely trying to build against a recent stable 3.x version of marshmallow.

urbas avatar Jan 16 '21 13:01 urbas