Skip to content

spec-first/connection does not respond correctly if the openapi are added in a certain order #2106

Description

@damienklotz77

Hi,

Let's consider the 3 following files :

openapi1.yaml

openapi: 3.0.4
info:
  title: My title
  version: '1.0'
servers:
  - url: http://127.0.0.1:8000
paths:
  /endpoint1:
    get:
      operationId: operationId1
      responses:
        '200':
          description: My description

openapi2.yaml

openapi: 3.0.4
info:
  title: My title
  version: '1.0'
servers:
  - url: http://127.0.0.1:8000/path2
paths:
  /endpoint2:
    get:
      operationId: operationId2
      responses:
        '200':
          description: My description

script.py

from connexion import AsyncApp
from connexion.resolver import Resolver


class MockResolver(Resolver):
    def __init__(self, mock):
        super().__init__()
        self.mock = mock
        self.operations = {}

    def resolve_operation_id(self, operation):
        self.operations[operation.operation_id] = operation
        return operation.operation_id

    def resolve_function_from_operation_id(self, operation_id):
        def _call_mock(*args, **kwargs):
            return self.mock[operation_id](*args, operation_id=operation_id, **kwargs)

        return _call_mock


def my_function1(**kwargs):
    return "OK1"


def my_function2(**kwargs):
    return "OK2"


mock = {
    "operationId1": my_function1,
    "operationId2": my_function2
}
resolver = MockResolver(mock)
app = AsyncApp(__name__)
app.add_api(specification="openapi1.yaml", resolver=resolver, strict_validation=True)
app.add_api(specification="openapi2.yaml", resolver=resolver, strict_validation=True)
app.run()

When calling endpoints, its is working properly

curl http://127.0.0.1:8000/endpoint1
"OK1"
curl http://127.0.0.1:8000/path2/endpoint2
"OK2"

Now, in the python script, we swap the order in which the openapis are added.

From

app.add_api(specification="openapi1.yaml", resolver=resolver, strict_validation=True)
app.add_api(specification="openapi2.yaml", resolver=resolver, strict_validation=True)

To

app.add_api(specification="openapi2.yaml", resolver=resolver, strict_validation=True)
app.add_api(specification="openapi1.yaml", resolver=resolver, strict_validation=True)

Then, we call the endpoints the same way than previously.

Expected behavior

curl http://127.0.0.1:8000/endpoint1
"OK1"
curl http://127.0.0.1:8000/path2/endpoint2
"OK2"

Obtained behavior

curl http://127.0.0.1:8000/endpoint1
"OK1"
curl http://127.0.0.1:8000/path2/endpoint2
{"type": "about:blank", "title": "Not Found", "detail": "Not Found", "status": 404}

Why does the order in which the two openapis are added affect the behavior of spec-first/connection when we calls the 2 endpoints ?

Thank you :-)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions