potiuk commented on PR #37638:
URL: https://github.com/apache/airflow/pull/37638#issuecomment-2015695912
> ### Does not raise Valueerror
When I run it in my unit test, I got Internal Server error - that's why it
does not return ValueError, because it converts ValueError into 500 internal
HTTP error:
```
FAILED [100%][2024-03-22T19:17:02.835+0100] {exceptions.py:97} ERROR -
ValueError("'dummy' is not a valid DagRunState")
Traceback (most recent call last):
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/starlette/_exception_handler.py",
line 53, in wrapped_app
await app(scope, receive, sender)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/swagger_ui.py",
line 222, in __call__
await self.router(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/starlette/routing.py",
line 756, in __call__
await self.middleware_stack(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/starlette/routing.py",
line 806, in app
await self.default(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/swagger_ui.py",
line 235, in default_fn
await self.app(original_scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/starlette/middleware/cors.py",
line 85, in __call__
await self.app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/routing.py",
line 154, in __call__
await self.router(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/starlette/routing.py",
line 756, in __call__
await self.middleware_stack(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/starlette/routing.py",
line 806, in app
await self.default(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/routing.py",
line 48, in __call__
await self.next_app(original_scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/abstract.py",
line 268, in __call__
await self.app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/abstract.py",
line 268, in __call__
await self.app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/abstract.py",
line 268, in __call__
await self.app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/lifespan.py",
line 26, in __call__
await self.next_app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/middleware/abstract.py",
line 268, in __call__
await self.app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/connexion/apps/flask.py",
line 151, in __call__
return await self.asgi_app(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/a2wsgi/wsgi.py",
line 165, in __call__
return await responder(scope, receive, send)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/a2wsgi/wsgi.py",
line 200, in __call__
await self.loop.run_in_executor(
File
"/home/jarek/.local/share/hatch/pythons/3.8/python/lib/python3.8/concurrent/futures/thread.py",
line 57, in run
result = self.fn(*self.args, **self.kwargs)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/a2wsgi/wsgi.py",
line 256, in wsgi
iterable = self.app(environ, start_response)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/flask/app.py",
line 2532, in wsgi_app
response = self.handle_exception(e)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/flask/app.py",
line 2529, in wsgi_app
response = self.full_dispatch_request()
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/flask/app.py",
line 1825, in full_dispatch_request
rv = self.handle_user_exception(e)
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/flask/app.py",
line 1823, in full_dispatch_request
rv = self.dispatch_request()
File
"/home/jarek/.local/share/hatch/env/virtual/apache-airflow/AdTkC0pY/apache-airflow/lib/python3.8/site-packages/flask/app.py",
line 1799, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/home/jarek/code/airflow/airflow/www/api/experimental/endpoints.py",
line 54, in decorated
return auth.requires_authentication(function)(*args, **kwargs)
File "/home/jarek/code/airflow/airflow/api/auth/backend/default.py", line
40, in decorated
return function(*args, **kwargs)
File "/home/jarek/code/airflow/airflow/www/api/experimental/endpoints.py",
line 172, in dag_runs
dagruns = get_dag_runs(dag_id, state)
File
"/home/jarek/code/airflow/airflow/api/common/experimental/get_dag_runs.py",
line 43, in get_dag_runs
state = DagRunState(state.lower()) if state else None
File
"/home/jarek/.local/share/hatch/pythons/3.8/python/lib/python3.8/enum.py", line
339, in __call__
return cls.__new__(cls, value)
File
"/home/jarek/.local/share/hatch/pythons/3.8/python/lib/python3.8/enum.py", line
663, in __new__
raise ve_exc
ValueError: 'dummy' is not a valid DagRunState
[2024-03-22T19:17:02.838+0100] {_client.py:1027} INFO - HTTP Request: GET
http://testserver/api/experimental/dags/example_bash_operator/dag_runs?state=dummy
"HTTP/1.1 500 Internal Server Error"
```
It is likely a difference between how the application behaves in tests. You
can see it when you do step-by-step debugging on what is going on with the test.
1) In main (connexion 2):
It looks like how app.get() works - it does not make the actual HTTP call -
they start a WSGI application, pass the parameters and in case of exception,
they do not return the actual HTTP error, but raise the exception returned by
the WSGI call (so expect that this exception will be mapped to HTTP error above
the get call.
2) in your PR:
After moving to starlette and ASGI the same "get" method of the app wil
actuallly run an http client to make the call (starlette/testclient.py) - seems
that this test client derives from `httpx` library and actually makes an http
call:

So seems like somewhere, our integration with the API maps ValueError into
Internal Server Error and the previous implementation was likely raising a
Value Error to map it into a different HTTP Response.
So that's why we do not see a "ValueError". I think it's worth to check if
in case of this particular API call we also eventually would get a 500 error (I
guess so - experimental API was not very well tested nor did not have good
error handling) and in this case we should simply convert them to check if the
Response returned by get() is HTTP 500
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]