Tam Norris
05/18/2023, 4:58 PMasync getProduct(id: number) {
return axios
`.get(${this.url}/products/${id})`
.then((r: any) => new Product(r.data.id, r.data.name, r.data.type))
.catch((e: any) => new ErrorResponse(e.data.errorCode, e.data.errorMessage))
}Yousaf Nabi (pactflow.io)
Yousaf Nabi (pactflow.io)
Tam Norris
05/18/2023, 8:58 PMit("product does not exist", async () => {
// set up Pact interactions
const expectedError = { errorCode: '1223', errorMessage: 'Product not found' };
mockProvider
.given("a product with ID 11 does not exist")
.uponReceiving("a request to get a product that doesn't exist")
.withRequest({
method: "GET",
path: "/products/11"
})
.willRespondWith({
status: 404,
body: like(expectedError)
});
return mockProvider.executeTest(async (mockserver) => {
const api = new ProductApiClient(mockserver.url);
const errorResponse = await api.getProduct(11);
expect(errorResponse).toEqual(new ErrorResponse('1223', 'Product not found'));
return;
});
});
But this results in TypeError: Cannot read properties of undefined (reading 'errorCode')Yousaf Nabi (pactflow.io)
Matt (pactflow.io / pact-js / pact-go)
e.data does not exist on the error object. Axios (from googling) returns it as e.response
https://github.com/axios/axios/issues/376#issuecomment-238034016Matt (pactflow.io / pact-js / pact-go)
new ErrorResponse(e.response.errorCode, e.response.errorMessage) type thing.Matt (pactflow.io / pact-js / pact-go)
Tam Norris
05/19/2023, 1:33 PMit("product does not exist", async () => {
// set up Pact interactions
const expectedError = { errorCode: 'ERR_BAD_REQUEST', errorMessage: 'Request failed with status code 404' };
mockProvider
.given("a product with ID 11 does not exist")
.uponReceiving("a request to get a product that doesn't exist")
.withRequest({
method: "GET",
path: "/products/11"
})
.willRespondWith({
status: 404,
body: like(expectedError)
});
return mockProvider.executeTest(async (mockserver) => {
const api = new ProductApiClient(mockserver.url);
await expect(api.getProduct2(11)).rejects.toMatch('Request failed with status code 404');
return;
});
});Tam Norris
05/19/2023, 1:37 PMasync getProduct2(id: number) {
try {
return await axios
`.get(${this.url}/products/${id})`
.then((r: any) => new Product(r.data.id, r.data.name, r.data.type));
} catch (error) {
if (error.errors && error.errors.length > 0) {
return Promise.reject(new Error(error.errors));
} else {
const errorResponse = new ErrorResponse(error.response.data.errorCode, error.response.data.errorMessage )
return Promise.reject(error.response.data.errorMessage)
}
}
}
Above will only work for a single error and just returning the error message. Would like to now see if I can extend it to return the whole error response and validate against that.Tam Norris
05/19/2023, 2:53 PMcatch (error) {
if (error.errors && error.errors.length > 0) {
return Promise.reject(new Error(error.errors));
} else {
const errorResponse = new ErrorResponse(
error.response.data.errorCode,
error.response.data.errorMessage
);
error.response.data.errorMessage));
return Promise.reject(errorResponse);
}
}
but then in my consumer spec test I have....
await expect(api.getProduct2(11)).rejects.toMatch(new ErrorResponse('ERR_BAD_REQUEST', 'Request failed with status code 404'));
This gives me error ....
Argument of type 'ErrorResponse' is not assignable to parameter of type 'string | RegExp'.Tam Norris
05/20/2023, 12:52 PMawait expect(api.getProduct2(11)).rejects.toEqual(new ErrorResponse('ERR_BAD_REQUEST', 'Request failed with status code 404'));