fix: remote ref resolution regression (#4273)
* Use `parameterWithMeta` to get parameter data in <ParameterRow> * Prefer specPath when fetching resolved subtrees in OperationContainer * Add test for OAS3 callback rendering * Remove debugger statement * Pass base resolution URL directly to Swagger-Client subtree resolver * Remove accidental comment * Migrate additional options
This commit is contained in:
@@ -82,7 +82,7 @@ let hasWarnedAboutResolveSpecDeprecation = false
|
|||||||
|
|
||||||
export const resolveSpec = (json, url) => ({specActions, specSelectors, errActions, fn: { fetch, resolve, AST }, getConfigs}) => {
|
export const resolveSpec = (json, url) => ({specActions, specSelectors, errActions, fn: { fetch, resolve, AST }, getConfigs}) => {
|
||||||
if(!hasWarnedAboutResolveSpecDeprecation) {
|
if(!hasWarnedAboutResolveSpecDeprecation) {
|
||||||
console.warn(`specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use resolveIn instead!`)
|
console.warn(`specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!`)
|
||||||
hasWarnedAboutResolveSpecDeprecation = true
|
hasWarnedAboutResolveSpecDeprecation = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,11 +162,23 @@ const debResolveSubtrees = debounce(async () => {
|
|||||||
|
|
||||||
const specStr = specSelectors.specStr()
|
const specStr = specSelectors.specStr()
|
||||||
|
|
||||||
|
const {
|
||||||
|
modelPropertyMacro,
|
||||||
|
parameterMacro,
|
||||||
|
requestInterceptor,
|
||||||
|
responseInterceptor
|
||||||
|
} = system.getConfigs()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var batchResult = await requestBatch.reduce(async (prev, path) => {
|
var batchResult = await requestBatch.reduce(async (prev, path) => {
|
||||||
const { resultMap, specWithCurrentSubtrees } = await prev
|
const { resultMap, specWithCurrentSubtrees } = await prev
|
||||||
|
const { errors, spec } = await resolveSubtree(specWithCurrentSubtrees, path, {
|
||||||
const { errors, spec } = await resolveSubtree(specWithCurrentSubtrees, path)
|
baseDoc: specSelectors.url(),
|
||||||
|
modelPropertyMacro,
|
||||||
|
parameterMacro,
|
||||||
|
requestInterceptor,
|
||||||
|
responseInterceptor
|
||||||
|
})
|
||||||
|
|
||||||
if(errSelectors.allErrors().size) {
|
if(errSelectors.allErrors().size) {
|
||||||
errActions.clear({
|
errActions.clear({
|
||||||
|
|||||||
26
test/e2e/scenarios/refs.js
Normal file
26
test/e2e/scenarios/refs.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
describe("Remote $ref rendering", function () {
|
||||||
|
let mainPage
|
||||||
|
beforeEach(function (client, done) {
|
||||||
|
|
||||||
|
mainPage = client
|
||||||
|
// expand the models so we don't have to manually do it
|
||||||
|
.url("localhost:3200?defaultModelsExpandDepth=5")
|
||||||
|
.page.main()
|
||||||
|
|
||||||
|
client.waitForElementVisible(".download-url-input", 5000)
|
||||||
|
.pause(2000)
|
||||||
|
.clearValue(".download-url-input")
|
||||||
|
.setValue(".download-url-input", "http://localhost:3200/test-specs/refs/api1.yaml")
|
||||||
|
.click("button.download-url-button")
|
||||||
|
.pause(1000)
|
||||||
|
|
||||||
|
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("renders a remote $ref correctly", function (client) {
|
||||||
|
mainPage.expect.element("#model-TestResponse > span > div > span > span > span.inner-object > table > tbody > tr:nth-child(2) > td:nth-child(2) > span > span > div > div > p").text.to.equal("this is a api2prop")
|
||||||
|
|
||||||
|
client.end()
|
||||||
|
})
|
||||||
|
})
|
||||||
32
test/e2e/specs/refs/api1.yaml
Normal file
32
test/e2e/specs/refs/api1.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
description: |
|
||||||
|
This is a test to show how model refererence from another file are failing.
|
||||||
|
This file references api2.yaml. If you load this file first in the browser it fails.
|
||||||
|
However, if you load api2.yaml first, then load this one it will work.
|
||||||
|
version: 1.0.0
|
||||||
|
title: API1 Test
|
||||||
|
paths:
|
||||||
|
'/test-api-1':
|
||||||
|
get:
|
||||||
|
summary: Api 1
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'api 2 response'
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/TestResponse'
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Api1Prop:
|
||||||
|
type: string
|
||||||
|
example: 'api1prop-value'
|
||||||
|
|
||||||
|
TestResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
api1prop:
|
||||||
|
$ref: '#/components/schemas/Api1Prop'
|
||||||
|
api2prop:
|
||||||
|
$ref: 'api2.yaml#/components/schemas/Api2Prop'
|
||||||
32
test/e2e/specs/refs/api2.yaml
Normal file
32
test/e2e/specs/refs/api2.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
description: |
|
||||||
|
This is a test to show how model refererence from another file are failing.
|
||||||
|
This file is referenced api1.yaml. If you load api1.yaml first in the browser it fails.
|
||||||
|
However, if you load this file first, then load api1.yaml it will work.
|
||||||
|
version: 1.0.0
|
||||||
|
title: API2 Test
|
||||||
|
paths:
|
||||||
|
'/test-api-2':
|
||||||
|
get:
|
||||||
|
summary: Api 2
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: api 2 response
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/TestResponse2'
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Api2Prop:
|
||||||
|
type: string
|
||||||
|
description: this is a api2prop
|
||||||
|
example: 'api1prop-value'
|
||||||
|
|
||||||
|
TestResponse2:
|
||||||
|
type: object
|
||||||
|
description: This is a test prop
|
||||||
|
properties:
|
||||||
|
api2prop:
|
||||||
|
$ref: '#/components/schemas/Api2Prop'
|
||||||
Reference in New Issue
Block a user