opticdev / optic

OpenAPI linting, diffing and testing. Optic helps prevent breaking changes, publish accurate documentation and improve the design of your APIs.
https://useoptic.com
MIT License
1.35k stars 79 forks source link

Surface a `schema` assertion on bodies for rule runner #2672

Closed niclim closed 8 months ago

niclim commented 8 months ago

🍗 Description

What does this PR do? Anything folks should know?

Ended up changing this PR to emit schema facts on any schema. Previously, we had body facts (on root body nodes) and property facts (on keys of objects) but this missed out on polymorphic items and array items.

Schema now triggers on all of the above cases and includes context related data depending on where the schema originated from (including required and key for fields). See example

  {
    "location": {
      "conceptualLocation": {
        "context": {
          "key": "code",
          "required": false,
          "type": "field",
        },
        "inResponse": {
          "body": {
            "contentType": "application/json",
          },
          "statusCode": "200",
        },
        "jsonSchemaTrail": [
          "code",
        ],
        "method": "post",
        "path": "/pet/{petId}/uploadImage",
      },
      "conceptualPath": [
        "operations",
        "/pet/{}/uploadImage",
        "post",
        "responses",
        "200",
        "application/json",
        "code",
      ],
      "jsonPath": "/paths/~1pet~1{petId}~1uploadImage/post/responses/200/content/application~1json/schema/properties/code",
      "kind": "schema",
    },
    "value": {
      "flatSchema": {
        "format": "int32",
        "type": "integer",
      },
    },
  },

Keeping the old field and body facts in for backwards compatibility, but I think schema can be used for all future rule cases since it asserts on the schema object.

📚 References

Links to relevant docs (Notion, Twist, GH issues, etc.), if applicable.

👹 QA

How can other humans verify that this PR is correct?