/*
* Copyright (C) 2007-2014 Crafter Software Corporation.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.craftercms.profile.services;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.craftercms.commons.collections.SetUtils;
import org.craftercms.profile.api.AttributeDefinition;
import org.craftercms.profile.api.AttributePermission;
import org.craftercms.profile.api.Tenant;
import org.craftercms.profile.api.exceptions.ErrorCode;
import org.craftercms.profile.api.services.TenantService;
import org.craftercms.profile.exceptions.ProfileRestServiceException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
/**
* Integration tests for the {@link org.craftercms.profile.api.services.TenantService}.
*
* @author avasquez
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:crafter/profile/extension/client-context.xml")
public class TenantServiceIT {
private static final String DEFAULT_TENANT_NAME = "default";
private static final String CORPORATE_TENANT_NAME = "corporate";
private static final String ADMIN_ROLE = "ADMIN";
private static final String USER_ROLE = "USER";
private static final Set<String> DEFAULT_ROLES = SetUtils.asSet("PROFILE_SUPERADMIN", "SOCIAL_USER",
"SOCIAL_MODERATOR", "SOCIAL_AUTHOR",
"SOCIAL_ADMIN");
private static final Set<String> CORPORATE_ROLES = SetUtils.asSet(ADMIN_ROLE);
private static final String FIRST_NAME_ATTRIBUTE_NAME = "firstName";
private static final String LAST_NAME_ATTRIBUTE_NAME = "lastName";
private static final String SUBSCRIPTIONS_ATTRIBUTE_NAME = "subscriptions";
private static final String GENDER_ATTRIBUTE_NAME = "gender";
@Autowired
private TenantService tenantService;
@Test
public void testCreateTenant() throws Exception {
Tenant tenant = tenantService.createTenant(getCorporateTenant());
try {
assertNotNull(tenant);
assertNotNull(tenant.getId());
assertEquals(CORPORATE_TENANT_NAME, tenant.getName());
assertEquals(false, tenant.isVerifyNewProfiles());
assertEquals(CORPORATE_ROLES, tenant.getAvailableRoles());
try {
tenantService.createTenant(getCorporateTenant());
fail("Exception " + ProfileRestServiceException.class.getName() + " expected");
} catch (ProfileRestServiceException e) {
assertEquals(HttpStatus.BAD_REQUEST, e.getStatus());
assertEquals(ErrorCode.TENANT_EXISTS, e.getErrorCode());
}
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
@Test
public void testGetTenant() throws Exception {
Tenant tenant = tenantService.getTenant(DEFAULT_TENANT_NAME);
assertNotNull(tenant);
assertNotNull(tenant.getId());
assertEquals(DEFAULT_TENANT_NAME, tenant.getName());
assertEquals(false, tenant.isVerifyNewProfiles());
assertEquals(DEFAULT_ROLES, tenant.getAvailableRoles());
assertEqualAttributeDefinitions(getAttributeDefinitions(), tenant.getAttributeDefinitions());
}
@Test
public void testUpdateTenant() throws Exception {
Tenant tenant = tenantService.createTenant(getCorporateTenant());
try {
tenant.setVerifyNewProfiles(true);
tenant.getAvailableRoles().remove(ADMIN_ROLE);
tenant.getAvailableRoles().add(USER_ROLE);
tenant.getAttributeDefinitions().remove(getSubscriptionsAttributeDefinition());
tenant.getAttributeDefinitions().add(getGenderAttributeDefinition());
Tenant result = tenantService.updateTenant(tenant);
assertNotNull(result);
assertEquals(tenant.isVerifyNewProfiles(), result.isVerifyNewProfiles());
assertEquals(tenant.getAvailableRoles(), result.getAvailableRoles());
assertEqualAttributeDefinitions(tenant.getAttributeDefinitions(), result.getAttributeDefinitions());
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
@Test
public void testDeleteTenant() throws Exception {
Tenant tenant = tenantService.createTenant(getCorporateTenant());
assertNotNull(tenant);
tenantService.deleteTenant(tenant.getName());
tenant = tenantService.getTenant(tenant.getName());
assertNull(tenant);
}
@Test
public void testGetTenantCount() throws Exception {
long count = tenantService.getTenantCount();
assertEquals(1, count);
}
@Test
public void testGetAllTenants() throws Exception {
List<Tenant> tenants = tenantService.getAllTenants();
assertNotNull(tenants);
assertEquals(1, tenants.size());
assertEquals(DEFAULT_TENANT_NAME, tenants.get(0).getName());
assertEquals(false, tenants.get(0).isVerifyNewProfiles());
assertEquals(DEFAULT_ROLES, tenants.get(0).getAvailableRoles());
assertEqualAttributeDefinitions(getAttributeDefinitions(), tenants.get(0).getAttributeDefinitions());
}
@Test
public void testVerifyNewProfiles() throws Exception {
tenantService.createTenant(getCorporateTenant());
try {
Tenant tenant = tenantService.verifyNewProfiles(CORPORATE_TENANT_NAME, false);
assertNotNull(tenant);
assertEquals(false, tenant.isVerifyNewProfiles());
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
@Test
public void testAddRoles() throws Exception {
tenantService.createTenant(getCorporateTenant());
try {
Tenant tenant = tenantService.addRoles(CORPORATE_TENANT_NAME, Arrays.asList(USER_ROLE));
Set<String> expectedRoles = new HashSet<>(CORPORATE_ROLES);
expectedRoles.add(USER_ROLE);
assertNotNull(tenant);
assertEquals(expectedRoles, tenant.getAvailableRoles());
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
@Test
public void testRemoveRoles() throws Exception {
tenantService.createTenant(getCorporateTenant());
try {
Tenant tenant = tenantService.removeRoles(CORPORATE_TENANT_NAME, Arrays.asList(ADMIN_ROLE));
Set<String> expectedRoles = new HashSet<>(CORPORATE_ROLES);
expectedRoles.remove(ADMIN_ROLE);
assertNotNull(tenant);
assertEquals(expectedRoles, tenant.getAvailableRoles());
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
@Test
public void testAddAttributeDefinitions() throws Exception {
tenantService.createTenant(getCorporateTenant());
try {
List<AttributeDefinition> definitions = Arrays.asList(getGenderAttributeDefinition());
Tenant tenant = tenantService.addAttributeDefinitions(CORPORATE_TENANT_NAME, definitions);
List<AttributeDefinition> expected = getAttributeDefinitions();
expected.addAll(definitions);
assertNotNull(tenant);
assertNotNull(tenant.getAttributeDefinitions());
assertEquals(4, tenant.getAttributeDefinitions().size());
assertEquals(expected, tenant.getAttributeDefinitions());
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
@Test
@DirtiesContext
public void testRemoveAttributeDefinitions() throws Exception {
tenantService.createTenant(getCorporateTenant());
try {
Collection<String> attributeNames = Arrays.asList(FIRST_NAME_ATTRIBUTE_NAME, LAST_NAME_ATTRIBUTE_NAME);
Tenant tenant = tenantService.removeAttributeDefinitions(CORPORATE_TENANT_NAME, attributeNames);
assertNotNull(tenant);
assertNotNull(tenant.getAttributeDefinitions());
assertEquals(1, tenant.getAttributeDefinitions().size());
} finally {
tenantService.deleteTenant(CORPORATE_TENANT_NAME);
}
}
private Tenant getCorporateTenant() {
Tenant tenant = new Tenant();
tenant.setName(CORPORATE_TENANT_NAME);
tenant.setAvailableRoles(CORPORATE_ROLES);
tenant.setVerifyNewProfiles(false);
tenant.setAttributeDefinitions(getAttributeDefinitions());
return tenant;
}
private List<AttributeDefinition> getAttributeDefinitions() {
return new ArrayList<>(Arrays.asList(getFirstNameAttributeDefinition(), getLastNameAttributeDefinition(),
getSubscriptionsAttributeDefinition()));
}
private AttributeDefinition getFirstNameAttributeDefinition() {
AttributePermission permission = new AttributePermission(AttributePermission.ANY_APPLICATION);
permission.allow(AttributePermission.ANY_ACTION);
AttributeDefinition definition = new AttributeDefinition();
definition.setName(FIRST_NAME_ATTRIBUTE_NAME);
definition.addPermission(permission);
return definition;
}
private AttributeDefinition getLastNameAttributeDefinition() {
AttributePermission permission = new AttributePermission(AttributePermission.ANY_APPLICATION);
permission.allow(AttributePermission.ANY_ACTION);
AttributeDefinition definition = new AttributeDefinition();
definition.setName(LAST_NAME_ATTRIBUTE_NAME);
definition.addPermission(permission);
return definition;
}
private AttributeDefinition getSubscriptionsAttributeDefinition() {
AttributePermission permission1 = new AttributePermission("adminconsole");
permission1.allow(AttributePermission.ANY_ACTION);
AttributePermission permission2 = new AttributePermission("craftersocial");
permission2.allow(AttributePermission.ANY_ACTION);
AttributeDefinition definition = new AttributeDefinition();
definition.setName(SUBSCRIPTIONS_ATTRIBUTE_NAME);
definition.addPermission(permission1);
definition.addPermission(permission2);
return definition;
}
private AttributeDefinition getGenderAttributeDefinition() {
AttributePermission permission = new AttributePermission(AttributePermission.ANY_APPLICATION);
permission.allow(AttributePermission.ANY_ACTION);
AttributeDefinition definition = new AttributeDefinition();
definition.setName(GENDER_ATTRIBUTE_NAME);
definition.addPermission(permission);
return definition;
}
private void assertEqualAttributeDefinitions(List<AttributeDefinition> expected,
List<AttributeDefinition> actual) {
assertNotNull(expected);
assertEquals(expected.size(), actual.size());
Iterator<AttributeDefinition> expectedIter = expected.iterator();
Iterator<AttributeDefinition> actualIter = actual.iterator();
while (expectedIter.hasNext()) {
AttributeDefinition expectedDefinition = expectedIter.next();
AttributeDefinition actualDefinition = actualIter.next();
assertEqualAttributeDefinitions(expectedDefinition, actualDefinition);
}
}
private void assertEqualAttributeDefinitions(AttributeDefinition expected, AttributeDefinition actual) {
List<AttributePermission> expectedPermissions = expected.getPermissions();
List<AttributePermission> actualPermissions = actual.getPermissions();
assertEquals(expected.getName(), actual.getName());
assertEquals(expected.getMetadata(), actual.getMetadata());
assertNotNull(actualPermissions);
assertEquals(expectedPermissions.size(), actualPermissions.size());
for (int i = 0; i < expectedPermissions.size(); i++) {
AttributePermission expectedPermission = expectedPermissions.get(i);
AttributePermission actualPermission = actualPermissions.get(i);
assertEquals(expectedPermission.getApplication(), actualPermission.getApplication());
assertEquals(expectedPermission.getAllowedActions(), actualPermission.getAllowedActions());
}
}
}