dedoussis / asynction

SocketIO python framework driven by the AsyncAPI specification. Built on top of Flask-SocketIO. Inspired by Connexion.
https://pypi.org/project/asynction/
MIT License
46 stars 5 forks source link

Payload validator fails with oneOf in payload #196

Open alex-zywicki opened 2 years ago

alex-zywicki commented 2 years ago

WIth a message payload that contains a oneOf

payload:
  oneOf:
     - type: array
        items:
          type: string
    - type: string

When passing an array of string I get this exception:

('[sos on_replay:49]', '------------------ traceback ------------------')
('  |', 'Traceback (most recent call last):')
('  |', '  File "/usr/lib/python3.8/site-packages/asti/sapi_flask/plugins/sos/__init__.py", line 45, in on_replay')
('  |', '    emit("sosreport", reports, to=session.sid, namespace=NAMESPACE)')
('  |', '  File "/usr/local/lib/python3.8/site-packages/flask_socketio/__init__.py", line 838, in emit')
('  |', '    return socketio.emit(event, *args, namespace=namespace, to=to,')
('  |', '  File "/usr/local/lib/python3.8/site-packages/asynction/server.py", line 286, in emit')
('  |', '    validate_payload(payload_args, message.payload)')
('  |', '  File "/usr/local/lib/python3.8/site-packages/asynction/validation.py", line 56, in validate_payload')
('  |', '    if schema["type"] == "array" and schema.get("prefixItems"):  # Tuple validation')
('  |', "KeyError: 'type'")
('[sos on_replay:49]', '---------------- end traceback ----------------')

I'm not 100% sure if changing to schema.get("type") would be correct, but the oneOf case needs to be handled somehow. From what I can tell based on https://www.asyncapi.com/docs/specifications/v2.2.0#messageObject this is a valid payload and it seems to validate correctly on https://studio.asyncapi.com/

alex-zywicki commented 2 years ago

@dedoussis I tested the change to schema.get("type") and that seems to fix the issue for me.

dedoussis commented 2 years ago

Hi @alex-zywicki, apologies for the delay. This is indeed a bug, but the fix is a bit more complex than the one you propose. Will look into raising a PR.

dedoussis commented 2 years ago

Have released version 0.8.3 that fixes this.

dedoussis commented 2 years ago

@alex-zywicki Would it be possible to confirm that the new version fixes the issue you encountered? If so, this thread can be closed I guess.