package com.collabinate.server.engine;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import com.collabinate.server.Tenant;
/**
* Abstract test class to test any implementation of a CollabinateAdmin.
*
* @author mafuba
*
*/
public abstract class CollabinateAdminTest
{
private CollabinateAdmin admin;
abstract CollabinateAdmin getAdmin();
abstract CollabinateAdmin getNewAdmin();
@Rule
public ExpectedException exception = ExpectedException.none();
@Before
public void setup()
{
admin = getAdmin();
}
@Test
public void get_nonexistent_tenant_should_return_null()
{
assertNull(admin.getTenant("tenant"));
}
@Test
public void get_tenant_should_return_correct_tenant()
{
admin.putTenant(new Tenant("tenant", "tenantname"));
Tenant tenant = admin.getTenant("tenant");
assertEquals("tenant", tenant.getId());
assertEquals("tenantname", tenant.getName());
}
@Test
public void putting_existing_tenant_should_modify_existing_tenant()
{
Tenant tenant1 = new Tenant("tenant", "tenant1");
Tenant tenant2 = new Tenant("tenant", "tenant2");
admin.putTenant(tenant1);
admin.putTenant(tenant2);
Tenant retrieved = admin.getTenant("tenant");
assertEquals(tenant2.getName(), retrieved.getName());
}
@Test
public void get_deleted_tenant_should_return_null()
{
admin.putTenant(new Tenant("tenant", "tenant"));
admin.deleteTenant("tenant");
assertNull(admin.getTenant("tenant"));
}
@Test
public void delete_tenant_should_not_affect_other_tenants()
{
admin.putTenant(new Tenant("tenant1", "Tenant 1"));
admin.putTenant(new Tenant("tenant2", "Tenant 2"));
admin.deleteTenant("tenant1");
assertNotNull(admin.getTenant("tenant2"));
}
@Test
public void database_export_should_contain_added_tenant_name()
{
Tenant tenant = new Tenant("tenant", "testtenant");
admin.putTenant(tenant);
String backup = admin.exportDatabase();
assertThat(backup, containsString(tenant.getName()));
}
@Test
public void database_import_should_restore_existing_tenant()
{
admin.putTenant(new Tenant("tenant", "Tenant Backup"));
String data = admin.exportDatabase();
admin = getNewAdmin();
assertNull(admin.getTenant("tenant"));
admin.importDatabase(data);
assertEquals(admin.getTenant("tenant").getName(), "Tenant Backup");
}
@Test
public void tenant_export_should_contain_tenant_name()
{
Tenant tenant = new Tenant("tenant", "Export Tenant");
admin.putTenant(tenant);
String tenantBackup = admin.exportTenantData(tenant.getId());
assertThat(tenantBackup, containsString(tenant.getName()));
}
@Test
public void tenant_export_should_not_contain_other_tenant_names()
{
Tenant tenant1 = new Tenant("tenant1", "Export Tenant");
Tenant tenant2 = new Tenant("tenant2", "Other Tenant");
admin.putTenant(tenant1);
admin.putTenant(tenant2);
String tenantBackup = admin.exportTenantData(tenant1.getId());
assertThat(tenantBackup, not(containsString(tenant2.getName())));
}
@Test
public void tenant_import_should_fail_for_existing_tenant()
{
exception.expect(IllegalStateException.class);
exception.expectMessage("tenant");
Tenant tenant = new Tenant("tenant", "Tenant");
admin.putTenant(tenant);
String tenantBackup = admin.exportTenantData(tenant.getId());
admin.importTenantData(tenant.getId(), tenantBackup);
}
@Test
public void tenant_import_should_restore_tenant_in_new_database()
{
Tenant tenant = new Tenant("tenant", "Restored Tenant");
admin.putTenant(tenant);
String tenantBackup = admin.exportTenantData(tenant.getId());
admin = getNewAdmin();
admin.importTenantData(tenant.getId(), tenantBackup);
Tenant restored = admin.getTenant(tenant.getId());
assertEquals(tenant.getName(), restored.getName());
}
@Test
public void tenant_import_should_restore_tenant_in_existing_database()
{
Tenant tenant1 = new Tenant("tenant1", "Restored Tenant");
Tenant tenant2 = new Tenant("tenant2", "Static Tenant");
admin.putTenant(tenant1);
admin.putTenant(tenant2);
String tenantBackup = admin.exportTenantData(tenant1.getId());
admin.deleteTenant(tenant1.getId());
admin.importTenantData(tenant1.getId(), tenantBackup);
Tenant restored = admin.getTenant(tenant1.getId());
assertEquals(tenant1.getName(), restored.getName());
}
@Test
public void tenant_import_should_not_disturb_other_tenants()
{
Tenant tenant1 = new Tenant("tenant1", "Restored Tenant");
Tenant tenant2 = new Tenant("tenant2", "Static Tenant");
admin.putTenant(tenant1);
admin.putTenant(tenant2);
String tenantBackup = admin.exportTenantData(tenant1.getId());
admin.deleteTenant(tenant1.getId());
admin.importTenantData(tenant1.getId(), tenantBackup);
Tenant existing = admin.getTenant(tenant2.getId());
assertEquals(tenant2.getName(), existing.getName());
}
}