OpenAPITools / OpenAPITools/openapi-diff

Bug: erroneous detection of changes with mediaTypes, failure to generate html/markdown reports

オープン
#805 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
Java
スター
1.1k
フォーク
190
PR マージ指標
30日以内にマージされた PR はありません

説明

Hello

I've run into an interesting problem with version 2.1.2 of openapi-diff. I've redacted/dumbed down this example spec to be the smallest piece possible.
It would seem that in this case, where the content of then endpoint is uses mediaType's, changes are being detected (though not breaking) but even when the specs are identical.

I boiled the repro to the simplest form, you can take this example, put it in two separate files, and diff them with 2.1.2 (or 2.1.1 - but for instance, 2.1.0.beta-11 does NOT exhibit this)

openapi: '3.0.3'
info:
  license:
    name: ''
  termsOfService: ''
  title: "my test service"
  version: 'Latest'
tags:
  - name: mytestTag
    description: endpoints
paths:
  /v4/mytest/formats/{downloadFormat}/records/{recordId}:
    get:
      tags:
        - mytestTag
      summary: Converts record to provided format
      operationId: getV4DownloadsFormatsRecords
      deprecated: false
      x-ebsco-secured-endpoint:
        requiredScopes: [ ]
      security:
        - Authorization: [ ]
      parameters:
        - name: downloadFormat
          in: path
          description: Export format
          required: true
          schema:
            type: string
          example: 'csv'
        - name: recordId
          in: path
          description: Unique record identifier
          required: true
          example: 'ax74x2wyin'
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            text/csv:
              schema:
                type: string
                format: byte
              example: 'blah'
            application/vnd.openxmlformats-officedocument.wordprocessingml.document:
              schema:
                type: string
                format: byte
              example: 'blah'
            application/pdf:
              schema:
                type: string
                format: byte
              example: 'blah'
            application/x-bibtex:
              schema:
                type: string
                format: byte
              example: 'blah'
            application/marc:
              schema:
                type: string
                format: byte
              example: 'blah'
            text/xml:
              schema:
                type: string
                format: byte
              example: 'blah'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  responses:
    BadRequest:
      description: 'BadRequest'
      content:
        application/json:
          example:
            name: BAD_REQUEST
            details:
              - field: '#/login/username'
                issue: BAD_REQUEST
                location: body
            debugId: '123456789'
            message: Request contains errors
            informationLink: 'http://developer.foo.com/apidoc/blah#BAD_REQUEST'
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: 'NotFound'
      content:
        application/json:
          example:
            name: NOT_FOUND
            details:
              - field: '#/login/username'
                issue: USERNAME_IS_NOT_FOUND
                location: body
            debugId: '123456789'
            message: Item is not found
            informationLink: 'http://developer.foo.com/apidoc/blah#USERNAME_IS_NOT_FOUND'
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: 'Unauthorized'
      content:
        application/json:
          example:
            name: UNAUTHORIZED
            details:
              - field: '#/login/username'
                issue: NOT_AUTHORIZED
                location: body
            debugId: '123456789'
            message: User is not authorized
            informationLink: 'http://developer.foo.com/apidoc/blah#NOT_AUTHORIZED'
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: 'Forbidden'
      content:
        application/json:
          example:
            name: FORBIDDEN
            details:
              - field: '#/login/username'
                issue: FORBIDDEN
                location: body
            debugId: '123456789'
            message: Access denied
            informationLink: 'http://developer.foo.com/apidoc/blah#FORBIDDEN'
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  schemas:
    ErrorResponse:
      type: object
      description: Common Error response
      x-examples:
        example-1:
          name: VALIDATION_ERROR
          details:
            - field: '#/login/username'
              issue: REQUIRED_FIELD_MISSING
              location: body
          debugId: '123456789'
          message: Invalid data provided
          informationLink: 'http://developer.foo.com/apidoc/blah#VALIDATION_ERROR'
  securitySchemes:
    Authorization:
      description: Authorization token
      type: http
      scheme: bearer
      bearerFormat: JWT

This will result in changes being detected, specifically around the mediaTypes

Image

So the detection of changes when the files are identical is curious.. but furthermore, attempting to generate the html or markdown version of the report fails generate with the following exception (for markdown)

Unexpected exception. Reason: Cannot invoke "org.openapitools.openapidiff.core.model.ChangedSchema.isDiscriminatorPropertyChanged()" because "schema" is null

and for html

Unexpected exception. Reason: Cannot invoke "org.openapitools.openapidiff.core.model.ChangedSchema.isIncompatible()" because "schema" is null

When running the command like so:

java -jar openapi-diff-cli-2.1.2-all.jar anothertest.yaml samefile.yaml --html blah.html --fail-on-incompatible

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、提供された OpenAPI YAML とコマンド java -jar openapi-diff-cli-2.1.2-all.jar anothertest.yaml samefile.yaml --html blah.html --fail-on-incompatible を使ってレポートを再現します。mediaTypes の比較と HTML/Markdown レポートのパスを調査します。同一の仕様で変更が表示されず、両方のレポート形式が null-pointer exception なしで生成されれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
api, cli
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。