Merge pull request #3294 from owenconti/bug/3072-error-response-fixes

#3072 - Body and headers on error responses
This commit is contained in:
shockey
2017-06-29 17:27:45 -07:00
committed by GitHub
5 changed files with 81 additions and 26 deletions

View File

@@ -40,10 +40,8 @@ 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 duration = response.get("duration") const duration = response.get("duration")
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

@@ -6,7 +6,7 @@ export default class ResponseBody extends React.Component {
static propTypes = { static propTypes = {
content: PropTypes.any.isRequired, content: PropTypes.any.isRequired,
contentType: PropTypes.string.isRequired, contentType: PropTypes.string,
getComponent: PropTypes.func.isRequired, getComponent: PropTypes.func.isRequired,
headers: PropTypes.object, headers: PropTypes.object,
url: PropTypes.string url: PropTypes.string

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)
})
})
}) })