276 lines
7.2 KiB
JavaScript
276 lines
7.2 KiB
JavaScript
/* eslint-env mocha */
|
|
import expect from "expect"
|
|
import validateHelper, { expectNoErrors } from "./validate-helper.js"
|
|
|
|
describe("validation plugin - semantic - paths", function(){
|
|
this.timeout(10 * 1000)
|
|
|
|
describe("Empty path templates are not allowed", () => {
|
|
|
|
it("should return one problem for an empty path template", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{}": {}
|
|
}
|
|
}
|
|
|
|
return validateHelper(spec)
|
|
.then(system => {
|
|
const allErrors = system.errSelectors.allErrors().toJS()
|
|
const firstError = allErrors[0]
|
|
expect(allErrors.length).toEqual(1)
|
|
expect(firstError.message).toEqual( "Empty path parameter declarations are not valid")
|
|
expect(firstError.path).toEqual(["paths", "/CoolPath/{}"])
|
|
})
|
|
})
|
|
|
|
})
|
|
|
|
describe("Path parameters declared in the path string need matching definitions", () => {
|
|
|
|
it("should return one problem for an undefined declared path parameter", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {}
|
|
}
|
|
}
|
|
|
|
return validateHelper(spec)
|
|
.then( system => {
|
|
const allErrors = system.errSelectors.allErrors().toJS()
|
|
expect(allErrors.length).toEqual(1)
|
|
const firstError = allErrors[0]
|
|
expect(firstError.message).toEqual( "Declared path parameter \"id\" needs to be defined as a path parameter at either the path or operation level")
|
|
expect(firstError.path).toEqual(["paths", "/CoolPath/{id}"])
|
|
})
|
|
})
|
|
|
|
it("should return one problem for an path parameter defined in another path", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {},
|
|
"/UncoolPath/{id}": {
|
|
parameters: [{
|
|
name: "id",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
|
|
return validateHelper(spec)
|
|
.then( system => {
|
|
const allErrors = system.errSelectors.allErrors().toJS()
|
|
expect(allErrors.length).toEqual(1)
|
|
const firstError = allErrors[0]
|
|
expect(firstError.message).toEqual("Declared path parameter \"id\" needs to be defined as a path parameter at either the path or operation level")
|
|
expect(firstError.path).toEqual(["paths", "/CoolPath/{id}"])
|
|
})
|
|
})
|
|
|
|
it("should return no problems for a path parameter defined in the path", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {
|
|
parameters: [{
|
|
name: "id",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
|
|
return expectNoErrors(spec)
|
|
})
|
|
|
|
it("should return no problems for a path parameter defined in an operation", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {
|
|
get: {
|
|
parameters: [{
|
|
name: "id",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return expectNoErrors(spec)
|
|
})
|
|
|
|
})
|
|
|
|
describe("Path strings must be equivalently different", () => {
|
|
|
|
it("should return one problem for an equivalent templated path strings", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {
|
|
parameters: [{
|
|
name: "id",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
},
|
|
"/CoolPath/{count}": {
|
|
parameters: [{
|
|
name: "count",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
|
|
return validateHelper(spec)
|
|
.then( system => {
|
|
const allErrors = system.errSelectors.allErrors().toJS()
|
|
expect(allErrors.length).toEqual(1)
|
|
const firstError = allErrors[0]
|
|
expect(firstError.message).toEqual("Equivalent paths are not allowed.")
|
|
expect(firstError.path).toEqual(["paths", "/CoolPath/{count}"])
|
|
})
|
|
})
|
|
|
|
it("should return no problems for a templated and untemplated pair of path strings", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/": {},
|
|
"/CoolPath/{count}": {
|
|
parameters: [{
|
|
name: "count",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
|
|
return expectNoErrors(spec)
|
|
})
|
|
|
|
it("should return no problems for a templated and double-templated set of path strings", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{group_id1}/all": {
|
|
parameters: [{
|
|
name: "group_id1",
|
|
in: "path",
|
|
required: true
|
|
}]
|
|
},
|
|
"/CoolPath/{group_id2}/{user_id2}": {
|
|
parameters: [
|
|
{
|
|
name: "group_id2",
|
|
in: "path",
|
|
required: true
|
|
},
|
|
{
|
|
name: "user_id2",
|
|
in: "path",
|
|
required: true
|
|
},
|
|
]
|
|
},
|
|
}
|
|
}
|
|
|
|
return expectNoErrors(spec)
|
|
})
|
|
|
|
})
|
|
|
|
describe("Paths must have unique name + in parameters", () => {
|
|
it("should return no problems for a name collision only", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {
|
|
parameters: [
|
|
{
|
|
name: "id",
|
|
in: "path",
|
|
required: true
|
|
},
|
|
{
|
|
name: "id",
|
|
in: "query"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
return expectNoErrors(spec)
|
|
})
|
|
|
|
it("should return no problems when 'in' is not defined", function(){
|
|
const spec = {
|
|
swagger: "2.0",
|
|
paths: {
|
|
"/CoolPath/{id}": {
|
|
parameters: [
|
|
{
|
|
name: "id",
|
|
in: "path",
|
|
required: true
|
|
},
|
|
{
|
|
name: "id",
|
|
// in: "path"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
return expectNoErrors(spec)
|
|
})
|
|
|
|
})
|
|
|
|
describe("Integrations", () => {
|
|
it.skip("should return two problems for an equivalent path string missing a parameter definition", function(){
|
|
// const spec = {
|
|
// paths: {
|
|
// "/CoolPath/{id}": {
|
|
// parameters: [{
|
|
// name: "id",
|
|
// in: "path"
|
|
// }]
|
|
// },
|
|
// "/CoolPath/{count}": {}
|
|
// }
|
|
// }
|
|
//
|
|
// let res = validate({ resolvedSpec: spec })
|
|
// expect(res.errors).toEqual([
|
|
// {
|
|
// message: "Equivalent paths are not allowed.",
|
|
// path: "paths./CoolPath/{count}"
|
|
// },
|
|
// {
|
|
// message: "Declared path parameter \"count\" needs to be defined as a path parameter at either the path or operation level",
|
|
// path: "paths./CoolPath/{count}"
|
|
// }
|
|
// ])
|
|
// expect(res.warnings).toEqual([])
|
|
})
|
|
|
|
})
|
|
})
|