package alien4cloud.it.security; 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.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.elasticsearch.common.collect.Lists; import org.elasticsearch.common.collect.Maps; import alien4cloud.it.Context; import alien4cloud.it.Entry; import alien4cloud.rest.model.RestResponse; import alien4cloud.rest.utils.JsonUtil; import alien4cloud.security.users.rest.CreateUserRequest; import alien4cloud.security.model.User; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; public class AuthenticationStepDefinitions { @When("^I retrieve the ALIEN's roles list$") public void I_retrieve_the_ALIEN_s_roles_list() throws Throwable { Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/auth/roles")); } @Given("^I am logged out$") public void I_am_logged_out() throws Throwable { List<NameValuePair> nvps = new ArrayList<NameValuePair>(); Context.getRestClientInstance().postUrlEncoded("/logout", nvps); Context.getRestClientInstance().clearCookies(); } @When("^I authenticate with username \"([^\"]*)\" and password \"([^\"]*)\"$") public void I_authenticate_with_username_and_password(String username, String password) throws Throwable { I_am_logged_out(); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("username", username)); nvps.add(new BasicNameValuePair("password", password)); nvps.add(new BasicNameValuePair("submit", "Login")); Context.getInstance().registerRestResponse(Context.getRestClientInstance().postUrlEncoded("/login", nvps)); } @When("^I create a new user with username \"([^\"]*)\" and password \"([^\"]*)\" in the system$") public void I_create_a_new_user_with_name_and_password_in_the_system(String username, String password) throws Throwable { CreateUserRequest request = new CreateUserRequest(); request.setUsername(username); request.setPassword(password); request.setEmail(username + "@alien4cloud.org"); Context.getInstance().registerRestResponse(Context.getRestClientInstance().postJSon("/rest/v1/users/", JsonUtil.toString(request))); } @When("^I authenticate with \"([^\"]*)\" role$") public void I_authenticate_with_role(String role) throws Throwable { I_am_authenticated_with_role(role); } @Given("^I am authenticated with \"([^\"]*)\" role$") public void I_am_authenticated_with_role(String role) throws Throwable { I_am_logged_out(); switch (role) { case "ADMIN": I_authenticate_with_username_and_password("admin", "admin"); break; case "COMPONENTS_BROWSER": I_authenticate_with_username_and_password("componentBrowser", "componentBrowser"); break; case "COMPONENTS_MANAGER": I_authenticate_with_username_and_password("componentManager", "componentManager"); break; case "APPLICATIONS_MANAGER": I_authenticate_with_username_and_password("applicationManager", "applicationManager"); break; case "APP_MANAGER": I_authenticate_with_username_and_password("appManager", "appManager"); break; case "ARCHITECT": I_authenticate_with_username_and_password("architect", "architect"); break; case "USER": I_authenticate_with_username_and_password("user", "user"); break; default: throw new PendingException(); } } @Given("^There is a \"([^\"]*)\" user in the system$") public void There_is_a_user_in_the_system(String username) throws Throwable { String response = Context.getRestClientInstance().get("/rest/v1/users/" + username); RestResponse<User> userResponse = JsonUtil.read(response, User.class); if (userResponse.getData() == null) { I_create_a_new_user_with_name_and_password_in_the_system(username, username); } } @Given("^There are these users in the system$") public void There_are_these_users_in_the_system(List<String> usernames) throws Throwable { for (String username : usernames) { There_is_a_user_in_the_system(username); } } @Given("^There is no \"([^\"]*)\" user in the system$") public void There_is_no_user_in_the_system(String username) throws Throwable { String response = Context.getRestClientInstance().get("/rest/v1/users/" + username); RestResponse<User> userResponse = JsonUtil.read(response, User.class); if (userResponse.getData() != null) { I_remove_user(username); } } @When("^I get the \"([^\"]*)\" user$") public void I_get_the_user(String username) throws Throwable { Context.getInstance().registerRestResponse(Context.getRestClientInstance().get("/rest/v1/users/" + username)); } @When("^I remove user \"([^\"]*)\"$") public void I_remove_user(String username) throws Throwable { Context.getInstance().registerRestResponse(Context.getRestClientInstance().delete("/rest/v1/users/" + username)); } @When("^I find users with usernames$") public void I_find_users_with_usersnames(List<String> usernames) throws Throwable { Context.getInstance().registerRestResponse( Context.getRestClientInstance().postJSon("/rest/v1/users/getUsers", Context.getInstance().getJsonMapper().writeValueAsString(usernames))); } @When("^I find users with an empty usernames list$") public void I_find_users_with_an_empty_usersnames_list() throws Throwable { I_find_users_with_usersnames(Lists.<String> newArrayList()); } @SuppressWarnings("unchecked") @Then("^the find RestResponse should have the users with usersnames$") public void the_find_RestResponse_should_have_the_users_with_usersnames(List<String> expectedUsernames) throws Throwable { List<Object> users = JsonUtil.read(Context.getInstance().getRestResponse(), List.class).getData(); assertNotNull(users); List<String> usernames = Lists.newArrayList(); for (Object obj : users) { User user = Context.getInstance().getJsonMapper().readValue(Context.getInstance().getJsonMapper().writeValueAsString(obj), User.class); usernames.add(user.getUsername()); } assertEquals(expectedUsernames.size(), usernames.size()); assertTrue(usernames.containsAll(expectedUsernames)); } @Given("^I am authenticated with user named \"([^\"]*)\"$") public void I_am_authenticated_with_user_named(String user) throws Throwable { I_authenticate_with_username_and_password(user, user); } @When("^I update \"([^\"]*)\" user's fields:$") public void I_update_user_s_fields(String username, List<Entry> fields) throws Throwable { Map<String, String> fieldsMap = Maps.newHashMap(); for (Entry field : fields) { fieldsMap.put(field.getName(), field.getValue()); } String resp = Context.getRestClientInstance().putJSon("/rest/v1/users/" + username, JsonUtil.toString(fieldsMap)); System.out.println(resp); Context.getInstance().registerRestResponse(resp); } @Then("^There should be a user \"([^\"]*)\" with firstname \"([^\"]*)\" in the system$") public void There_should_be_a_user_with_firstname_in_the_system(String username, String expectedFirstName) throws Throwable { User user = JsonUtil.read(Context.getRestClientInstance().get("/rest/v1/users/" + username), User.class).getData(); assertNotNull(user); assertEquals(expectedFirstName, user.getFirstName()); } }