package net.whydah.admin;
import net.whydah.admin.config.AppConfig;
import net.whydah.admin.user.uib.RoleRepresentation;
import net.whydah.admin.user.uib.RoleRepresentationRequest;
import net.whydah.admin.user.uib.UserIdentity;
import net.whydah.admin.user.uib.UserIdentityRepresentation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import static org.testng.Assert.assertTrue;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
/**
* Verify that every interface of UserAdminService respond in a propper way.
* See https://code.google.com/p/rest-assured/wiki/GettingStarted
*
* @author <a href="bard.lind@gmail.com">Bard Lind</a>
*/
public class VerifyUserAdminServiceMain {
private static final Logger log = LoggerFactory.getLogger(VerifyUserAdminServiceMain.class);
private static final String USER_AUTHENTICATION_PATH = "auth/logon/user";
private static final String UIB_CREATE_AND_LOGON_OPERATION = "createandlogon";
private final String uasUrl;
private WebTarget userAdminService;
public static final String USER_ADMIN_SERVICE_TOKEN_ID = "1";
public static final String USER_TOKEN_ID = "1";
public static final String USER_ID = "test.me@example.com";
public VerifyUserAdminServiceMain() {
Client client = ClientBuilder.newClient();
AppConfig appConfig = new AppConfig();
uasUrl = appConfig.getProperty("myuri");
log.info("Connection to UserAdministrationService on {}", uasUrl);
userAdminService = client.target(uasUrl);
}
public static void main(String[] args) {
System.setProperty("IAM_MODE", "DEV");
VerifyUserAdminServiceMain verificator = new VerifyUserAdminServiceMain();
//verificator.logonUser();
//verificator.stsUserInterface();
//verificator.userAdminWebUserInterface();
verificator.userAdminWebApplicationInterface();
}
public void logonUser() {
String userAdminServiceTokenId = "1";
WebTarget userLogonResource = userAdminService.path("/" + userAdminServiceTokenId).path(USER_AUTHENTICATION_PATH);
String credentials = userCredentialXml();
log.info("Logging on the user by url {}, credentials {}", userLogonResource.getUri().toString(), credentials);
Response response = userLogonResource.request(MediaType.APPLICATION_XML).post(Entity.entity(credentials, MediaType.APPLICATION_XML_TYPE));
int statusCode = response.getStatus();
log.info("logonUser ,StatusCode {}", statusCode);
assertEquals("Could not logon user via UserAdminService", 200, statusCode);
}
public void createAndLogonUser() {
String userAdminServiceTokenId = "1";
String createAndLogonPath = "create_logon_facebook_user"; // "/createlogon/user"; //createandlogon
WebTarget webResource = userAdminService.path("/" + userAdminServiceTokenId).path(createAndLogonPath);
String userId = "createValidTest-" + System.currentTimeMillis();
String userName = userId;
String fbUserXml = fbUserXml(userId, userName);
Response response = webResource.request(MediaType.APPLICATION_XML).post(Entity.entity(fbUserXml, MediaType.APPLICATION_XML));
int statusCode = response.getStatus();
log.info("createAndLogonUser url {}, StatusCode {}",webResource.getUri(), statusCode);
assertEquals("Could not crated and logon user via UserAdminService", 200,statusCode);
}
/**
* Interfaces and proxy methods supporting SecurityTokenService
*/
public void stsUserInterface() {
//1. Logon existing user via xml
logonUser();
//2. Create and Logon new user via xml
createAndLogonUser();
}
private String fbUserXml(String userId, String userName) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> \n" +
" <user>\n" +
" <params>\n" +
" <fbAccessToken>accessMe1234567</fbAccessToken>\n" +
" <userId>" + userId + "</userId>\n" +
" <firstName>validFirstName</firstName>\n" +
" <lastName>validLastName</lastName>\n" +
" <username>" + userName + "</username>\n" +
" <gender>male</gender>\n" +
" <email>" + userName +"@example.com</email>\n" +
" <birthday></birthday>\n" +
" <hometown>Oslo</hometown>\n" +
" </params> \n" +
" </user>";
}
private String userCredentialXml() {
return "<usercredential>\n" +
" <params>\n" +
" <username>testMe</username>\n" +
" <password>testMe1234</password>\n" +
" </params>\n" +
"</usercredential>";
}
/**
* FIXME implement Interfaces and proxy methods supporting SecurityTokenService
* <p/>
* FIXME Pri 9. (Maybe STS should havdle the applicationsessions, just querying UIB for the application config
*/
public void stsApplicationInterface() {
//logonApplication
//- WebResource webResource = restClient.resource(useridbackendUri).path("logon");
//- ClientResponse response = webResource.type(MediaType.APPLICATION_XML).post(ClientResponse.class, applicationCredential.toXML());
}
/**
* FIXME implement Interfaces and proxy methods supporting SecurityTokenService
* <p/>
* FIXME Pri 4. (Maybe STS should havdle the applicationsessions, just querying UIB for the application config
*/
public void appUserInterface() {
//userSearch
//
}
/**
* FIXME implement Interfaces and proxy methods supporting UserAdminWebapp
* <p/>
* <p/>
* FIXME Pri 3.
*/
public void userAdminWebAppInterface() {
//getApplications
//- String url = getUibUrl(apptokenid, usertokenid, "applications");
// FIXME This API need to be reworked to new DomainModel for Applications and full REST methods for applications
// Exiting API is just a temporary bolt-on for the missing API
}
/**
* Implement Interfaces and proxy methods supporting UserAdminWebapp
*/
public void userAdminWebUserInterface() {
//UserRoles
getUserRoles();
String roleId = addUserRole();
deleteUserRole(roleId);
//User
String userId = addUser();
deleteUser(userId);
getUserAggregate();
findUsers();
resetPassword(); //This one will probably give an error, when mail-sender might not be configured in DEV mode.
//IGNORED
//- String url = getUibUrl(apptokenid, usertokenid, "user/"+uid);
//- String url = getUibUrl(apptokenid, usertokenid, "user/");
//putUserRole - ignored now not in use?
//- String url = getUibUrl(apptokenid, usertokenid, "user/"+uid+"/role/"+roleId);
//putUser - ignored now not in use?
//- String url = getUibUrl(apptokenid, usertokenid, "user/" + uid);
//- String url = getUibUrl(apptokenid, usertokenid, "user/"+uid);
//getUserIdentity
//- String url = getUibUrl(apptokenid, usertokenid, "user/"+uid);
}
private void getUserAggregate() {
WebTarget userResource = buildUserPath().path(USER_ID);
log.info("getUserAggregateByUid by url {}, ", userResource.getUri().toString());
Response response = userResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
log.info("getUserAggregateByUid ,StatusCode {}", statusCode);
assertEquals("Could not getUserAggregateByUid via UserAdminService", 200, statusCode);
String output = response.readEntity(String.class);
assertNotNull(output);
assertTrue(output.contains(USER_ID));
}
private String addUser() {
WebTarget userResource = buildUserPath();
String userJson = buildStubUser().toJsonBare();
log.info("AddUser by url {}, ", userResource.getUri().toString());
Response response = userResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(userJson, MediaType.APPLICATION_JSON));
int statusCode = response.getStatus();
log.info("addUserRole ,StatusCode {}", statusCode);
assertEquals("Could not add user-role via UserAdminService", 200, statusCode);
String output = response.readEntity(String.class);
UserIdentity createdUserIdentity = UserIdentity.fromJson(output);
String userId = createdUserIdentity.getUid();
assertNotNull(userId);
return userId;
}
public void deleteUser(String userId) {
WebTarget userRolesResource = buildUserPath().path(userId);
log.info("deleteUser by url {}, ", userRolesResource.getUri().toString());
Response response = userRolesResource.request(MediaType.APPLICATION_JSON).delete();
int statusCode = response.getStatus();
log.info("deleteUser ,StatusCode {}", statusCode);
assertEquals("Could not delete user via UserAdminService", 204, statusCode);
}
public void getUserRoles() {
WebTarget userRolesResource = buildBasePath().path("roles");
log.info("GetUserRoles by url {}, ", userRolesResource.getUri().toString());
Response response = userRolesResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
log.info("getUserRoles ,StatusCode {}", statusCode);
assertEquals("Could not find user-roles via UserAdminService", 200, statusCode);
}
private WebTarget buildBasePath() {
return userAdminService.path(USER_ADMIN_SERVICE_TOKEN_ID).path(USER_TOKEN_ID).path("user").path(USER_ID);
}
private WebTarget buildUserPath() {
return userAdminService.path(USER_ADMIN_SERVICE_TOKEN_ID).path(USER_TOKEN_ID).path("user/");
}
private WebTarget buildUsersPath() {
return userAdminService.path(USER_ADMIN_SERVICE_TOKEN_ID).path(USER_TOKEN_ID).path("users");
}
public String addUserRole() {
RoleRepresentationRequest role = buildStubUserRole();
WebTarget userRolesResource = buildBasePath().path("role/");
log.info("AddUserRole by url {}, ", userRolesResource.getUri().toString());
Response response = userRolesResource.request(MediaType.APPLICATION_JSON).post(Entity.entity(role.toJson(), MediaType.APPLICATION_JSON));
int statusCode = response.getStatus();
log.info("addUserRole ,StatusCode {}", statusCode);
assertEquals("Could not add user-role via UserAdminService", 200, statusCode);
String output = response.readEntity(String.class);
RoleRepresentation createdRole = RoleRepresentation.fromJson(output);
String roleId = createdRole.getId();
assertNotNull(roleId);
return roleId;
}
private UserIdentityRepresentation buildStubUser() {
String firstName = "firstName-" + System.currentTimeMillis();
String email = firstName + "@example.com";
UserIdentityRepresentation userIdentity = new UserIdentityRepresentation(email, firstName, "testlastName", "test-personRef", email,"+4793333697");
return userIdentity;
}
private RoleRepresentationRequest buildStubUserRole() {
String roleName = "testRole-" + System.currentTimeMillis();
RoleRepresentationRequest role = new RoleRepresentationRequest();
role.setApplicationId("12");
role.setApplicationName("UserAdminService");
role.setOrganizationName("Verification");
role.setApplicationRoleName(roleName);
role.setApplicationRoleValue("30");
return role;
}
public void deleteUserRole(String roleId) {
WebTarget userRolesResource = buildBasePath().path("/role/").path(roleId);
log.info("deleteUserRole by url {}, ", userRolesResource.getUri().toString());
Response response = userRolesResource.request(MediaType.APPLICATION_JSON).delete();
int statusCode = response.getStatus();
log.info("deleteUserRole ,StatusCode {}", statusCode);
assertEquals("Could not delete user-role via UserAdminService", 204, statusCode);
}
/*
Find users... UAWA - search for users using query and return a list of user aggregates
*/
public void findUsers() {
String query = "test";
WebTarget findResource = buildUsersPath().path("find").path(query);
log.info("findUsers by url {}, ", findResource.getUri().toString());
Response response = findResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
log.info("findUsers ,StatusCode {}", statusCode);
assertEquals("Could find via UserAdminService", 200, statusCode);
String output = response.readEntity(String.class);
assertTrue(output.contains(USER_ID));
}
/*
Search users... 3Part application directory search using query and return a list of user identities
*/
public void searchUsers() {
String query = "test";
WebTarget findResource = buildUsersPath().path("search").path(query);
log.info("searchUsers by url {}, ", findResource.getUri().toString());
Response response = findResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
log.info("searchUsers ,StatusCode {}", statusCode);
assertEquals("Could search via UserAdminService", 200, statusCode);
String output = response.readEntity(String.class);
assertTrue(output.contains(USER_ID));
}
/*
Application(s) list and edit applications.
*/
private void userAdminWebApplicationInterface() {
String query = "test";
WebTarget findResource = userAdminService.path(USER_ADMIN_SERVICE_TOKEN_ID).path(USER_TOKEN_ID).path("applications");
log.info("listAllApplications by url {}, ", findResource.getUri().toString());
Response response = findResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
log.info("listAllApplications ,StatusCode {}", statusCode);
assertEquals("listAllApplications via UserAdminService", 200, statusCode);
String output = response.readEntity(String.class);
assertTrue(output.contains("UserAdminService"));
}
/*
Reset Password
*/
public void resetPassword() {
WebTarget resetPasswordResource = userAdminService.path(USER_ADMIN_SERVICE_TOKEN_ID).path("auth/password/reset/username").path("change.me@example.com");
log.info("resetPassword by url {}, ", resetPasswordResource.getUri().toString());
Response response = resetPasswordResource.request(MediaType.APPLICATION_JSON).get();
int statusCode = response.getStatus();
log.info("resetPassword ,StatusCode {}", statusCode);
assertEquals("Could resetPassword via UserAdminService", 200, statusCode);
}
}