package alien4cloud.it.suggestion;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.alien4cloud.tosca.model.types.ArtifactType;
import org.alien4cloud.tosca.model.types.CapabilityType;
import org.alien4cloud.tosca.model.types.NodeType;
import org.alien4cloud.tosca.model.types.RelationshipType;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.junit.Assert;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import alien4cloud.dao.ElasticSearchDAO;
import alien4cloud.it.Context;
import alien4cloud.model.common.SuggestionEntry;
import alien4cloud.rest.model.RestResponse;
import alien4cloud.rest.suggestion.CreateSuggestionEntryRequest;
import alien4cloud.rest.utils.JsonUtil;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
public class SuggestionDefinitionsSteps {
private static final Map<String, String> toESType = Maps.newHashMap();
static {
toESType.put("node", NodeType.class.getSimpleName().toLowerCase());
toESType.put("artifact", ArtifactType.class.getSimpleName().toLowerCase());
toESType.put("capability", CapabilityType.class.getSimpleName().toLowerCase());
toESType.put("relationship", RelationshipType.class.getSimpleName().toLowerCase());
}
@When("^I ask suggestions for tag \"([^\"]*)\" with \"([^\"]*)\"$")
public void I_ask_suggestions_for_tag_with(String path, String searchText) throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/suggest/tag/" + path + "/" + searchText));
}
@Then("^The suggestion response should contains (\\d+) elements$")
public void The_suggestion_response_should_contains_elements(int expectedSize) throws Throwable {
RestResponse<String[]> restResponse = JsonUtil.read(Context.getInstance().getRestResponse(), String[].class);
String[] suggestionResp = restResponse.getData();
assertNotNull(suggestionResp);
assertEquals(expectedSize, suggestionResp.length);
}
@Then("^The suggestion response should contains \"([^\"]*)\"$")
public void The_suggestion_response_should_contains(String expectedValue) throws Throwable {
RestResponse<String[]> restResponse = JsonUtil.read(Context.getInstance().takeRestResponse(), String[].class);
String[] suggestionResp = restResponse.getData();
assertNotNull(suggestionResp);
assertTrue(Arrays.asList(suggestionResp).contains(expectedValue));
}
@Then("^The RestResponse should contain (\\d+) element\\(s\\):$")
public void The_RestResponse_should_contain_element_s_(int numberOfElements, List<String> expectedSuggestions) throws Throwable {
String[] suggestions = JsonUtil.read(Context.getInstance().getRestResponse(), String[].class).getData();
Assert.assertEquals(numberOfElements, suggestions.length);
Arrays.sort(suggestions, 0, suggestions.length);
String[] expectedSuggestionsArray = expectedSuggestions.toArray(new String[expectedSuggestions.size()]);
Arrays.sort(expectedSuggestionsArray, 0, expectedSuggestionsArray.length);
Assert.assertArrayEquals(expectedSuggestionsArray, suggestions);
}
@When("^I get all suggestions for property \"([^\"]*)\" of \"([^\"]*)\" \"([^\"]*)\"$")
public void iGetAllSuggestionsForPropertyOf(String property, String type, String elementId) throws Throwable {
String suggestionId = SuggestionEntry.generateId("toscaelement", toESType.get(type), elementId, property);
String suggestionsText = Context.getRestClientInstance().get("/rest/v1/suggestions/" + suggestionId + "/values");
Context.getInstance().registerRestResponse(suggestionsText);
}
@When("^I get suggestions for text \"([^\"]*)\" for property \"([^\"]*)\" of \"([^\"]*)\" \"([^\"]*)\"$")
public void iGetSuggestionsForTextForPropertyOf(String input, String property, String type, String elementId) throws Throwable {
String suggestionId = SuggestionEntry.generateId("toscaelement", toESType.get(type), elementId, property);
String suggestionsText = Context.getRestClientInstance().getUrlEncoded("/rest/v1/suggestions/" + suggestionId + "/values",
Arrays.<NameValuePair> asList(new BasicNameValuePair("input", input), new BasicNameValuePair("limit", "2")));
Context.getInstance().registerRestResponse(suggestionsText);
}
@When("^I add suggestion \"([^\"]*)\" for property \"([^\"]*)\" of \"([^\"]*)\" \"([^\"]*)\"$")
public void iAddSuggestionForPropertyOf(String value, String property, String type, String elementId) throws Throwable {
String suggestionId = SuggestionEntry.generateId("toscaelement", toESType.get(type), elementId, property);
Context.getRestClientInstance().put("/rest/v1/suggestions/" + suggestionId + "/values/" + value);
}
@And("^I initialize default suggestions entry$")
public void iInitializeDefaultSuggestionsEntry() throws Throwable {
String response = Context.getRestClientInstance().postUrlEncoded("/rest/v1/suggestions/init", new ArrayList<NameValuePair>());
Assert.assertNull(JsonUtil.read(response).getError());
}
@And("^The RestResponse should contain (\\d+) element\\(s\\) in this order:$")
public void theRestResponseShouldContainElementSInThisOrder(int numberOfElements, List<String> expectedSuggestions) throws Throwable {
String[] suggestions = JsonUtil.read(Context.getInstance().getRestResponse(), String[].class).getData();
Assert.assertEquals(numberOfElements, suggestions.length);
String[] expectedSuggestionsArray = expectedSuggestions.toArray(new String[expectedSuggestions.size()]);
Assert.assertArrayEquals(expectedSuggestionsArray, suggestions);
}
@Given("^I create suggestion for property \"([^\"]*)\" of \"([^\"]*)\" \"([^\"]*)\" with initial values \"([^\"]*)\"$")
public void iCreateSuggestionForPropertyOfWithInitialValues(String property, String type, String elementId, String initialValues) throws Throwable {
String response = Context.getRestClientInstance().postJSon(
"/rest/v1/suggestions/",
JsonUtil.toString(new CreateSuggestionEntryRequest(ElasticSearchDAO.TOSCA_ELEMENT_INDEX, toESType.get(type), elementId, property,
Sets
.newHashSet(initialValues.split(",")))));
Assert.assertNull(JsonUtil.read(response).getError());
}
@When("^I ask suggestions for node type with \"([^\"]*)\"$")
public void iAskSuggestionsForNodeTypeWith(String searchText) throws Throwable {
Context.getInstance().registerRestResponse(
Context.getRestClientInstance().getUrlEncoded("/rest/v1/suggest/nodetypes", Lists.newArrayList(new BasicNameValuePair("text", searchText))));
}
}