Skip to content

Adding or removing a schema from response is not being recorded in the diff #3074

@zmay2030

Description

@zmay2030

Problem statement

There's two related issues. When a response ADDS a new schema properly, it is not being recorded. Only "Added schema definition" is. And when a response is REMOVES a new schema properly, it is panicking. I have examples below to demonstrate both.

Swagger specification

See code below

Steps to reproduce

Adding New Schema property

package main

import (
	"fmt"
	"io"

	"github.com/go-openapi/spec"
	"github.com/go-swagger/go-swagger/cmd/swagger/commands/diff"
)

func main() {
	analyzer := diff.NewSpecAnalyser()

	var spec1 spec.Swagger
	err := spec1.UnmarshalJSON([]byte(`
{
  "swagger": "2.0",
  "info": {
    "title": "Swagger Fixture",
    "version": "1.0"
  },
  "paths": {
    "/a/": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response"
          }
        }
      }
    }
  }
}
`))

	if err != nil {
		panic(err)
	}

	var spec2 spec.Swagger
	err = spec2.UnmarshalJSON([]byte(`
{
  "swagger": "2.0",
  "info": {
    "title": "Swagger Fixture",
    "version": "1.0"
  },
  "paths": {
    "/a/": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response",
			"schema": { 
				"$ref": "#/definitions/A1"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "A1": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        }
      }
    }
  }
}
`))
	if err != nil {
		panic(err)
	}

	err = analyzer.Analyse(&spec1, &spec2)
	if err != nil {
		panic(err)
	}

	r, err, _ := analyzer.Diffs.ReportAllDiffs(false)
	if err != nil {
		panic(err)
	}

	results, err := io.ReadAll(r)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(results))
}

Output:

NON-BREAKING CHANGES:
=====================
Spec Definitions.A1 - Added a schema definition
compatibility test OK. No breaking changes identified.

Removing schema property

package main

import (
	"fmt"
	"io"

	"github.com/go-openapi/spec"
	"github.com/go-swagger/go-swagger/cmd/swagger/commands/diff"
)

func main() {
	analyzer := diff.NewSpecAnalyser()

	var spec1 spec.Swagger
	err := spec1.UnmarshalJSON([]byte(`
{
  "swagger": "2.0",
  "info": {
    "title": "Swagger Fixture",
    "version": "1.0"
  },
  "paths": {
    "/a/": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response",
			"schema": { 
				"$ref": "#/definitions/A1"
            }
          }
        }
      }
    }
  }
}
`))

	if err != nil {
		panic(err)
	}

	var spec2 spec.Swagger
	err = spec2.UnmarshalJSON([]byte(`
{
  "swagger": "2.0",
  "info": {
    "title": "Swagger Fixture",
    "version": "1.0"
  },
  "paths": {
    "/a/": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response"
          }
        }
      }
    }
  },
  "definitions": {
    "A1": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        }
      }
    }
  }
}
`))
	if err != nil {
		panic(err)
	}

	err = analyzer.Analyse(&spec1, &spec2)
	if err != nil {
		panic(err)
	}

	r, err, _ := analyzer.Diffs.ReportAllDiffs(false)
	if err != nil {
		panic(err)
	}

	results, err := io.ReadAll(r)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(results))
}

Output: it panics

Environment

swagger version: 2.0
go version: 1.20
OS: Mac

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugdiffRelates to the swagger diff command

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions