package com.belladati.sdk.domain.impl;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotEquals;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.belladati.sdk.domain.Domain;
import com.belladati.sdk.domain.DomainInfo;
import com.belladati.sdk.domain.impl.DomainImpl;
import com.belladati.sdk.domain.impl.DomainInfoImpl;
import com.belladati.sdk.test.SDKTest;
import com.belladati.sdk.user.User;
import com.belladati.sdk.user.UserGroup;
import com.belladati.sdk.util.CachedList;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* Tests behavior related to domains.
*
* @author Lubomir Elko
*/
@Test
public class DomainTest extends SDKTest {
private final String id = "123";
private final String baseUri = "/api/domains";
private final String apiUri = baseUri + "/";
private final String usersUri = String.format("/api/domains/%s/users", id);
private final String userGroupsUri = String.format("/api/domains/%s/userGroups", id);
private final String name = "domainname";
private final String description = "domain description";
private final String dateFormat = "yyyy-MM-dd";
private final String timeFormat = "hh:mm:ss";
private final String timeZone = "Asia/Hong_Kong";
private final String locale = "EN";
private final String active = "true";
private final String user_id = "234";
private final String user_name = "User's Name";
private final String userGroup_name = "First Group";
private final String userGroup_id = "456";
private final String[][] userGroupsJson = { { userGroup_id, userGroup_name } };
/** Regular domain info data is loaded correctly. */
public void loadDomainInfo() {
CachedList<DomainInfo> infos = service.getDomainInfo();
server.registerPaginatedItem(baseUri, "domains", builder.buildDomainInfoNode(id, name, description, active));
infos.load();
server.assertRequestUris(baseUri);
assertEquals(infos.get().size(), 1);
DomainInfo info = infos.get().get(0);
assertEquals(info.getId(), id);
assertEquals(info.getName(), name);
assertEquals(info.getDescription(), description);
assertEquals(info.getActive() + "", active);
assertEquals(info.toString(), name);
}
/** Individual Domain can be loaded by ID through service. */
public void loadDomain() {
server.register(apiUri + id,
builder.buildDomainNode(id, name, description, dateFormat, timeFormat, timeZone, locale, active).toString());
Domain domain = service.loadDomain(id);
assertEquals(domain.getId(), id);
assertEquals(domain.getName(), name);
assertEquals(domain.getDescription(), description);
assertEquals(domain.getDateFormat(), dateFormat);
assertEquals(domain.getTimeFormat(), timeFormat);
assertEquals(domain.getTimeZone(), timeZone);
assertEquals(domain.getLocale(), locale);
assertEquals(domain.getActive() + "", active);
server.assertRequestUris(apiUri + id);
assertEquals(domain.toString(), name);
}
/** Domain can be loaded from a domain info object. */
public void loadDomainFromInfo() {
ObjectNode infoJson = builder.buildDomainInfoNode(id, name, description, active);
DomainInfo domainInfo = new DomainInfoImpl(service, infoJson);
assertEquals(domainInfo.getId(), id);
assertEquals(domainInfo.getName(), name);
assertEquals(domainInfo.getDescription(), description);
assertEquals(domainInfo.getActive() + "", active);
assertEquals(domainInfo.toString(), domainInfo.getName());
server.register(apiUri + id,
builder.buildDomainNode(id, name, description, dateFormat, timeFormat, timeZone, locale, active).toString());
Domain domain = domainInfo.loadDetails();
assertEquals(domain.getId(), id);
assertEquals(domain.getName(), name);
assertEquals(domain.getDescription(), description);
assertEquals(domain.getDateFormat(), dateFormat);
assertEquals(domain.getTimeFormat(), timeFormat);
assertEquals(domain.getTimeZone(), timeZone);
assertEquals(domain.getLocale(), locale);
assertEquals(domain.getActive() + "", active);
server.assertRequestUris(apiUri + id);
}
/** Null fields are treated as empty. */
@Test(dataProvider = "provider_optionalFields")
public void fieldNull(String field, String method) throws Exception {
ObjectNode node = builder.buildDomainNode(id, name, description, dateFormat, timeFormat, timeZone, locale, active);
node.put(field, (String) null);
server.register(apiUri + id, node.toString());
Domain resource = service.loadDomain(id);
assertEquals(Domain.class.getMethod(method).invoke(resource), "");
}
/** Missing fields are treated as empty. */
@Test(dataProvider = "provider_optionalFields")
public void fieldMissing(String field, String method) throws Exception {
ObjectNode node = builder.buildDomainNode(id, name, description, dateFormat, timeFormat, timeZone, locale, active);
node.remove(field);
server.register(apiUri + id, node.toString());
Domain resource = service.loadDomain(id);
assertEquals(Domain.class.getMethod(method).invoke(resource), "");
}
/** equals/hashcode for DomainInfo */
public void domainInfoEquality() {
DomainInfo u1 = new DomainInfoImpl(service, builder.buildDomainInfoNode(id, name, description, active));
DomainInfo u2 = new DomainInfoImpl(service, builder.buildDomainInfoNode(id, "", null, ""));
DomainInfo u3 = new DomainInfoImpl(service, builder.buildDomainInfoNode("otherId", name, description, active));
assertEquals(u1, u2);
assertEquals(u1.hashCode(), u2.hashCode());
assertFalse(u1.equals(new Object()));
assertNotEquals(u1, u3);
}
/** equals/hashcode for Domain */
public void domainEquality() {
Domain u1 = new DomainImpl(service,
builder.buildDomainNode(id, name, description, dateFormat, timeFormat, timeZone, locale, active));
Domain u2 = new DomainImpl(service, builder.buildDomainNode(id, "", "", "", "", "", "", ""));
Domain u3 = new DomainImpl(service,
builder.buildDomainNode("otherId", name, description, dateFormat, timeFormat, timeZone, locale, active));
assertEquals(u1, u2);
assertEquals(u1.hashCode(), u2.hashCode());
assertFalse(u1.equals(new Object()));
assertNotEquals(u1, u3);
}
@DataProvider(name = "provider_optionalFields")
protected Object[][] provider_optionalFields() {
return new Object[][] { { "description", "getDescription" }, { "dateFormat", "getDateFormat" },
{ "timeFormat", "getTimeFormat" }, { "timeZone", "getTimeZone" }, { "locale", "getLocale" } };
}
/** Users (without group filter) are loaded correctly from service. */
public void loadUsers_withoutGroupFilter() {
ObjectNode node = builder.buildDomainNode(id, name, description, dateFormat, timeFormat, timeZone, locale, active);
Domain domain = new DomainImpl(service, node);
CachedList<User> list = domain.loadUsers(null);
registerSingleUser(builder.buildUserNode(user_id, user_name, "", "", "", "", "", "", null, null, id, null, null));
list.load();
server.assertRequestUris(usersUri);
assertEquals(list.toList().size(), 1);
User item = list.toList().get(0);
assertEquals(item.getId(), user_id);
assertEquals(item.getUsername(), user_name);
assertEquals(item.getDomainId(), id);
assertEquals(item.getUserGroups().size(), 0);
assertEquals(item.toString(), user_name);
}
/** Users (with group filter) are loaded correctly from service. */
public void loadUsers_withGroupFilter() {
ObjectNode infoJson = builder.buildDomainInfoNode(id, name, description, active);
DomainInfo domainInfo = new DomainInfoImpl(service, infoJson);
CachedList<User> list = domainInfo.loadUsers(userGroup_id);
registerSingleUser(
builder.buildUserNode(user_id, user_name, "", "", "", "", "", "", null, null, id, null, userGroupsJson));
list.load();
server.assertRequestUris(usersUri);
assertEquals(list.toList().size(), 1);
User item = list.toList().get(0);
assertEquals(item.getId(), user_id);
assertEquals(item.getUsername(), user_name);
assertEquals(item.getDomainId(), id);
assertEquals(item.getUserGroups().size(), 1);
UserGroup[] groups = item.getUserGroups().toArray(new UserGroup[1]);
assertEquals(groups[0].getId(), userGroup_id);
assertEquals(groups[0].getName(), userGroup_name);
assertEquals(groups[0].getDescription(), "");
assertEquals(item.toString(), user_name);
}
private void registerSingleUser(JsonNode node) {
server.registerPaginatedItem(usersUri, "users", node);
}
/** Loads UserGroups from Domain. */
public void loadUserGroups_fromDomain() {
ObjectNode infoJson = builder.buildDomainInfoNode(id, name, description, active);
DomainInfo domainInfo = new DomainInfoImpl(service, infoJson);
assertEquals(domainInfo.getId(), id);
server.register(apiUri + id, infoJson.toString());
Domain domain = domainInfo.loadDetails();
registerSingleUserGroup(builder.buildUserGroupNode(userGroup_id, userGroup_name, description));
CachedList<UserGroup> list = domain.loadUserGroups();
list.load();
assertEquals(list.toList().size(), 1);
UserGroup item = list.toList().get(0);
assertEquals(item.getId(), userGroup_id);
assertEquals(item.getName(), userGroup_name);
assertEquals(item.getDescription(), description);
assertEquals(item.toString(), userGroup_name);
}
/** Loads UserGroups from DomainInfo. */
public void loadUserGroups_fromDomainInfo() {
ObjectNode infoJson = builder.buildDomainInfoNode(id, name, description, active);
DomainInfo domainInfo = new DomainInfoImpl(service, infoJson);
assertEquals(domainInfo.getId(), id);
registerSingleUserGroup(builder.buildUserGroupNode(userGroup_id, userGroup_name, description));
CachedList<UserGroup> list = domainInfo.loadUserGroups();
list.load();
assertEquals(list.toList().size(), 1);
UserGroup item = list.toList().get(0);
assertEquals(item.getId(), userGroup_id);
assertEquals(item.getName(), userGroup_name);
assertEquals(item.getDescription(), description);
assertEquals(item.toString(), userGroup_name);
}
private void registerSingleUserGroup(JsonNode node) {
server.registerPaginatedItem(userGroupsUri, "userGroups", node);
}
}