Как итеративно создавать файлы Pact в pact jvm - PullRequest
0 голосов
/ 27 июня 2018

Итак, у меня есть файл json, в котором содержатся некоторые данные запросов и ответов, и я хочу выполнить итерацию этих данных и создать файл пакта, который использует каждый запрос и ответ.

Так что в данный момент я использую параметризованный тест в junit для итерации наших данных json, и это в основном работает, за исключением того, что имя производителя одинаково для всех пактов, оно создает один и тот же файл и перезаписывает предыдущий .

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

Не уверен, есть ли лучший способ сделать это, я посмотрел на Github для Pact Jvm и просмотрел переполнение стека, но не смог найти кого-то, создающего файлы пакта, без статической спецификации всех данных.

1 Ответ

0 голосов
/ 28 июня 2018

Файл Pact - это, по сути, документ JSON, который содержит сведения о потребителе, поставщике и список взаимодействий. В вашем случае, похоже, у вас есть тот же потребитель и поставщик, но файл JSON с запросами и ответами, которые составляют взаимодействия.

Таким образом, вам нужно создать один файл пакта, но с добавлением взаимодействия для каждого элемента в вашем файле JSON.

Есть несколько способов сделать это, но если вы измените свой пример теста, вы можете связать вызовы с помощью построителя DSL, вызвав .uponReceiving снова после последнего .body. Вы можете сделать это в цикле, каждый дополнительный вызов .uponReceiving начнет добавлять новое взаимодействие в пакт. Вам нужно будет дать каждому взаимодействию уникальное описание.

Затем позвоните .toPact() в конце, чтобы создать окончательный договор.

...