import expect from "expect"

import validateHelper, { expectNoErrors } from "../validate-helper.js"

describe("validation plugin - semantic - 2and3 operations", () => {
  describe("Operations must have unique operationIds", () => {
    describe("OpenAPI 3.0", () => {
      it("should return an error when operationId collisions exist", () => {
        const spec = {
          openapi: "3.0.0",
          paths: {
            "/": {
              get: {
                operationId: "myId"
              },
              post: {
                operationId: "myId"
              }
            }
          }
        }

        return validateHelper(spec)
          .then(system => {
            const allErrors = system.errSelectors.allErrors().toJS()
            const firstError = allErrors[0]
            expect(allErrors.length).toEqual(1)
            expect(firstError.message).toEqual(`Operations must have unique operationIds.`)
            expect(firstError.path).toEqual(["paths", "/", "post", "operationId"])
          })
      })
      it("should not return an error when operationId collisions don't exist", () => {
        const spec = {
          openapi: "3.0.0",
          paths: {
            "/": {
              get: {
                operationId: "myId1"
              },
              post: {
                operationId: "myId2"
              }
            }
          }
        }

        return expectNoErrors(spec)
      })
    })
    describe("Swagger 2.0", () => {
      it("should return an error when operationId collisions exist", () => {
        const spec = {
          swagger: "2.0",
          paths: {
            "/": {
              get: {
                operationId: "myId"
              },
              post: {
                operationId: "myId"
              }
            }
          }
        }

        return validateHelper(spec)
          .then(system => {
            const allErrors = system.errSelectors.allErrors().toJS()
            const firstError = allErrors[0]
            expect(allErrors.length).toEqual(1)
            expect(firstError.message).toEqual(`Operations must have unique operationIds.`)
            expect(firstError.path).toEqual(["paths", "/", "post", "operationId"])
          })
      })
      it("should not return an error when operationId collisions don't exist", () => {
        const spec = {
          swagger: "2.0",
          paths: {
            "/": {
              get: {
                operationId: "myId1"
              },
              post: {
                operationId: "myId2"
              }
            }
          }
        }

        return expectNoErrors(spec)
      })
    })
  })
})
