Files
swagger-ui/test/e2e-cypress/tests/deep-linking.js
kyle 3c3b7e0bf1 bug(deeplinking): escaping breaks whitespaces & underscored tags/ids (via #4953)
* add tests for operation lacking an operationId
* add deep linking tests for tags/operationIds with underscores
* migrate from `_` to `%20` for deeplink hash whitespace escaping
* add backwards compatibility for `_` whitespace escaping
* update util unit tests
2018-10-16 18:51:29 -05:00

327 lines
11 KiB
JavaScript

describe("Deep linking feature", () => {
describe("in Swagger 2", () => {
const baseUrl = "/?deepLinking=true&url=/documents/features/deep-linking.swagger.yaml"
beforeEach(() => {
cy.visit(baseUrl)
})
describe("regular Operation", () => {
const elementToGet = ".opblock-get"
const correctElementId = "operations-myTag-myOperation"
const correctFragment = "#/myTag/myOperation"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("Operation with whitespace in tag+id", () => {
const elementToGet = ".opblock-post"
const correctElementId = "operations-my_Tag-my_Operation"
const correctFragment = "#/my%20Tag/my%20Operation"
const legacyFragment = "#/my_Tag/my_Operation"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.should("have.attr", "href", correctFragment) // should be valid after expanding
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
it("should expand the operation when reloaded and provided the legacy fragment", () => {
cy.visit(`${baseUrl}${legacyFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("Operation with underscores in tag+id", () => {
const elementToGet = ".opblock-patch"
const correctElementId = "operations-underscore_Tag-underscore_Operation"
const correctFragment = "#/underscore_Tag/underscore_Operation"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.should("have.attr", "href", correctFragment) // should be valid after expanding
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("Operation with no operationId", () => {
const elementToGet = ".opblock-put"
const correctElementId = "operations-tagTwo-put_noOperationId"
const correctFragment = "#/tagTwo/put_noOperationId"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.should("have.attr", "href", correctFragment) // should be valid after expanding
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("regular Operation with `docExpansion: none` enabled", function() {
it("should expand a tag", () => {
cy.visit(`${baseUrl}&docExpansion=none#/myTag`)
.get(`.opblock-tag-section.is-open`)
.should("have.length", 1)
})
it("should expand an operation", () => {
cy.visit(`${baseUrl}&docExpansion=none#/myTag/myOperation`)
.get(`.opblock.is-open`)
.should("have.length", 1)
})
})
})
describe("in OpenAPI 3", () => {
const baseUrl = "/?deepLinking=true&url=/documents/features/deep-linking.openapi.yaml"
beforeEach(() => {
cy.visit(baseUrl)
})
describe("regular Operation", () => {
const elementToGet = ".opblock-get"
const correctElementId = "operations-myTag-myOperation"
const correctFragment = "#/myTag/myOperation"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("Operation with whitespace in tag+id", () => {
const elementToGet = ".opblock-post"
const correctElementId = "operations-my_Tag-my_Operation"
const correctFragment = "#/my%20Tag/my%20Operation"
const legacyFragment = "#/my_Tag/my_Operation"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.should("have.attr", "href", correctFragment) // should be valid after expanding
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
it("should expand the operation when reloaded and provided the legacy fragment", () => {
cy.visit(`${baseUrl}${legacyFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("Operation with underscores in tag+id", () => {
const elementToGet = ".opblock-patch"
const correctElementId = "operations-underscore_Tag-underscore_Operation"
const correctFragment = "#/underscore_Tag/underscore_Operation"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.should("have.attr", "href", correctFragment) // should be valid after expanding
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("Operation with no operationId", () => {
const elementToGet = ".opblock-put"
const correctElementId = "operations-tagTwo-put_noOperationId"
const correctFragment = "#/tagTwo/put_noOperationId"
it("should generate a correct element ID", () => {
cy.get(elementToGet)
.should("have.id", correctElementId)
})
it("should add the correct element fragment to the URL when expanded", () => {
cy.get(elementToGet)
.click()
.window()
.should("have.deep.property", "location.hash", correctFragment)
})
it("should provide an anchor link that has the correct fragment as href", () => {
cy.get(elementToGet)
.find("a")
.should("have.attr", "href", correctFragment)
.click()
.should("have.attr", "href", correctFragment) // should be valid after expanding
})
it("should expand the operation when reloaded", () => {
cy.visit(`${baseUrl}${correctFragment}`)
.reload()
.get(`${elementToGet}.is-open`)
.should("exist")
})
})
describe("regular Operation with `docExpansion: none` enabled", function () {
it("should expand a tag", () => {
cy.visit(`${baseUrl}&docExpansion=none#/myTag`)
.get(`.opblock-tag-section.is-open`)
.should("have.length", 1)
})
it("should expand an operation", () => {
cy.visit(`${baseUrl}&docExpansion=none#/myTag/myOperation`)
.get(`.opblock.is-open`)
.should("have.length", 1)
})
})
})
})