package alien4cloud.it.plugin;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.common.collect.Lists;
import org.junit.Assert;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import alien4cloud.dao.model.GetMultipleDataResult;
import alien4cloud.it.Context;
import alien4cloud.it.common.CommonStepDefinitions;
import alien4cloud.model.common.Tag;
import alien4cloud.plugin.model.PluginUsage;
import alien4cloud.rest.model.RestResponse;
import alien4cloud.rest.utils.JsonUtil;
import cucumber.api.PendingException;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class PluginDefinitionsSteps {
private static final CommonStepDefinitions COMMON_STEP_DEFINITIONS = new CommonStepDefinitions();
private static final Map<String, Path> conditionToPath = Maps.newHashMap();
private static final Path PLUGIN_PATH = Paths.get("../alien4cloud-mock-paas-provider-plugin/target/alien4cloud-mock-paas-provider-plugin-1.0-"
+ Context.VERSION + ".zip");
private static final Path INVALID_PLUGIN_PATH = Paths.get("../alien4cloud-mock-paas-provider-plugin/target/alien4cloud-mock-paas-provider-plugin-invalid-"
+ Context.VERSION + ".zip");
private static final String PLUGIN_ID = "alien4cloud-mock-paas-provider";
private static final String NEXT_VERSION_PLUGIN_ID = "alien4cloud-mock-paas-provider";
private final ObjectMapper mapper = new ObjectMapper();
private CommonStepDefinitions commonSteps = new CommonStepDefinitions();
static {
Path nextVersionSameConfiguration = Paths.get("../alien4cloud-mock-paas-provider-plugin/target/alien4cloud-mock-paas-provider-plugin-1.1-"
+ Context.VERSION + ".zip");
Path nextVersionDifferentConfiguration = Paths
.get("../alien4cloud-mock-paas-provider-plugin/target/alien4cloud-mock-paas-provider-plugin-1.1-different-conf-" + Context.VERSION + ".zip");
conditionToPath.put("has the same configuration type", nextVersionSameConfiguration);
conditionToPath.put("has a different configuration type", nextVersionDifferentConfiguration);
}
@Given("^I upload a plugin$")
public void I_upload_a_plugin() throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().postMultipart("/rest/v1/plugins", "file", Files.newInputStream(PLUGIN_PATH)));
}
@Given("^I have uploaded a plugin$")
public void I_have_uploaded_a_plugin() throws Throwable {
I_upload_a_plugin();
commonSteps.I_should_receive_a_RestResponse_with_no_error();
}
@Given("^I upload an invalid plugin$")
public void I_upload_an_invalid_plugin() throws Throwable {
Context.getInstance().registerRestResponse(
Context.getRestClientInstance().postMultipart("/rest/v1/plugins", "file", Files.newInputStream(INVALID_PLUGIN_PATH)));
}
@When("^I search for plugins$")
public void I_search_for_plugins() throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/plugins"));
}
@Then("^The plugin response should contains (\\d+) plugin$")
public void The_plugin_response_should_contains_plugin(int count) throws Throwable {
RestResponse<GetMultipleDataResult> restResponse = JsonUtil.read(Context.getInstance().takeRestResponse(), GetMultipleDataResult.class);
assertNotNull(restResponse);
assertNotNull(restResponse.getData());
assertNotNull(restResponse.getData().getData());
assertEquals(count, restResponse.getData().getData().length);
}
@When("^I enable the plugin$")
public void I_enable_the_plugin() throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/plugins/" + PLUGIN_ID + "/enable"));
}
@When("^I disable the plugin$")
public void I_disable_the_plugin() throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/plugins/" + PLUGIN_ID + "/disable"));
}
@Given("^I use the plugin$")
public void I_use_the_plugin() throws Throwable {
throw new PendingException();
}
@Then("^I should receive a RestResponse with a non-empty list of plugin usages.$")
public void I_should_receive_a_RestResponse_with_a_non_empty_list_of_plugin_usages() throws Throwable {
List<PluginUsage> restResponse = mapper.readValue(Context.getInstance().takeRestResponse(), new TypeReference<List<PluginUsage>>() {
});
assertNotNull(restResponse);
assertTrue(restResponse.size() > 0);
}
@When("^I remove the plugin$")
public void I_remove_the_plugin() throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().delete("/rest/v1/plugins/" + PLUGIN_ID));
}
@Then("^the result should not be empty$")
public void the_result_should_not_be_empty() throws Throwable {
RestResponse<?> response = JsonUtil.read(Context.getInstance().takeRestResponse());
// List<PaaSProviderDTO> providersResponse = JsonUtil.toList(JsonUtil.toString(response.getData()), PaaSProviderDTO.class);
// assertNotNull(providersResponse);
// assertTrue(providersResponse.size() > 0);
Assert.fail("Fix test");
}
@When("^I get the plugin configuration$")
public void I_get_the_plugin_configuration() throws Throwable {
Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/plugins/" + PLUGIN_ID + "/config"));
}
@Then("^there should be a configuration object in the response$")
public void there_should_be_a_configuration_object_in_the_response() throws Throwable {
RestResponse<?> response = JsonUtil.read(Context.getInstance().takeRestResponse());
Object pluginConfig = response.getData();
assertNotNull(pluginConfig);
}
@When("^I set the plugin configuration with a valid configuration object$")
public void I_set_the_plugin_configuration_with_a_valid_configuration_object() throws Throwable {
ProviderConfig config = new ProviderConfig();
config.setFirstArgument("haha");
config.setSecondArgument("55");
List<Tag> tags = Lists.newArrayList();
tags.add(new Tag("version", "1.0"));
tags.add(new Tag("maturity", "none"));
tags.add(new Tag("usefull", "no"));
config.setTags(tags);
Context.getInstance().registerRestResponse(
Context.getRestClientInstance().postJSon("/rest/v1/plugins/" + PLUGIN_ID + "/config", JsonUtil.toString(config)));
}
@When("^I set the plugin configuration with an invalid configuration object$")
public void I_set_the_plugin_configuration_with_an_invalid_configuration_object() throws Throwable {
List<Tag> tags = Lists.newArrayList();
tags.add(new Tag("version", "1.0"));
tags.add(new Tag("maturity", "none"));
tags.add(new Tag("usefull", "no"));
Context.getInstance().registerRestResponse(Context.getRestClientInstance().postJSon("/rest/v1/plugins/" + PLUGIN_ID + "/config", JsonUtil.toString(tags)));
}
@Given("^I have set the plugin configuration with a valid configuration object$")
public void I_have_set_the_plugin_configuration_with_a_valid_configuration_object() throws Throwable {
I_set_the_plugin_configuration_with_a_valid_configuration_object();
commonSteps.I_should_receive_a_RestResponse_with_no_error();
}
@Then("^there should be a non empty configuration object in the response$")
public void there_should_be_a_non_empty_configuration_object_in_the_response() throws Throwable {
RestResponse<ProviderConfig> response = JsonUtil.read(Context.getInstance().takeRestResponse(), ProviderConfig.class);
ProviderConfig pluginConfig = response.getData();
assertNotNull(pluginConfig);
assertNotNull(pluginConfig.getTags());
}
@When("^I upload a plugin which \"([^\"]*)\"$")
public void I_upload_a_plugin_which(String pluginCondition) throws Throwable {
Path path = conditionToPath.get(pluginCondition);
Context.getInstance().registerRestResponse(Context.getRestClientInstance().postMultipart("/rest/v1/plugins", "file", Files.newInputStream(path)));
}
@Then("^the new plugin configuration should be the same as for the previous version$")
@Deprecated
public void the_new_plugin_configuration_should_be_the_same_as_for_the_previous_version() throws Throwable {
String prevPluginResp = Context.getRestClientInstance().get("/rest/v1/plugins/" + PLUGIN_ID + "/config");
String pluginResp = Context.getRestClientInstance().get("/rest/v1/plugins/" + NEXT_VERSION_PLUGIN_ID + "/config");
Object pluginConfig = JsonUtil.read(pluginResp).getData();
Object prevPluginConfig = JsonUtil.read(prevPluginResp).getData();
String pluginConfigStr = JsonUtil.toString(pluginConfig);
String prevPluginConfigStr = JsonUtil.toString(prevPluginConfig);
assertEquals(prevPluginConfigStr, pluginConfigStr);
}
@Then("^the new plugin configuration should not be the same as for the previous version$")
@Deprecated
public void the_new_plugin_configuration_should_not_be_the_same_as_for_the_previous_version() throws Throwable {
String prevPluginResp = Context.getRestClientInstance().get("/rest/v1/plugins/" + PLUGIN_ID + "/config");
String pluginResp = Context.getRestClientInstance().get("/rest/v1/plugins/" + NEXT_VERSION_PLUGIN_ID + "/config");
Object pluginConfig = JsonUtil.read(pluginResp).getData();
Object prevPluginConfig = JsonUtil.read(prevPluginResp).getData();
String pluginConfigStr = JsonUtil.toString(pluginConfig);
String prevPluginConfigStr = JsonUtil.toString(prevPluginConfig);
assertNotEquals(prevPluginConfigStr, pluginConfigStr);
}
@And("^I (successfully\\s)?upload a plugin from \"([^\"]*)\"$")
public void I_sucesssfully_upload_a_plugin_from(String successfully, String pluginPathText) throws Throwable {
Path pluginDirPath = Paths.get(pluginPathText);
String pluginName = pluginDirPath.getFileName().toString();
Path pluginPath = pluginDirPath.resolve("target").resolve(pluginName + "-" + Context.VERSION + ".zip");
Context.getInstance().registerRestResponse(Context.getRestClientInstance().postMultipart("/rest/v1/plugins", "file", Files.newInputStream(pluginPath)));
if (StringUtils.isNotBlank(successfully)) {
this.COMMON_STEP_DEFINITIONS.I_should_receive_a_RestResponse_with_no_error();
}
}
@And("^I upload a plugin \"([^\"]*)\" from \"([^\"]*)\"$")
public void I_upload_a_plugin_from(String pluginName, String pluginPathText) throws Throwable {
Path pluginDirPath = Paths.get(pluginPathText);
Path pluginPath = pluginDirPath.resolve("target").resolve(pluginName + "-" + Context.VERSION + ".zip");
Context.getInstance().registerRestResponse(Context.getRestClientInstance().postMultipart("/rest/v1/plugins", "file", Files.newInputStream(pluginPath)));
}
}