0

So I have a json file that has some request and response data, and what I want to accomplish is iterate through this data and create a pact file that uses each request and response.

So at the moment I am using a parameterized test in junit to kinda iterate through our json data, and this basically works except for because the producer name is the same for all pacts, it creates the same file and is overwriting the previous.

private JsonObject requestObject;
private static Gson gson = new Gson();
private static File jsonFile = readJsonFile();
private static  int randValue = new Random().nextInt(500);
private static String consmerName = "phx-ev-consumer" + randValue;
@Rule
public PactProviderRuleMk2 provider = new PactProviderRuleMk2("phx-ev-svc-provider", "localhost", 8080, this);
final RestTemplate restTemplate = new RestTemplate();

public EligibilityApiConsumerPactTest(JsonObject requestObject) {
    this.requestObject = requestObject;
}




@Parameterized.Parameters
public static Collection primeNumbers() throws JsonSyntaxException, JsonIOException, FileNotFoundException {
    return getJson();
}

@Pact(state = "provider accets submit contact form", provider = "phx-ev-svc-provider" , consumer = "phx-ev-consumer")
public RequestResponsePact createFragment(PactDslWithProvider builder) {
    Map<String, String> requestHeaders = new HashMap<>();
    requestHeaders.put("Content-Type", "application/json");
    requestHeaders.put("SM_USER", "wtadmin");
    requestHeaders.put("Cookie", "SMCHALLENGE=YES");
    // Auth headers
    String authString = "wtadmin:labcorp1";
    String authEncoded = Base64.getEncoder().encodeToString(authString.getBytes());
    requestHeaders.put("Authorization", "Basic " + authEncoded);
    Map<String, String> responseHeaders = new HashMap<>();
    responseHeaders.put("Content-Type", "application/json");
    String jsonRequest = requestObject.get("request").toString();
    String jsonResponse = requestObject.get("response").toString();

    RequestResponsePact pact = builder.given("phx-eligibility").uponReceiving("Phoenix Eligibility Request")
            .method("POST").headers(requestHeaders).body(jsonRequest).path("/phx-rest/eligibility")
            .willRespondWith().status(200).headers(responseHeaders).body(jsonResponse).toPact();
    return pact;
}

@Test
@PactVerification("phx-ev-svc-provider")
public void runTest() throws IOException {
    MultiValueMap<String, String> requestHeaders = new LinkedMultiValueMap<>();
    requestHeaders.add("Content-Type", "application/json");
    requestHeaders.add("SM_USER", "wtadmin");
    requestHeaders.add("Cookie", "SMCHALLENGE=YES");
    // Auth headers
    String authString = "wtadmin:labcorp1";
    String authEncoded = Base64.getEncoder().encodeToString(authString.getBytes());
    requestHeaders.add("Authorization", "Basic " + authEncoded);
    String jsonRequest = requestObject.get("request").toString();
    restTemplate.exchange(provider.getConfig().url() + "/phx-rest/eligibility", HttpMethod.POST,
            new HttpEntity<>(jsonRequest, requestHeaders), String.class);

}

public static List<JsonObject> getJson() throws JsonSyntaxException, JsonIOException, FileNotFoundException {
    List<JsonObject> results = new ArrayList<JsonObject>();
    JsonObject jsonObject = gson.fromJson(new FileReader(jsonFile), JsonObject.class);
    JsonArray input = jsonObject.getAsJsonArray("input");
    Iterator<JsonElement> iter = input.iterator();
    while (iter.hasNext()) {
        JsonObject obj = (JsonObject) iter.next();
        results.add(obj);
    }
    return results;
}

public static File readJsonFile() {
    File base = new File("");
    File inputFile = new File(base.getAbsolutePath() + "/pact/input/eligibility.json");
    return inputFile;
}

Not sure if there is a better way to accomplish this, I have looked at the Github for Pact Jvm and looked through stack overflow but have not been able to find someone creating pact files, without statically specifying all of the data.

1 Answers1

0

A Pact file is essentially a JSON document that contains details about a consumer, a provider and a list of interactions. In your case, you seems to have the same consumer and provider, but a JSON file with the requests and responses that make up the interactions.

So you need to create a single pact file, but with an interaction added for each item in your JSON file.

There are a number of ways you can do that, but if you modify your example test, you can chain the calls using the DSL builder by calling .uponReceiving again after the last .body. You can do this in a loop, each additional call to .uponReceiving will start adding a new interaction to the pact. You will have to give each interaction a unique description.

Then call .toPact() at the end to create the final pact.