public static void ClassInit(TestContext context)
        {
            _container = new UnityContainer();
            _container.AddNewExtension<EnterpriseLibraryCoreExtension>();
            using (IConsoleRepository repository = _container.Resolve<ConsoleRepository>())
            {
                var team = repository.Query<Team>(t=>t.RelatedOffices).FirstOrDefault(t => t.Title == "New Test Team");
                if (team != null)
                {
                    repository.Attach<Team>(team);
                    repository.Delete<Team>(team);
                    repository.SaveChanges();
                }
            }

            using (IConsoleRepository repository = _container.Resolve<ConsoleRepository>())
            {
                var team = repository.Query<Team>(t => t.RelatedOffices).FirstOrDefault(t => t.Title == "Test Team");
                if (team != null)
                {
                    repository.Attach<Team>(team);
                    repository.Delete<Team>(team);
                    repository.SaveChanges();
                }
            }

            _logHandler = new LogHandler();
            var consoleRepository = new ConsoleRepository();
            _mockCurrentHttpContext = new Mock<CurrentHttpContext>();
            _mockCurrentHttpContext.Setup(h => h.CurrentUser).Returns(new GenericPrincipal(new GenericIdentity(@"talbotdev\MurrayE"), null));
            _mockCurrentHttpContext.Setup(h => h.Context).Returns(MvcMockHelpers.FakeHttpContextWithSession());

            var adminModuleManager = new AdminModuleManager(consoleRepository, _logHandler, _mockCurrentHttpContext.Object, new WebSiteModuleManager(consoleRepository, _mockCurrentHttpContext.Object));
            _editUserDto = adminModuleManager.GetUser(4);

            var consoleRepository2 = new ConsoleRepository();
            var adminModuleManager2 = new AdminModuleManager(consoleRepository2, _logHandler, _mockCurrentHttpContext.Object, new WebSiteModuleManager(consoleRepository2, _mockCurrentHttpContext.Object));
            var teamDto = new TeamDto { Title = "Test Team", QuoteExpiryDaysDefault = 2, DefaultPolicyType = "MARINE" };
            _testTeam = adminModuleManager2.CreateTeam(teamDto);
        }
        public TeamDto EditTeam(TeamDto teamDto)
        {
            using (ConsoleRepository)
            {
                var team =
                    ConsoleRepository.Query<Team>(t => t.Memberships.Select(mu => mu.User.FilterCOBs),
                                                    t => t.Memberships.Select(mu => mu.User.FilterOffices), 
                                                    t => t.RelatedCOBs,
                                                    t => t.RelatedOffices, 
                                                    t => t.Links).FirstOrDefault(t => t.Id == teamDto.Id);

                if (team == null)
                    throw new Exception("Team to Edit does not exist"); // TODO: throw new NullReferenceException(team);

                ConsoleRepository.Attach<Team>(team);

                team.Title = teamDto.Title;
                team.DefaultDomicile = teamDto.DefaultDomicile;
                team.DefaultMOA = teamDto.DefaultMOA;
                team.QuoteExpiryDaysDefault = teamDto.QuoteExpiryDaysDefault;
                team.DefaultPolicyType = string.IsNullOrEmpty(teamDto.DefaultPolicyType)
                                             ? "MARINE"
                                             : teamDto.DefaultPolicyType;

                if (teamDto.Links != null)
                {
                    if (team.Links != null)
                        team.Links.Clear();

                    var linkList = new List<Link>();
                    foreach (var newLink in teamDto.Links)
                    {
                        var link = ConsoleRepository.Query<Link>().FirstOrDefault(l => l.Id == newLink.Id);
                        if (link != null)
                            linkList.Add(link);
                    }
                    team.Links = linkList;
                }

                if (teamDto.RelatedCOBs != null)
                {
                    if (team.RelatedCOBs != null)
                        team.RelatedCOBs.Clear();

                    var cobList = new List<COB>();
                    foreach (var newCOB in teamDto.RelatedCOBs)
                    {
                        var cob = ConsoleRepository.Query<COB>().FirstOrDefault(c => c.Id == newCOB.Id);
                        if (cob != null)
                            cobList.Add(cob);
                    }
                    team.RelatedCOBs = cobList;
                }

                if (teamDto.RelatedOffices != null)
                {
                    if (team.RelatedOffices != null)
                        team.RelatedOffices.Clear();

                    var officeList = new List<Office>();
                    foreach (var newOffice in teamDto.RelatedOffices)
                    {
                        var office = ConsoleRepository.Query<Office>().FirstOrDefault(c => c.Id == newOffice.Id);
                        if (office != null)
                            officeList.Add(office);
                    }
                    team.RelatedOffices = officeList;
                }

                //  TeamMembership
                if (teamDto.AllUsers != null)
                {
                    foreach (var membership in teamDto.AllUsers)
                    {
                        var teamMembership = team.Memberships.FirstOrDefault(tm => tm.UserId == membership.Id);
                        if (teamMembership != null)
                        {
                            if (!membership.IsCurrentMembership)
                            {
                                teamMembership.IsCurrent = false;
                                teamMembership.EndDate = DateTime.Now;

                                // Remove team filters from user
                                var user =
                                    team.Memberships.Where(
                                        tm => tm.UserId == teamMembership.UserId && tm.IsCurrent == false)
                                        .Select(t => t.User)
                                        .FirstOrDefault();

                                if (user != null)
                                {
                                    foreach (var cob in team.RelatedCOBs)
                                    {
                                        user.FilterCOBs.Remove(cob);
                                    }

                                    foreach (var office in team.RelatedOffices)
                                    {
                                        user.FilterOffices.Remove(office);
                                    }
                                }
                            }
                            else
                            {
                                teamMembership.IsCurrent = true;
                                teamMembership.EndDate = null;
                            }
                        }
                    }
                }

                if (teamDto.Users != null)
                {
                    var userList = new List<User>();
                    foreach (var newMem in teamDto.Users)
                    {
                        var currentMem = team.Memberships.FirstOrDefault(m => m.UserId == newMem.Id);
                        var user = ConsoleRepository.Query<User>(u => u.FilterOffices, u => u.FilterCOBs).FirstOrDefault(u => u.Id == newMem.Id);

                        if (currentMem == null)
                        {
                            team.Memberships.Add(new TeamMembership
                                {
                                    TeamId = team.Id,
                                    UserId = newMem.Id,
                                    StartDate = DateTime.Now,
                                    EndDate = null
                                });
                        }
                        else
                        {
                            userList.Add(user);

                            currentMem.IsCurrent = true;
                            currentMem.EndDate = null;
                        }
                    }

                    // Add Team FilterCOBs and FilterOffices to added users
                    foreach (var user in userList)
                    {
                        AddTeamFilters(team.Memberships.Select(tm => tm.TeamId).Distinct(), user, team);
                    }
                }

                ConsoleRepository.SaveChanges();

                return teamDto;
            }
        }
        public TeamDto CreateTeam(TeamDto teamDto)
        {
            using (ConsoleRepository)
            {
                var existingTeam = ConsoleRepository.Query<Team>().FirstOrDefault(t => t.Title == teamDto.Title);

                if (existingTeam != null)
                    throw new ArgumentException("Team already exists, please use another Title.");

                var team = new Team
                    {
                        Title = teamDto.Title,
                        DefaultDomicile = teamDto.DefaultDomicile,
                        DefaultMOA = teamDto.DefaultMOA,
                        QuoteExpiryDaysDefault = teamDto.QuoteExpiryDaysDefault,
                        DefaultPolicyType = (string.IsNullOrEmpty(teamDto.DefaultPolicyType)) ? "MARINE" : teamDto.DefaultPolicyType
                    };

                if (teamDto.Links != null)
                {
                    var linkList = new List<Link>();
                    foreach (var newLink in teamDto.Links)
                    {
                        var link = ConsoleRepository.Query<Link>().FirstOrDefault(l => l.Id == newLink.Id);
                        linkList.Add(link);
                    }
                    team.Links = linkList;
                }

                if (teamDto.RelatedCOBs != null)
                {
                    var cobList = new List<COB>();
                    foreach (var newCOB in teamDto.RelatedCOBs)
                    {
                        var cob = ConsoleRepository.Query<COB>().FirstOrDefault(c => c.Id == newCOB.Id);
                        cobList.Add(cob);
                    }
                    team.RelatedCOBs = cobList;
                }

                if (teamDto.RelatedOffices != null)
                {
                    var officeList = new List<Office>();
                    foreach (var newOffice in teamDto.RelatedOffices)
                    {
                        var office = ConsoleRepository.Query<Office>().FirstOrDefault(c => c.Id == newOffice.Id);
                        officeList.Add(office);
                    }
                    team.RelatedOffices = officeList;
                }

                if (teamDto.Users != null)
                {
                    var teamMembershipList = new List<TeamMembership>();
                    var userList = new List<User>();
                    foreach (var newUser in teamDto.Users)
                    {
                        var user = ConsoleRepository.Query<User>().FirstOrDefault(u => u.Id == newUser.Id);
                        userList.Add(user);
                        teamMembershipList.Add(new TeamMembership
                            {
                                User = user,
                                Team = team,
                                StartDate = DateTime.Now,
                                EndDate = null
                            });
                    }
                    team.Memberships = teamMembershipList;

                    // Add Team FilterCOBs and FilterOffices to added users
                    foreach (var user in userList)
                    {
                        AddTeamFilters(teamMembershipList.Select(tm => tm.TeamId).Distinct(), user, team);
                    }
                }

                ConsoleRepository.Add<Team>(team);
                ConsoleRepository.SaveChanges();

                teamDto.Id = team.Id;
                return teamDto;
            }
        }
        public void CreateSimpleTeam_Success()
        {
            // Assign
            var expectedTeam = new TeamDto { Title = "New Test Team", QuoteExpiryDaysDefault = 1 };

            // Act
            _actualTestTeam = _adminModuleManager.CreateTeam(expectedTeam);

            // Assert
            Assert.IsNotNull(_actualTestTeam);

        }
        public ActionResult EditTeam(TeamDto team)
        {
            try
            {
                var updatedTeam = _adminModuleManager.EditTeam(team);

                return new JsonNetResult
                {
                    Data = updatedTeam
                };
            }
			catch (Exception ex) // TODO: Remove
            {
                _logHandler.WriteLog(ex.ToString(), LogSeverity.Error, LogCategory.BusinessComponent);
                throw new HttpException(500, "Server Error");
            }
        }
        public ActionResult CreateTeam(TeamDto team)
        {
            try
            {
				if (!ModelState.IsValid) // TODO: Throw new HttpException with status code of bad request
                    throw new ArgumentException("'Title' and 'Default QuoteExpiry Days' are required");

                return new JsonNetResult
                        {
                            Data = _adminModuleManager.CreateTeam(team)
                        };
            }
			catch (ArgumentException ex) // TODO: Remove
            {
                _logHandler.WriteLog(ex.ToString(), LogSeverity.Error, LogCategory.BusinessComponent);
                this.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json(new { ErrorMessage = ex.Message });
            }
			catch (ApplicationException ex) // TODO: Remove
            {
                _logHandler.WriteLog(ex.ToString(), LogSeverity.Error, LogCategory.BusinessComponent);
                this.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return Json(new { ErrorMessage = ex.Message });
            }
			catch (Exception ex) // TODO: Remove
            {
                _logHandler.WriteLog(ex.ToString(), LogSeverity.Error, LogCategory.BusinessComponent);
                this.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return Json(new { ErrorMessage = ex.Message });
            }
        }