org.kew.rmf.reconciliation.ws.GeneralReconciliationServiceStepdefs.java Source code

Java tutorial

Introduction

Here is the source code for org.kew.rmf.reconciliation.ws.GeneralReconciliationServiceStepdefs.java

Source

/*
 * Reconciliation and Matching Framework
 * Copyright  2014 Royal Botanic Gardens, Kew
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.kew.rmf.reconciliation.ws;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import java.util.Map;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.codehaus.jackson.type.TypeReference;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.kew.rmf.refine.domain.metadata.Metadata;
import org.kew.rmf.refine.domain.query.Query;
import org.kew.rmf.refine.domain.response.QueryResponse;
import org.kew.rmf.refine.domain.response.QueryResult;
import org.skyscreamer.jsonassert.JSONAssert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import cucumber.api.PendingException;
import cucumber.api.java.Before;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

@WebAppConfiguration
@ContextConfiguration("classpath:/META-INF/spring/cucumber.xml")
public class GeneralReconciliationServiceStepdefs extends WebMvcConfigurationSupport {
    private static Logger log = LoggerFactory.getLogger(GeneralReconciliationServiceStepdefs.class);

    private static final String JSON_UTF8_S = "application/json;charset=UTF-8";
    private static final MediaType JSON_UTF8 = MediaType.parseMediaType(JSON_UTF8_S);

    @Autowired
    private WebApplicationContext wac;

    private ObjectMapper mapper = new ObjectMapper();
    private MockMvc mockMvc;

    private String responseJson;

    private MvcResult result;

    public GeneralReconciliationServiceStepdefs() {
        mapper.setSerializationInclusion(Inclusion.NON_NULL);
    }

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

        // TODO: Temporary fix to allow test configuration to have loaded.
        // Once the ReconciliatioService allows querying for this, this should be replaced.
        try {
            Thread.sleep(2L * 1000L);
        } catch (InterruptedException e) {
        }
    }

    @When("^I query for metadata of the \"(.*?)\" reconciliation service$")
    public void i_query_for_metadata_of_the_reconciliation_service(String configName) throws Throwable {
        // Call
        result = mockMvc.perform(get("/reconcile/" + configName).accept(JSON_UTF8))
                //            .andExpect(status().isOk())
                .andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        if (result.getResponse().getStatus() == HttpStatus.OK.value()) {
            responseJson = result.getResponse().getContentAsString();
            log.debug("Response as string was {}", responseJson);
        }
    }

    @Then("^I receive an HTTP (\\d+) result\\.$")
    public void i_receive_an_HTTP_result(int expectedStatus) throws Throwable {
        Assert.assertThat("Expected HTTP Status " + expectedStatus, result.getResponse().getStatus(),
                Matchers.equalTo(expectedStatus));
    }

    @Then("^I receive the following metadata response:$")
    public void i_receive_the_following_metadata_response(String expectedResponseString) throws Throwable {
        Metadata responseMetadata = mapper.readValue(responseJson, Metadata.class);

        // Check response
        log.info("Received response {}", responseMetadata);

        Metadata expectedResponse = new ObjectMapper().readValue(expectedResponseString, Metadata.class);
        Assert.assertThat("Metadata response correct", responseMetadata, Matchers.equalTo(expectedResponse));
    }

    @When("^I make a match query for \"(.*?)\"$")
    public void i_make_a_match_query_for(String queryString) throws Throwable {
        // Call
        result = mockMvc.perform(get("/match/generalTest?" + queryString).accept(JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        responseJson = result.getResponse().getContentAsString();
        log.debug("Response as string was {}", responseJson);
    }

    @Then("^I receive the following match response:$")
    public void i_receive_the_following_match_response(String expectedJson) throws Throwable {
        JSONAssert.assertEquals(expectedJson, responseJson, true);
    }

    @When("^I make the reconciliation query:$")
    public void i_make_the_reconciliation_query(String queryJson) throws Throwable {
        Query query = mapper.readValue(queryJson, Query.class);

        log.debug("Query is {}", "/reconcile/generalTest?query=" + mapper.writeValueAsString(query));

        result = mockMvc
                .perform(post("/reconcile/generalTest?query={query}", mapper.writeValueAsString(query))
                        .accept(JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        responseJson = result.getResponse().getContentAsString();
        log.debug("Response as string was {}", responseJson);
    }

    @Then("^I receive the following reconciliation response:$")
    public void i_receive_the_following_reconciliation_response(String expectedResponseString) throws Throwable {
        QueryResponse<QueryResult> actualResponse = mapper.readValue(responseJson,
                new TypeReference<QueryResponse<QueryResult>>() {
                });

        // Check response
        log.info("Received response {}", actualResponse);

        QueryResponse<QueryResult> expectedResponse = mapper.readValue(expectedResponseString,
                new TypeReference<QueryResponse<QueryResult>>() {
                });
        Assert.assertThat("QueryResponse<QueryResult> response correct", actualResponse,
                Matchers.equalTo(expectedResponse));
    }

    @When("^I make the reconciliation queries:$")
    public void i_make_the_reconciliation_queries(String queriesJson) throws Throwable {
        Map<String, Query> queries = mapper.readValue(queriesJson, new TypeReference<Map<String, Query>>() {
        });

        log.debug("Query is {}", "/reconcile/generalTest?queries=" + mapper.writeValueAsString(queries));

        result = mockMvc
                .perform(post("/reconcile/generalTest?queries={queries}", mapper.writeValueAsString(queries))
                        .accept(JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        responseJson = result.getResponse().getContentAsString();
        log.debug("Response as string was {}", responseJson);
    }

    @Then("^I receive the following reconciliation multiple response:$")
    public void i_receive_the_following_reconciliation_multiple_response(String expectedResponseString)
            throws Throwable {
        Map<String, QueryResponse<QueryResult>> actualResponse = mapper.readValue(responseJson,
                new TypeReference<Map<String, QueryResponse<QueryResult>>>() {
                });

        // Check response
        log.info("Received response {}", actualResponse);

        Map<String, QueryResponse<QueryResult>> expectedResponse = mapper.readValue(expectedResponseString,
                new TypeReference<Map<String, QueryResponse<QueryResult>>>() {
                });
        Assert.assertThat("QueryResponse<QueryResult> multiple response correct", actualResponse,
                Matchers.equalTo(expectedResponse));
    }

    @When("^I make the reconciliation suggest query with prefix \"(.*?)\"$")
    public void i_make_the_reconciliation_suggest_query_with_prefix(String prefix) throws Throwable {
        result = mockMvc.perform(get("/reconcile/generalTest?prefix=" + prefix).accept(JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        responseJson = result.getResponse().getContentAsString();
        log.debug("Response as string was {}", responseJson);
    }

    @When("^I make the reconciliation suggest property query with prefix \"(.*?)\"$")
    public void i_make_the_reconciliation_suggest_property_query_with_prefix(String prefix) throws Throwable {
        result = mockMvc.perform(get("/reconcile/generalTest/suggestProperty?prefix=" + prefix).accept(JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        responseJson = result.getResponse().getContentAsString();
        log.debug("Response as string was {}", responseJson);
    }

    @When("^I make the reconciliation suggest type query with prefix \"(.*?)\"$")
    public void i_make_the_reconciliation_suggest_type_query_with_prefix(String prefix) throws Throwable {
        result = mockMvc.perform(get("/reconcile/generalTest/suggestType?prefix=" + prefix).accept(JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(JSON_UTF8_S)).andReturn();

        responseJson = result.getResponse().getContentAsString();
        log.debug("Response as string was {}", responseJson);
    }

    @When("^I make a bulk match query with a file containing these rows:$")
    public void i_make_a_bulk_match_query_with_a_file_containing_these_rows(String allRows) throws Throwable {
        MockMultipartFile multipartFile = new MockMultipartFile("file", allRows.getBytes());

        result = mockMvc.perform(MockMvcRequestBuilders.fileUpload("/filematch/generalTest/").file(multipartFile))
                .andExpect(status().is(200)).andReturn();
    }

    @Then("^I receive the following result file:$")
    public void i_receive_the_following_result_file(String expectedFile) throws Throwable {
        String fileName = result.getResponse().getHeader("X-File-Download");

        result = mockMvc.perform(get("/download/" + fileName)).andExpect(status().is(200)).andReturn();

        String actualFile = result.getResponse().getContentAsString();
        log.info("File received is\n{}", actualFile);

        String[] expectedFileLines = expectedFile.split("\r?\n|\r");
        String[] actualFileLines = actualFile.split("\r?\n|\r");

        for (int i = 0; i < expectedFileLines.length; i++) {
            String expectedLine = expectedFileLines[i];
            String actualLine = actualFileLines[i];
            try {
                log.debug("Expecting line {}, got {}", expectedLine, actualLine);
                assertThat(actualLine, is(expectedLine));
            } catch (IndexOutOfBoundsException e) {
                throw new IndexOutOfBoundsException(
                        String.format(" line %s not found in match output.", expectedLine));
            }
        }
        assertThat(actualFileLines.length, is(expectedFileLines.length));
    }

    @When("^I make the reconciliation suggest flyout request with id \"(.*?)\"$")
    public void i_make_the_reconciliation_suggest_flyout_request_with_id(String id) throws Throwable {
        throw new PendingException("Not bothering to add WireMock or similar to test something so simple.");
        //result = mockMvc.perform(get("/reconcile/generalTest/flyout/"+id).accept(JSON_UTF8))
        //      .andExpect(status().isOk())
        //      .andExpect(content().contentType(JSON_UTF8_S))
        //      .andReturn();

        //responseJson = result.getResponse().getContentAsString();
        //log.debug("Response as string was {}", responseJson);
    }

    @Then("^I receive the following flyout response:$")
    public void i_receive_the_following_flyout_response(String expectedJson) throws Throwable {
        JSONAssert.assertEquals(expectedJson, responseJson, true);
    }
}