public void ShouldThrowDuplicateUserException()
		{
			// Arrange
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);
			UserEntity entity = UserData.GetUserForInsert();
			repository.ClearCollection();
			entity = repository.Create(entity);

			try
			{
				// Act
				UserEntity duplicate = UserData.GetUserForInsert();
				duplicate = repository.Create(entity);

				Assert.Fail("Duplicate user creation should not be allowed.");
			}
			catch (DataAccessException ex)
			{
				// Assert
				if (ex.Message == "Duplicate User detected")
					Assert.Pass();

				Assert.Fail("Some other exception happened");
			}
		}
		public static UserEntity GetSessionUserEntity(IAuthSession session)
		{
			if (session == null)
				return null;

			if (_userRepository == null)
			{
				// TODO:  Inject UserRepository from Top Level
				Container container = EndpointHost.Config.ServiceManager.Container;
				_userRepository = container.Resolve<UserRepository>();
			}
			return _userRepository.Read(session.UserName);
		}
		public void ShouldCreateUsers()
		{
			// Arrange
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);
			List<UserEntity> entities = UserData.GetUsersForInsert();
			repository.ClearCollection();

			// Act
			entities = repository.Create(entities);

			// Assert
			Assert.IsNotNull(entities);
			Assert.AreEqual(2, entities.Count);
		}
		public void ShouldCreateUser()
		{
			// Arrange
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);
			UserEntity entity = UserData.GetUserForInsert();
			repository.ClearCollection();

			// Act
			entity = repository.Create(entity);

			// Assert
			Assert.IsNotNull(entity);
			Assert.AreNotEqual(0, entity.Id);
		}
		public void ShouldThrowArgumentNullExceptionOnConstructor()
		{
			// Act
			try
			{
				UserRepository userRepository = new UserRepository(null);
				Assert.Fail("This should not happen");
			}
			catch (Exception ex)
			{
				// Arrange
				Assert.IsInstanceOf<ArgumentNullException>(ex);
			}
		}
		private static SSAuthInterfaces.UserAuth GetUserAuthByUserNameWithFunctionalPermissions(MongoDatabase mongoDatabase, string userNameOrEmail, UserRepository userRepository = null)
		{
			if (userRepository == null)
			{
				// TODO:  Inject UserRepository from Top Level
				Container container = EndpointHost.Config.ServiceManager.Container;
				userRepository = container.Resolve<UserRepository>();
			}

			if (!string.IsNullOrEmpty(userNameOrEmail))
			{
			UserEntity userEntity = userRepository.Read(userNameOrEmail);

			if(!userEntity.Active)
					throw new AccessViolationException("User not Active!");

			SSAuthInterfaces.UserAuth userAuth = TranslateToUserAuth(userEntity);

			if (userAuth != null)
			{
				userAuth.Permissions = PermissionUtility.GetFunctionalPermissionNamesForRoleIdsAndDomainPermissions(userEntity.Roles,
				userEntity.DomainPermissions, userEntity.TimeZoneId);
			}

			return userAuth;
		}

			return null;
		}
		private static SSAuthInterfaces.UserAuth GetUserAuthByUserName(MongoDatabase mongoDatabase, string userNameOrEmail, UserRepository userRepository = null)
		{
			if (userRepository == null)
			{
				// TODO:  Inject UserRepository from Top Level
				Container container = EndpointHost.Config.ServiceManager.Container;
				userRepository = container.Resolve<UserRepository>();
			}

			UserEntity userEntity = userRepository.Read(userNameOrEmail);

			SSAuthInterfaces.UserAuth userAuth = TranslateToUserAuth(userEntity);

			if (userAuth != null)
			{
				userAuth.Permissions = PermissionUtility.GetPermissionNamesForRoleIdsAndDomainPermissions(userEntity.Roles,
					userEntity.DomainPermissions, userEntity.TimeZoneId);
				//userAuth.Permissions = new List<string>();
				//userAuth.Permissions.Add("DomainPermission_Get");
				//userAuth.Permissions.Add("DomainPermission_Put");
				//userAuth.Permissions.Add("DomainPermission_Post");
				//userAuth.Permissions.Add("DomainPermission_Delete");
				//userAuth.Permissions.Add("DomainPermissions_Get");
				//userAuth.Permissions.Add("FunctionalPermission_Get");
				//userAuth.Permissions.Add("FunctionalPermission_Put");
				//userAuth.Permissions.Add("FunctionalPermission_Post");
				//userAuth.Permissions.Add("FunctionalPermission_Delete");
				//userAuth.Permissions.Add("CurrentUserAuthRequest_Get");
				//userAuth.Permissions.Add("LevelLists_Get");
				//userAuth.Permissions.Add("LevelLists_Put");
				//userAuth.Permissions.Add("LocalizationDictionaryRequest_Get");
				//userAuth.Permissions.Add("LocalizationDictionaryRequest_Put");
				//userAuth.Permissions.Add("LocalizationDictionaryRequest_Post");
				//userAuth.Permissions.Add("Permission_Get");
				//userAuth.Permissions.Add("Permission_Put");
				//userAuth.Permissions.Add("Permission_Post");
				//userAuth.Permissions.Add("Permissions_Get");
				//userAuth.Permissions.Add("Role_Get");
				//userAuth.Permissions.Add("Role_Put");
				//userAuth.Permissions.Add("Role_Post");
				//userAuth.Permissions.Add("Role_Delete");
				//userAuth.Permissions.Add("Roles_Get");
				//userAuth.Permissions.Add("User_Get");
				//userAuth.Permissions.Add("User_Put");
				//userAuth.Permissions.Add("User_Post");
				//userAuth.Permissions.Add("Users_Get");
				//userAuth.Permissions.Add("Users_Post");
			}

			return userAuth;
		}
		public SSAuthInterfaces.UserAuth GetUserAuthByUserName(string userNameOrEmail, UserRepository userRepository)
		{
			return GetUserAuthByUserName(_mongoDatabase, userNameOrEmail, userRepository);
		}
		public void ShouldReadUserWithUserName()
		{
			// Arrange
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);
			UserEntity entity = UserData.GetUserForInsert();
			repository.ClearCollection();
			entity = repository.Create(entity);

			// Act
			UserEntity actual = repository.Read(entity.UserName);

			// Assert
			Assert.AreEqual(entity.Id, actual.Id);
		}
		public void ShouldUpdateUser()
		{
			// Arrange
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);
			UserEntity entity = UserData.GetUserForInsert();
			repository.ClearCollection();
			entity = repository.Create(entity);
			entity.Meta.Add("UpdateField", "FieldUpdated");


			// Act
			UserEntity actual = repository.Update(entity);

			// Assert
			Assert.AreEqual(entity.Meta["UpdateField"], actual.Meta["UpdateField"]);
		}
		public void ShouldReadUserWithIdList()
		{
			// Arrange
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);
			List<UserEntity> entities = UserData.GetUsersForInsert();
			repository.ClearCollection();
			entities = repository.Create(entities);
			List<long> userNames = entities.Select(x => x.Id).ToList();

			// Act
			List<UserEntity> actual = repository.Read(userNames);

			// Assert
			Assert.AreEqual(entities.Count, actual.Count);
		}
		public void TearDown()
		{
			UserRepository repository = new UserRepository(ConfigSettings.UserDatabaseConnectionName);

			repository.ClearCollection();
		}