Tam Norris
05/22/2023, 9:04 PMinterface MetersResponse {
errors: any[]
meters: any[]
}
const callEcoes = async (url: string, authToken: string, meters: string): Promise<MetersResponse> => {
`const response = await fetch(${url}/api/v1/meters, {`
method: 'POST',
headers: {
Authorization: authToken,
'Content-Type': 'application/json'
},
body: JSON.stringify({
meters: meters
})
})
return (await response.json() as MetersResponse)
}
export { callEcoes, MetersResponse }
This is my mock provider code within consumer spec ..
return mockProvider.executeTest(async (mockserver) => {
// Act
const metersResponse: MetersResponse = await callMeters(mockserver.url,'sgegegeg','2100040885876');
console.log('Type of meters response ' + typeof(metersResponse.meters[0]))
console.log('metersResponse is ' + metersResponse.meters[0]);
// Assert - did we get the expected response
expect(metersResponse.meters[0].meter).toEqual("2100040885876"); //expect(product).toStrictEqual(JSON.stringify(expectedProduct));
return;
When this runs I get the error on the console log of TypeError: Cannot read properties of undefined (reading '0').
If I just remove the .meters[0] then the whole response gets printed to the console but its inside square brackets. Can someone tell me why this response is coming back inside square brackets as this seems to be why I can't validate my assertion on the response. Thanks.Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Tam Norris
05/23/2023, 7:10 AMimport { PactV3 } from "@pact-foundation/pact";
import { MatchersV3 } from "@pact-foundation/pact";
import { callMeters, MetersResponse } from '../../../lambda/helpers/call-meters';
import axios, {AxiosResponse} from 'axios';
import { MetersResonse } from "../models/MetersResponse";
const { like, eachLike } = MatchersV3;
const Pact = PactV3;
const mockProvider = new Pact({
consumer: "cs-consumer",
provider: "db-provider",
});
describe("API Pact test", () => {
it("meter exists", async () => {
const expectedMetersResponse = {
"errors": [],
"meters": [
{
"meter": "2100040885876",
"topline": {
"llf": "N13",
"mtc": "801",
"profile": "03"
...
}
}
const EXPECTED_BODY = MatchersV3.eachLike(expectedMetersResponse);
type metersRequestBody_T = {
meters: string;
}
const reqBodyExample: metersRequestBody_T = {
meters: "2100040885876"
}
mockProvider
.given("a meter with meter core 2100040885876 exists")
.uponReceiving("a request to get meter details with a valid meter")
.withRequest({
method: "POST",
path: "/api/v1/meters",
headers: {
'Content-Type': 'application/json'
},
body: like(reqBodyExample),
})
.willRespondWith({
status: 200,
headers: {
"Content-Type": "application/json; charset=utf-8",
},
body: like(EXPECTED_BODY),
});
return mockProvider.executeTest(async (mockserver) => {
// Act
const metersResponse = await callMeters(mockserver.url,'sgegegeg','2100040885876');
console.log('metersResponse is ' + metersResponse.meters[0]);
// Assert - did we get the expected response
expect(metersResponse.meters[0].meter).toEqual("2100040885876");
return;
});
})
});
``````Matt (pactflow.io / pact-js / pact-go)
This says “I expect an array that has items each of which has the shape `expectedMetersResponse`”Copy codeconst EXPECTED_BODY = MatchersV3.eachLike(expectedMetersResponse);
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
likeTam Norris
05/23/2023, 7:38 AM