using EPS.Business.BusinessObjects;
using EPS.Business.Names;
using EPS.QualityTools.UnitTestFramework;
using NUnit.Framework;
using MyCompany.MySolution.BusinessObjects.User;
using MyCompany.MySolution.QualityTools.UnitTestFramework;
using MyCompany.MySolution.QualityTools.UnitTestFramework.Business;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Drawing;
using System.Text;
namespace MyCompany.MySolution.BusinessObjects.Tests.User
{
[TestFixture]
[EPS.QualityTools.UnitTestFramework.Business.BusinessObjectFixtureSetup(typeof(UserBusinessObject), typeof(UserBusinessEntity))]
public class UserFixture : BusinessObjectFixture<UserBusinessEntity>
{
private Collection<UserGroupBusinessEntity> m_TestUserGroups;
#region Overrides
protected override void PopulateEntityBasicStateExpected()
{
this.EntityBasicState.Add("UserName", "jjones");
this.EntityBasicState.Add("Prefix", "Dr.");
this.EntityBasicState.Add("Password", "1234");
this.EntityBasicState.Add("FirstName", "Joe");
this.EntityBasicState.Add("MiddleName", "Sidmond");
this.EntityBasicState.Add("LastName", "Jones");
this.EntityBasicState.Add("Suffix", "III");
this.EntityBasicState.Add("Title", "Professor");
this.EntityBasicState.Add("BirthDate", new DateTime(1970, 11, 25));
this.EntityBasicState.Add("Company", "Neverland Elementary School");
this.EntityBasicState.Add("Photo", new Bitmap(1, 1));
}
protected override void PopulateEntityCollectionsStateExpected()
{
List<Hashtable> addresses = new List<Hashtable>();
Hashtable address1 = new Hashtable();
address1.Add("Street", "123 Some St.");
address1.Add("Street2", "Ste. 200");
address1.Add("City", "Houston");
address1.Add("State", "TX");
address1.Add("Zip", "12345");
address1.Add("TypeStrong", AddressType.Home);
Hashtable address2 = new Hashtable();
address2.Add("Street", "22 Acacia Av.");
address2.Add("City", "New York City");
address2.Add("State", "NY");
address2.Add("Zip", "12345");
address2.Add("TypeStrong", AddressType.Mailing);
addresses.Add(address1);
addresses.Add(address2);
this.EntityCollectionsState.Add("Addresses", addresses);
}
public override PropertyComparer ComparePropertyValue(string propertyName, object expectedValue, object actualValue)
{
PropertyComparer comparer;
if (string.Compare(propertyName, "Photo", StringComparison.InvariantCultureIgnoreCase) == 0)
{
Bitmap expectedBitmap = (Bitmap)expectedValue;
Bitmap actualBitmap = (Bitmap)actualValue;
comparer = new PropertyComparer(propertyName, expectedBitmap.Size, actualBitmap.Size);
}
else
{
comparer = base.ComparePropertyValue(propertyName, expectedValue, actualValue);
}
return comparer;
}
protected override void OnBeforeNewTestEntitiesCreation()
{
base.OnBeforeNewTestEntitiesCreation();
this.m_TestUserGroups = BusinessObjectFixture<UserGroupBusinessEntity>.GetNewTestEntities<UserGroupFixture>(2);
}
protected override void OnBeforeSavingNewTestEntity(UserBusinessEntity testEntity)
{
base.OnBeforeSavingNewTestEntity(testEntity);
StringBuilder nameBuilder = new StringBuilder();
nameBuilder.Append(testEntity.UserName);
nameBuilder.Append(UserRolesFixture.TestEntitiesCreated.Count);
testEntity.UserName = nameBuilder.ToString();
testEntity.UserGroups.Add(this.m_TestUserGroups[0].PK);
testEntity.UserGroups.Add(this.m_TestUserGroups[1].PK);
UserPermissionBusinessObject permissionBO = UserPermissionBusinessObject.NewInstance();
DataTable permissionsList = permissionBO.GetList().Tables[0];
Guid permission1 = (Guid)permissionsList.Rows[10]["PK_UserPermission"];
Guid permission2 = (Guid)permissionsList.Rows[11]["PK_UserPermission"];
ExclusivePermissionsBusinessItem userPermission1 = testEntity.ExclusivePermissions.Add(permission1);
Assert.IsNotNull(userPermission1, "Failed adding exclusive permission to test user.");
ExclusivePermissionsBusinessItem userPermission2 = testEntity.ExclusivePermissions.Add(permission2);
Assert.IsNotNull(userPermission2, "Failed adding exclusive permission to test user.");
userPermission1.Permission = UserExclusivePermissionAssignment.Denied;
userPermission2.Permission = UserExclusivePermissionAssignment.Granted;
testEntity.CommunicationInfo.Add(CommInfoType.Email, "test@yahoo.com");
}
protected override IBusinessEntity GetNewEntityPopulated()
{
UserBusinessEntity newEntity = base.GetNewEntityPopulated() as UserBusinessEntity;
newEntity.CommunicationInfo.Add(CommInfoType.Email, "test@yahoo.com");
return newEntity;
}
protected override void DeleteEntities(Collection<UserBusinessEntity> testEntities)
{
using (ScheduleItemBusinessObject scheduleItemBO = ScheduleItemBusinessObject.NewInstance())
{
foreach (UserBusinessEntity userBE in testEntities)
{
this.RemoveScheduledItemsForUser(userBE.UserPK);
}
}
base.DeleteEntities(testEntities);
BusinessObjectFixture<UserGroupBusinessEntity>.DeleteTestEntities<UserGroupFixture>();
}
protected override void OnBeforeDelete(UserBusinessEntity entity)
{
this.RemoveScheduledItemsForUser(entity.UserPK);
base.OnBeforeDelete(entity);
}
#endregion
#region Test methods
[Test]
public void CreateBasicUser()
{
this.TestNewEntityBasicData();
}
[Test]
public void CreateUserWithCollections()
{
this.TestNewEntityWithCollections();
}
[Test]
public void CreateUserWithUserGroups()
{
Collection<UserGroupBusinessEntity> testUserGroups = BusinessObjectFixture<UserGroupBusinessEntity>.GetNewTestEntities<UserGroupFixture>(2);
UserBusinessEntity newEntity = (UserBusinessEntity)this.GetNewEntityPopulated();
Assert.IsNotNull(newEntity.UserGroups.Add(testUserGroups[0].PK), "Failed adding a group to the user.");
Assert.IsNotNull(newEntity.UserGroups.Add(testUserGroups[1].PK), "Failed adding a group to the user.");
Assert.IsTrue(newEntity.Save(), "Failed saving entity.");
try
{
UserBusinessEntity loadedEntity = UserBusinessEntity.LoadEntity(newEntity.PK);
Assert.AreEqual(2, loadedEntity.UserGroups.Count, "User should be assigned to two user groups.");
Assert.IsTrue((loadedEntity.UserGroups[0].TargetFK == testUserGroups[0].PK || loadedEntity.UserGroups[0].TargetFK == testUserGroups[1].PK),
"The user group saved is not the one that should have been saved.");
Assert.IsTrue((loadedEntity.UserGroups[1].TargetFK == testUserGroups[0].PK || loadedEntity.UserGroups[1].TargetFK == testUserGroups[1].PK),
"The user group saved is not the one that should have been saved.");
}
catch (Exception ex)
{
Assert.Fail("Failed loading and testing user entity with associated user groups: {0}", ex.Message);
}
finally
{
UserFixture.DeleteUserEntity(newEntity);
}
}
[Test]
public void CreateUserWithExclusivePermissions()
{
UserPermissionBusinessObject permissionBO = UserPermissionBusinessObject.NewInstance();
DataTable permissionsList = permissionBO.GetList().Tables[0];
Guid permission1 = (Guid)permissionsList.Rows[0]["PK_UserPermission"];
Guid permission2 = (Guid)permissionsList.Rows[1]["PK_UserPermission"];
UserBusinessEntity newEntity = (UserBusinessEntity)this.GetNewEntityPopulated();
ExclusivePermissionsBusinessItem userPermission1 = newEntity.ExclusivePermissions.Add(permission1);
Assert.IsNotNull(userPermission1, "Should have gotten valid permission added to the user.");
ExclusivePermissionsBusinessItem userPermission2 = newEntity.ExclusivePermissions.Add(permission2);
Assert.IsNotNull(userPermission2, "Should have gotten valid permission added to the user.");
userPermission1.Permission = UserExclusivePermissionAssignment.Denied;
userPermission2.Permission = UserExclusivePermissionAssignment.Granted;
Assert.IsTrue(newEntity.Save(), "Failed saving user entity with exclusive permissions.");
try
{
UserBusinessEntity loadedEntity = UserBusinessEntity.LoadEntity(newEntity.PK);
Assert.AreEqual(2, loadedEntity.ExclusivePermissions.Count, "User should have two exclusive permissions.");
foreach (ExclusivePermissionsBusinessItem exclusivePermission in loadedEntity.ExclusivePermissions)
{
if (exclusivePermission.Permission == UserExclusivePermissionAssignment.Denied)
{
Assert.AreEqual(permission1, exclusivePermission.TargetFK);
}
else
{
Assert.AreEqual(permission2, exclusivePermission.TargetFK);
}
}
}
catch (Exception ex)
{
Assert.Fail("Failed loading and testing user entity with exclusive permissions: {0}", ex.Message);
}
finally
{
UserFixture.DeleteUserEntity(newEntity);
}
}
[Test]
public void NewUserIsRequiredToChangePassword()
{
try
{
Collection<UserBusinessEntity> testEntities = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(1);
Assert.IsTrue(testEntities[0].PasswordChangeRequired, "A new user should be required to have the password changed.");
}
finally
{
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
}
[Test]
public void TestInsertionInScheduleItemsWhenNewUserSaved()
{
UserBusinessEntity userBE = UserBusinessEntity.NewEntity();
try
{
userBE.FirstName = "myusername";
userBE.LastName = "lastname";
userBE.UserName = "username";
userBE.CommunicationInfo.Add(CommInfoType.Email, "a@eps-software.com");
if (userBE.Save())
{
ScheduleItemBusinessObject bo = ScheduleItemBusinessObject.NewInstance();
DataSet scheduleItems = bo.GetScheduleItemsForUser(userBE.UserPK);
Assert.IsNotNull(scheduleItems, "A new item should be added to the scheduleitems table when a new user is created; so it must not be null");
}
}
finally
{
DeleteUserEntity(userBE);
}
}
[Test]
public void TestUserWithCommunicationInfo()
{
Collection<UserBusinessEntity> testEntities = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(1);
UserBusinessEntity userBE = testEntities[0];
try
{
INameCommInfoEntity email = userBE.CommunicationInfo.Add(CommInfoType.Email, "claudio@eps-software.com");
Assert.IsNotNull(email, "Failed adding a new item to the CommunicationInfo collection.");
IEntitySubItemCollectionItem item = email as IEntitySubItemCollectionItem;
Assert.IsNotNull(item, "Failed casting INameCommInfoEntity to IEntitySubItemCollectionItem");
Assert.AreNotEqual(Guid.Empty, item.PK);
Assert.IsTrue(userBE.Save(), "Failed saving user entity after adding contact info.");
}
finally
{
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
}
[Test]
public void TestCreationOfTestUserEntity()
{
Collection<UserBusinessEntity> testUsers = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(2);
Assert.AreEqual(2, testUsers.Count);
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
[Test]
public void TestsRetrievalOfUsersFromGroup()
{
try
{
Collection<UserBusinessEntity> sponsorsCreated = UserFixture.CreateUsersForTestByUserGroupType(FixedUserGroupType.Sponsors, 3);
DataSet sponsors = this.GetListOfSponsors();
foreach (UserBusinessEntity newSponsorCreated in sponsorsCreated)
{
DataRow[] drs1 = sponsors.Tables[0].Select("FK_User = '" + newSponsorCreated.UserPK.ToString() + "'");
Assert.IsTrue(drs1.Length > 0,
"A sponsors that we created is not included in the list of sponsors. " +
"Every new sponsors created should have been retrieved when getting a list of sponsors.");
}
DataRow[] drs2 = sponsors.Tables[0].Select("PK_UserAndUserGroup = '" + Guid.NewGuid().ToString() + "'");
Assert.IsTrue(drs2.Length == 0, "The list of sponsors should not have a sponsors that's invalid in the system.");
}
finally
{
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
}
[Test]
public void TestCheckForUserNamePasswordCombination()
{
Collection<UserBusinessEntity> testUsers = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(1);
testUsers[0].UserName = "The User";
Assert.IsTrue(testUsers[0].Save(), "Failed saving test user.");
try
{
UserBusinessEntity user = UserBusinessEntity.LoadEntity(testUsers[0].PK);
using (UserBusinessObject userBO = UserBusinessObject.NewInstance())
{
Assert.IsTrue(userBO.GetUserId(user.UserName, user.Password) == user.PK, "UserName/Password combination should be correct.");
Assert.IsTrue(userBO.GetUserId(user.UserName, "BAD PASSWORD") == Guid.Empty, "UserName/Password combination should be incorrect.");
}
}
finally
{
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
}
[Test]
public void TestCheckForRequiredPassword()
{
Collection<UserBusinessEntity> testUsers = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(1);
testUsers[0].UserName = "TestUser";
testUsers[0].Password = "";
Assert.IsFalse(testUsers[0].Save(), "Failed check for required password.");
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
[Test]
public void TestCheckPasswordFailsRegex()
{
Collection<UserBusinessEntity> testUsers = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(1);
testUsers[0].UserName = "TestUser";
testUsers[0].Password = "foo";
Assert.IsFalse(testUsers[0].Save(), "Failed test for password strength.");
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
[Test]
public void TestCheckPasswordMeetsRegex()
{
Collection<UserBusinessEntity> testUsers = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(1);
testUsers[0].UserName = "TestUser";
testUsers[0].Password = "P@rCheeZ!";
Assert.IsTrue(testUsers[0].Save(), "Failed saving test user.");
BusinessObjectFixture<UserBusinessEntity>.DeleteTestEntities<UserFixture>();
}
#endregion
#region Helper methods
private DataSet GetListOfSponsors()
{
DataSet sponsors = null;
using (UserBusinessObject userBO = UserBusinessObject.NewInstance())
{
sponsors = userBO.GetUsersByFixedGroupType(FixedUserGroupType.Sponsors);
}
return sponsors;
}
public static Collection<UserBusinessEntity> CreateUsersForTestByUserGroupType(FixedUserGroupType userGroupType, int howMany)
{
int testUsersToCreate = howMany;
Guid userGroupId = UserGroupBusinessObject.GetFixedUserGroupId(userGroupType);
Collection<UserBusinessEntity> usersCreated = new Collection<UserBusinessEntity>();
Collection<UserBusinessEntity> testUsers = BusinessObjectFixture<UserBusinessEntity>.GetNewTestEntities<UserFixture>(testUsersToCreate);
foreach (UserBusinessEntity user in testUsers)
{
UserGroupBusinessItem newGroupItem = user.UserGroups.Add(userGroupId);
Assert.IsNotNull(newGroupItem, "Failed adding {0} user group to the test user.", userGroupType.ToString());
usersCreated.Add(user);
Assert.IsTrue(user.Save(), "Failed saving test user.");
}
return usersCreated;
}
private static void DeleteUserEntity(UserBusinessEntity newEntity)
{
using (UserBusinessObject userBO = UserBusinessObject.NewInstance())
{
bool deletionSucceeded = true;
string exceptionMessage = string.Empty;
try
{
deletionSucceeded = userBO.Delete(newEntity.PK);
}
catch (Exception ex)
{
deletionSucceeded = true;
exceptionMessage = ex.Message;
}
if (!deletionSucceeded)
{
Console.WriteLine("Failed deleting test user PK '{0}'. {1}", newEntity.PK.ToString(), exceptionMessage);
}
}
BusinessObjectFixture<UserGroupBusinessEntity>.DeleteTestEntities<UserGroupFixture>();
}
private void RemoveScheduledItemsForUser(Guid userId)
{
using (ScheduleItemBusinessObject scheduleItemBO = ScheduleItemBusinessObject.NewInstance())
{
DataSet scheduledItems = scheduleItemBO.GetScheduleItemsForUser(userId);
foreach (DataRow item in scheduledItems.Tables[0].Rows)
{
Assert.IsTrue(scheduleItemBO.Delete((Guid)item["PK_ScheduleItem"]), "Failed deleting scheduled item for the user.");
}
}
}
#endregion
}
}