jmcarp / jmcarp/flask-apispec

Unit testing a delete endpoint causes ValueError: Invalid location argument: args

Open
#252 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
652
Forks
151
PR merge metrics
No merged PRs in 30d

Description

I am trying to create a unit test for a DELETE endpoint. Here is simplified code:
```
app = Flask(__name__)
app.config.update({
"TESTING": True,
})
api = Api(app)
api.add_resource(ObjectiveInterface, "/objectives")

client = app.test_client()
response = client.delete('/objectives?id=12') # also tried client.delete('/objectives', data={'id': '12'})
```

Which fails with the following error. I followed the guide [here](https://flask.palletsprojects.com/en/2.2.x/testing/) to write my test, and I believe the code is correct. Is this a bug with apispec or am I doing something wrong?
```
Error
Traceback (most recent call last):
File "test_objective_interface.py", line 92, in test_delete
response = self.client.delete('/objectives?id=12')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "werkzeug\test.py", line 1156, in delete
return self.open(*args, **kw)
^^^^^^^^^^^^^^^^^^^^^^
File "flask\testing.py", line 223, in open
response = super().open(
^^^^^^^^^^^^^
File "werkzeug\test.py", line 1095, in open
response = self.run_wsgi_app(request.environ, buffered=buffered)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "werkzeug\test.py", line 962, in run_wsgi_app
rv = run_wsgi_app(self.application, environ, buffered=buffered)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "werkzeug\test.py", line 1243, in run_wsgi_app
app_rv = app(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask\app.py", line 2551, in __call__
return self.wsgi_app(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask\app.py", line 2531, in wsgi_app
response = self.handle_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^
File "flask_restful\__init__.py", line 271, in error_router
return original_handler(e)
^^^^^^^^^^^^^^^^^^^
File "flask_restful\__init__.py", line 268, in error_router
return self.handle_error(e)
^^^^^^^^^^^^^^^^^^^^
File "flask\app.py", line 2528, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask\app.py", line 1825, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask_restful\__init__.py", line 271, in error_router
return original_handler(e)
^^^^^^^^^^^^^^^^^^^
File "flask_restful\__init__.py", line 268, in error_router
return self.handle_error(e)
^^^^^^^^^^^^^^^^^^^^
File "flask\app.py", line 1823, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "flask\app.py", line 1799, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask_restful\__init__.py", line 467, in wrapper
resp = resource(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask\views.py", line 107, in view
return current_app.ensure_sync(self.dispatch_request)(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask\views.py", line 188, in dispatch_request
return current_app.ensure_sync(meth)(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask_apispec\annotations.py", line 122, in wrapped
return wrapper(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^
File "flask_apispec\wrapper.py", line 29, in __call__
response = self.call_view(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "flask_apispec\wrapper.py", line 44, in call_view
parsed = parser.parse(schema, location=option['kwargs']['location'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "webargs\core.py", line 405, in parse
location_data = self._load_location_data(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "webargs\core.py", line 210, in _load_location_data
loader_func = self._get_loader(location)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "webargs\core.py", line 193, in _get_loader
raise ValueError(f"Invalid location argument: {location}")
ValueError: Invalid location argument: args
```

Environment:

- Python version: 3.11
- Werkzeug version: 2.2.3
- Flask version: 2.2.3
- Flask restful: 0.3.9
- Flask apispec: 0.11.4

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the failure with the Flask test client and the versions listed in the issue. Start at flask_apispec/wrapper.py where parser.parse is called, then compare the supplied location value with webargs' accepted locations. Done means identifying whether this is a dependency compatibility problem or an invalid configuration and documenting the supported behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
flask, python
Domain
api, backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.