question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

[BUG] Example values are not generated for enum types referenced with $ref

See original GitHub issue
Description

openapi-generator only produces example schemas/responses for enum types when they are inlined in the response type. When an enum is $referenced, no example value is produced. Because this happens with both openapi and spring generators, I assume this is a core bug and not specific to either generator.

With the declaration file below, I get

  • "Specification" : { "example" : {"bar" : "BAR_A"} } for openapi rather than the expected "Specification" : { "example" : {"foo" : "FOO_A", "bar" : "BAR_A"} } and
  • setExampleResponse(request, "application/json", "{ \"bar\" : \"BAR_A\"}") for Spring rather than the expected setExampleResponse(request, "application/json", "{ \"foo\": \"FOO_A\", \"bar\" : \"BAR_A\"}").
openapi-generator version

Problem seen at least in 4.0.3, 4.1.3, latest 4.2.0-SNAPSHOT and 5.0.0-SNAPSHOT.

OpenAPI declaration file content or url
openapi: "3.0.0"
info:
  version: 0.0.1
  title: Enum example

components:
  schemas:
    Foo:
      type: string
      enum:
        - FOO_A
        - FOO_B
    Specification:
      type: object
      properties:
        foo:
          $ref: '#/components/schemas/Foo'
        bar:
          type: string
          enum:
            - BAR_A
            - BAR_B
      required:
        - foo
        - bar

paths:
  /hello:
    get:
      responses:
        200:
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Specification'
Command line used for generation

java -jar openapi-generator-cli-4.2.0-20191028.135625-129.jar generate -i api.yaml -g openapi -o oa-420/ java -jar openapi-generator-cli-4.2.0-20191028.135625-129.jar generate -i api.yaml -g spring -o spring-420/

Steps to reproduce

Generate an Openapi JSON file or a Spring application with the above command lines and check $.components.schemas.Specification.example and HelloApi::helloGet(), respectively

Related issues/PRs

Could not find anything related to examples for enums; in:title enum example returned 0 matches.

Issue Analytics

  • State:open
  • Created 4 years ago
  • Reactions:2
  • Comments:7 (1 by maintainers)

github_iconTop GitHub Comments

2reactions
lwlee2608commented, Oct 29, 2019

I am able to resolve it by replacing this line https://github.com/OpenAPITools/openapi-generator/blob/a2b37d67c05a9e09a047d0c5d20652326fe3d2fa/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/ExampleGenerator.java#L354

from return null; to return resolvePropertyToExample(name, mediaType, schema, processedModels);

However, I’m not sure if it is a correct fix.

1reaction
Johnloncommented, Feb 2, 2022

This is really bugging me as I want to rejuvenate the flask generator and fix a load of bugs and gaps in enum handling but this one probem has me stuck. I cannot figure out how to get the generated code to contain a legal example value or legal enum value of any kind. And I hate that.

Any way folk …

What’s the required behaviour here?

  • Look for a “example” field on the request paramter and use that? Or drill down the to the referred enum type and …
  • Pick any one of the valid enum values and use it as the value in the test code?
  • or look for a “example” field in the enum and use that?
  • or look for a “default” field in the enum and use that?

(PS @lwlee2608 that change above didn’t work for me)

The python code I get generated in the controller test is just wrong. The substituted example value “openapi_server.OuterEnumInteger()” can’t even compile. Even “openapi_server.models.OuterEnumInteger()” would be wrong as this is imported. Using just “OuterEnumInteger()” compiles at least. However, even then we get a runtime error because “OuterEnumInteger()” is not a valid value for the enum which is actually an int inmy case.


        body = 'body_example'
        query_string = [('enum_query_int', openapi_server.OuterEnumInteger())]
        headers = {
            'Accept': '*/*',

 /enum-post-json:
    post:
      description: Test serialization of enum properties with examples
      operationId: enum_post_json
      responses:
        '200':
          description: Output enum corncopia
          content:
            '*/*':
              schema:
                type: string
      parameters:
      - description: Query outer enum parameter
        in: query
        name: enum_query_int
        required: false
        # TODO Code gen doesn't pick this example up nor the one in the referred type unfortunately - and the generated controller test is not valid code
        # https://github.com/OpenAPITools/openapi-generator/issues/4300
        example: 1
        schema:
          $ref: '#/components/schemas/OuterEnumInteger'
      requestBody:
        required: true
        content:
          application/json:
            schema:
                type: string

What the param type is ...

    OuterEnumInteger:
      type: integer
      enum:
      - 0
      - 1
      - 2
      example: 2
Read more comments on GitHub >

github_iconTop Results From Across the Web

Using $ref - Swagger
OAS 3 This guide is for OpenAPI 3.0. Using $ref. When you document an API, it is common to have some features which...
Read more >
Enumerations - Scala 3 - EPFL
Similarly, enum case declarations may not directly reference members of the enum's companion object, even if they are imported (directly, or by renaming)....
Read more >
Language Guide (proto3) | Protocol Buffers - Google Developers
Defining A Message Type; Scalar Value Types; Default Values ... This is a reference guide – for a step by step example that...
Read more >
Enumeration declaration - cppreference.com
If the enumerator-list is empty, the underlying type is as if the enumeration had a single enumerator with value 0. If no integral...
Read more >
enum — Support for enumerations — Python 3.11.1 ...
Source code: Lib/enum.py Important: This page contains the API reference ... In Python 3.12 it will be possible to check for member values...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found