#3072 - Display response body and headers for requests that result in non-200 responses. Add test to ensure error and response are merged correctly

This commit is contained in:
Owen Conti
2017-06-25 13:28:14 -06:00
parent 165c1d7fcb
commit ddb5704637
4 changed files with 80 additions and 25 deletions

View File

@@ -27,9 +27,7 @@ export default class LiveResponse extends React.Component {
const headers = response.get("headers").toJS() const headers = response.get("headers").toJS()
const notDocumented = response.get("notDocumented") const notDocumented = response.get("notDocumented")
const isError = response.get("error") const isError = response.get("error")
const body = response.get("text")
const body = isError ? response.get("response").get("text") : response.get("text")
const headersKeys = Object.keys(headers) const headersKeys = Object.keys(headers)
const contentType = headers["content-type"] const contentType = headers["content-type"]

View File

@@ -92,28 +92,28 @@ export const resolveSpec = (json, url) => ({specActions, specSelectors, errActio
let specStr = specSelectors.specStr() let specStr = specSelectors.specStr()
return resolve({fetch, spec: json, baseDoc: url, modelPropertyMacro, parameterMacro }) return resolve({fetch, spec: json, baseDoc: url, modelPropertyMacro, parameterMacro })
.then( ({spec, errors}) => { .then( ({spec, errors}) => {
errActions.clear({ errActions.clear({
type: "thrown" type: "thrown"
}) })
if(errors.length > 0) { if(errors.length > 0) {
let preparedErrors = errors let preparedErrors = errors
.map(err => { .map(err => {
console.error(err) console.error(err)
err.line = err.fullPath ? getLineNumberForPath(specStr, err.fullPath) : null err.line = err.fullPath ? getLineNumberForPath(specStr, err.fullPath) : null
err.path = err.fullPath ? err.fullPath.join(".") : null err.path = err.fullPath ? err.fullPath.join(".") : null
err.level = "error" err.level = "error"
err.type = "thrown" err.type = "thrown"
err.source = "resolver" err.source = "resolver"
Object.defineProperty(err, "message", { enumerable: true, value: err.message }) Object.defineProperty(err, "message", { enumerable: true, value: err.message })
return err return err
}) })
errActions.newThrownErrBatch(preparedErrors) errActions.newThrownErrBatch(preparedErrors)
} }
return specActions.updateResolved(spec) return specActions.updateResolved(spec)
}) })
} }
export const formatIntoYaml = () => ({specActions, specSelectors}) => { export const formatIntoYaml = () => ({specActions, specSelectors}) => {

View File

@@ -75,7 +75,12 @@ export default {
[SET_RESPONSE]: (state, { payload: { res, path, method } } ) =>{ [SET_RESPONSE]: (state, { payload: { res, path, method } } ) =>{
let result let result
if ( res.error ) { if ( res.error ) {
result = Object.assign({error: true}, res.err) result = Object.assign({
error: true,
name: res.err.name,
message: res.err.message,
statusCode: res.err.statusCode
}, res.err.response)
} else { } else {
result = res result = res
} }
@@ -86,7 +91,7 @@ export default {
let newState = state.setIn( [ "responses", path, method ], fromJSOrdered(result) ) let newState = state.setIn( [ "responses", path, method ], fromJSOrdered(result) )
// ImmutableJS messes up Blob. Needs to reset its value. // ImmutableJS messes up Blob. Needs to reset its value.
if (res.data instanceof win.Blob) { if (win.Blob && res.data instanceof win.Blob) {
newState = newState.setIn( [ "responses", path, method, "text" ], res.data) newState = newState.setIn( [ "responses", path, method, "text" ], res.data)
} }
return newState return newState

View File

@@ -69,4 +69,56 @@ describe("spec plugin - reducer", function(){
expect(result.toJS()).toEqual(state.toJS()) expect(result.toJS()).toEqual(state.toJS())
}) })
}) })
describe("set response value", function() {
it("should combine the response and error objects", () => {
const setResponse = reducer["spec_set_response"]
const path = "/pet/post"
const method = "POST"
const state = fromJS({})
const result = setResponse(state, {
payload: {
path: path,
method: method,
res: {
error: true,
err: {
message: "Not Found",
name: "Error",
response: {
data: "response data",
headers: {
key: "value"
},
ok: false,
status: 404,
statusText: "Not Found"
},
status: 404,
statusCode: 404
}
}
}
})
let expectedResult = {
error: true,
message: "Not Found",
name: "Error",
data: "response data",
headers: {
key: "value"
},
ok: false,
status: 404,
statusCode: 404,
statusText: "Not Found"
}
const response = result.getIn(["responses", path, method]).toJS()
expect(response).toEqual(expectedResult)
})
})
}) })