public ISiteStructureViewModelFactory WithSiteDetailsViewModel(SiteDetailsViewModel siteDetailsViewModel)
        {
            _siteDetailsViewModel = siteDetailsViewModel;

            //var linkToSiteGroupId = siteDetailsViewModel.LinkToGroupId == siteDetailsViewModel.OriginalLinkId ? siteDetailsViewModel.LinkToGroupId : 0;
            _siteDetailsViewModel.ExistingGroups = GetExistingSiteGroups();

            //var linkToSiteId = siteDetailsViewModel.LinkToSiteId == siteDetailsViewModel.OriginalLinkId ? siteDetailsViewModel.LinkToSiteId : 0;
            _siteDetailsViewModel.ExistingSites = GetExistingSites();

            return this;
        }
        public void Given_site_details_view_model_not_got_list_of_sites_When_get_view_model_Then_should_call_appropiate_methods()
        {
            // Arrange
            var viewModelFactory = CreateSiteStructureViewModelFactory();
            var siteDetailsViewModel = new SiteDetailsViewModel {SiteId = 1};
            
            // Act
            viewModelFactory.WithSiteDetailsViewModel(siteDetailsViewModel);

            // Assert
            _siteRequestStructureService.Verify(x => x.GetByCompanyIdNotIncluding(_clientId, siteDetailsViewModel.SiteId), Times.Once());
        }
 public SiteStructureViewModel(long clientId, MvcHtmlString siteChartsHtml, MvcHtmlString unlinkedSitesHtml, SiteDetailsViewModel siteDetailsViewModel, SiteGroupDetailsViewModel siteSiteGroupViewModel, bool showSiteDetailsSection, bool showGroupDetailsSection, bool validationError, bool showClosedSites)
 {
     ValidationError = validationError;
     SiteChartsHtml = siteChartsHtml;
     UnlinkedSitesHtml = unlinkedSitesHtml;
     SiteDetailsViewModel = siteDetailsViewModel;
     ClientId = clientId;
     SiteSiteGroupsViewModel = siteSiteGroupViewModel;
     DisplaySiteDetails = showSiteDetailsSection;
     DisplaySiteGroups = showGroupDetailsSection;
     ShowClosedSites = showClosedSites;
 }
        public bool SendEmailIfRequired(SiteDetailsViewModel viewModel)
        {
            var existingSiteFromClientService = _clientService.GetSite(viewModel.ClientId, viewModel.SiteId);
            var clientCAN = _clientService.GetCompanyDetails(viewModel.ClientId).CAN;

            if (viewModel.SiteId != default(long))
            {
                if (existingSiteFromClientService != null && ((viewModel.AddressLine1 != existingSiteFromClientService.AddressLine1 ||
                                               !viewModel.AddressLine2.IsEqualWithNullOrWhiteSpace(existingSiteFromClientService.AddressLine2) ||
                                               !viewModel.AddressLine3.IsEqualWithNullOrWhiteSpace( existingSiteFromClientService.AddressLine3)  ||
                                               !viewModel.AddressLine4.IsEqualWithNullOrWhiteSpace(existingSiteFromClientService.AddressLine4)   ||
                                               !viewModel.AddressLine5.IsEqualWithNullOrWhiteSpace(existingSiteFromClientService.AddressLine5) ||
                                               !viewModel.County.IsEqualWithNullOrWhiteSpace(existingSiteFromClientService.County) ||
                                               !viewModel.Telephone.IsEqualWithNullOrWhiteSpace(existingSiteFromClientService.Telephone) ||
                                               !viewModel.Postcode.IsEqualWithNullOrWhiteSpace(existingSiteFromClientService.Postcode)) || viewModel.SiteStatusUpdated != SiteStatus.NoChange))
                {
                    _bus.Send(new SendSiteDetailsUpdatedEmail()
                    {
                        ActioningUserName = viewModel.ActioningUserName,
                        CompanyId = viewModel.ClientId,
                        CAN = clientCAN,

                        SiteContactUpdated = viewModel.SiteContact,
                        NameUpdated = viewModel.Name,
                        AddressLine1Updated = viewModel.AddressLine1,
                        AddressLine2Updated = viewModel.AddressLine2,
                        AddressLine3Updated = viewModel.AddressLine3,
                        AddressLine4Updated = viewModel.AddressLine4,
                        AddressLine5Updated = viewModel.AddressLine5,
                        CountyUpdated =  viewModel.County,
                        PostcodeUpdated = viewModel.Postcode,
                        TelephoneUpdated = viewModel.Telephone,

                        SiteContactCurrent = existingSiteFromClientService.SiteContact,
                        NameCurrent = viewModel.NameBeforeUpdate,
                        AddressLine1Current = existingSiteFromClientService.AddressLine1,
                        AddressLine2Current = existingSiteFromClientService.AddressLine2,
                        AddressLine3Current = existingSiteFromClientService.AddressLine3,
                        AddressLine4Current = existingSiteFromClientService.AddressLine4,
                        AddressLine5Current = existingSiteFromClientService.AddressLine5,
                        CountyCurrent =  existingSiteFromClientService.County,
                        PostcodeCurrent = existingSiteFromClientService.Postcode,
                        TelephoneCurrent = existingSiteFromClientService.Telephone,
                        SiteStatusCurrent = EnumHelper.GetEnumDescription(viewModel.SiteStatusCurrent),
                        SiteStatusUpdated = EnumHelper.GetEnumDescription(viewModel.SiteStatusUpdated)
                    });
                    return true;
                }
            }
            return false;
        }
        public void Given_a_invalid_model_When_update_site_Then_should_return_to_view_with_same_viewmodel()
        {
            //Given
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                            .Create()
                                            .WithName(string.Empty)
                                            .Build();


            _siteStructureViewModelFactory
                .Setup(x => x.WithSiteDetailsViewModel(_siteDetailsViewModel))
                .Returns(_siteStructureViewModelFactory.Object);

            _siteStructureViewModelFactory
                    .Setup(x => x.WithClientId(TestControllerHelpers.CompanyIdAssigned))
                    .Returns(_siteStructureViewModelFactory.Object);

            _siteStructureViewModelFactory
                    .Setup(x => x.DisplaySiteDetails())
                    .Returns(_siteStructureViewModelFactory.Object);

            _siteStructureViewModelFactory
                    .Setup(x => x.GetViewModel())
                    .Returns(new SiteStructureViewModel(_clientId, MvcHtmlString.Empty, MvcHtmlString.Empty, _siteDetailsViewModel, null, false, false, false, true));

            _siteStructureViewModelFactory.Setup(ss => ss.WithValidationError(true)).Returns(_siteStructureViewModelFactory.Object);

            var target = GetTarget();

            target.ModelState.AddModelError("Name", "Is required");

            //When
            var result = target.UpdateSite(_siteDetailsViewModel) as ViewResult;

            //Then            
            Assert.That(result.ViewName, Is.EqualTo("Index"));
            var model = result.Model as SiteStructureViewModel;
            Assert.That(model.SiteDetailsViewModel, Is.EqualTo(_siteDetailsViewModel));
        }
        public void Given_view_model_with_site_structure_id_and_client_id_When_UpdateSite_Then_calls_site_service_GetByIdAndCompanyId()
        {
            // Given
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                             .Create()
                                             .WithSiteStructureId(_siteStructureId)
                                             .WithClientId(_clientId)
                                             .Build();
            var target = GetTarget();

            // When
            target.UpdateSite(_siteDetailsViewModel);

            // Then
            _siteService.Verify(x => x.GetByIdAndCompanyId(_siteStructureId, _clientId));
        }
        public void Given_view_model_with_site_id_and_client_id_When_UpdateSite_Then_calls_site_service_GetByIdAndCompanyId()
        {
            // Given
            _siteService
                .Setup(x => x.GetByIdAndCompanyId(_siteStructureId, _clientId))
                .Returns(new SiteDto { Name = "site" });

            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                             .Create()
                                             .WithSiteStructureId(_siteStructureId)
                                             .WithClientId(_clientId)
                                             .Build();
            //_siteService
            //    .Setup(x => x.GetByIdAndCompanyId(_siteStructureId, _clientId))
            //    .Throws<Exception>();

            var target = GetTarget();

            // When
            var result = target.UpdateSite(_siteDetailsViewModel);
            
            // Then
            _siteUpdateCompositionGateway
                .Verify(x => x.SendEmailIfRequired(It.Is<SiteDetailsViewModel>
                    (y => y.NameBeforeUpdate.Equals("site"))));

        }
        public void Given_a_valid_model_for_editing_site_When_update_site_Then_should_set_correct_success_message()
        {
            //Given
            _siteService
                .Setup(x => x.GetByIdAndCompanyId(10, It.IsAny<long>()))
                .Returns(new SiteDto{ Name = "site"});

            const string expectedMessage = "A member of Client Services has been notified and will be in contact in due course";
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                            .Create()
                                            .WithSiteStructureId(10)
                                            .WithSiteId(100)
                                            .Build();

            var target = GetTarget();

            _siteUpdateCompositionGateway.Setup(x => x.SendEmailIfRequired(_siteDetailsViewModel)).Returns(true);

            //When
            var result = target.UpdateSite(_siteDetailsViewModel) as RedirectToRouteResult;

            //Then            
            Assert.That(result, Is.Not.Null);
            Assert.That((target.TempData[SitesController.MessageKey] as string), Is.EqualTo(expectedMessage));
        }
        public void Given_that_address_info_change_is_true_Then_correct_message_is_returned()
        {
            //Given
            _siteService
                .Setup(x => x.GetByIdAndCompanyId(10, It.IsAny<long>()))
                .Returns(new SiteDto { Name = "site" });

            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                .Create().WithSiteStructureId(10)
                                .WithName(string.Empty)
                                .Build();

            const string expectedMessage = "Your changes have been successfully saved";
            var target = GetTarget();
            _siteService.Setup(ss => ss.CreateUpdate(It.IsAny<CreateUpdateSiteRequest>())).Returns(10);

            //When
            target.UpdateSite(_siteDetailsViewModel);

            //Then            
            Assert.That((target.TempData[SitesController.MessageKey] as string), Is.EqualTo(expectedMessage));
        }
        private ActionResult SaveSite(SiteDetailsViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                var structureViewModel = GetSiteStructureViewModel(viewModel);

                return View("Index", structureViewModel);
            }

            var request = new SiteAddressRequestMapper().Map(viewModel, CurrentUser.UserId);

            try
            {
                if (viewModel.SiteStructureId != default(long))
                {
                    var siteBeforeUpdate = _siteService.GetByIdAndCompanyId(viewModel.SiteStructureId,
                                                                            viewModel.ClientId);
                    viewModel.NameBeforeUpdate = siteBeforeUpdate.Name;
                }

                var validationMessages = _siteService.ValidateSiteCloseRequest(request);

                if (!validationMessages.Any())
                {
                    bool isSiteOpenRequest , isSiteClosedRequest;
                    //Site can be opened, closed or remains with no change
                    _siteService.GetSiteOpenClosedRequest(request, out isSiteOpenRequest, out isSiteClosedRequest);
                    request.IsSiteOpenRequest = isSiteOpenRequest;
                    request.IsSiteClosedRequest = isSiteClosedRequest;
                    if (isSiteOpenRequest)
                    {
                        viewModel.SiteStatusUpdated = SiteStatus.Open;
                    }
                    else 
                        if(isSiteClosedRequest)
                        {
                            viewModel.SiteStatusUpdated = SiteStatus.Close;
                        }
                        else
                        {
                            viewModel.SiteStatusUpdated = SiteStatus.NoChange;
                        }

                    _siteService.CreateUpdate(request);
                    TempData[UpdateSiteIdKey] = viewModel.SiteId;

                    viewModel.ActioningUserName = CurrentUser.FullName;
                    
                    var addressInformationChange = _siteUpdateCompositionGateway.SendEmailIfRequired(viewModel);

                    SetSavedSiteSuccessMessage(viewModel, addressInformationChange);
                }
                else
                {

                    var faultMessages = new List<ValidationFailure>();
                    foreach (var validationMessage in validationMessages)
                    {
                        faultMessages.Add(new ValidationFailure("SiteClosed", validationMessage));
                    }

                    throw new ValidationException(faultMessages);
                }
            }
            catch (ValidationException e)
            {
                ModelState.Update(e);
                var structureViewModel = GetSiteStructureViewModel(viewModel);
                return View("Index", structureViewModel);
            }
            return RedirectToAction("Index", "SitesStructure");
        }
        public void Given_a_valid_model_for_new_site_When_update_site_Then_should_set_correct_success_message()
        {
            //Given
            string expectedMessage = "Your new Site has been successfully created";
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                            .Create()
                                            .WithSiteStructureId(0)
                                            .WithSiteId(100)
                                            .Build();



            var target = GetTarget();

            _siteUpdateCompositionGateway.Setup(x => x.SendEmailIfRequired(_siteDetailsViewModel)).Returns(false);

            //When
            var result = target.UpdateSite(_siteDetailsViewModel) as RedirectToRouteResult;

            //Then            
            Assert.That(result, Is.Not.Null);
            Assert.That((target.TempData[SitesController.MessageKey] as string), Is.EqualTo(expectedMessage));

        }
 private SiteStructureViewModel GetSiteStructureViewModel(SiteDetailsViewModel siteDetailsViewModel)
 {
     var viewModel = _siteStructureViewModelFactory
         .WithClientId(CurrentUser.CompanyId)
         .WithSiteDetailsViewModel(siteDetailsViewModel)
         .WithValidationError(true)
         .DisplaySiteDetails()
         .GetViewModel();
     return viewModel;
 }
        public void Given_a_valid_model_When_update_site_Then_viewModel_should_have_currentUsers_full_name_as_actioning_user()
        {
            //Given
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                            .Create()
                                            .Build();



            var target = GetTarget();

            //When
            var result = target.UpdateSite(_siteDetailsViewModel) as ViewResult;

            //Then
            _siteUpdateCompositionGateway.Verify(x => x.SendEmailIfRequired(It.Is<SiteDetailsViewModel>(y => y.ActioningUserName == TestControllerHelpers.UserFullNameAssigned)));
        }
        public SiteDetailsViewModel GetViewModel()
        {
            SiteDto localSiteDto = null;
            SiteAddressDto peninsulaSiteDto = null;

            if (_id != default(long))
            {
                localSiteDto = _siteService.GetByIdAndCompanyId(_id, _clientId);
                peninsulaSiteDto = _clientService.GetSite(_clientId, localSiteDto.SiteId.Value);
            }

            else if (_siteId != default(long))
            {
                localSiteDto = new SiteDto();
                peninsulaSiteDto = _clientService.GetSite(_clientId, _siteId);
            }

            var siteDetailsViewModel = new SiteDetailsViewModel
                                           {
                                               SiteStructureId = localSiteDto.Id,
                                               ClientId = _clientId,
                                               Name = localSiteDto.Name,
                                               Reference = peninsulaSiteDto.Reference,
                                               LinkToSiteId =
                                                   localSiteDto.Parent != null &&
                                                   (localSiteDto.Parent as SiteDto != null)   //todo: replace with when proxy issue fixed
                                                   //localSiteDto.Parent.SiteStructureElementType == "Site"
                                                       ? (long?)localSiteDto.Parent.Id
                                                       : null,
                                               LinkToGroupId =
                                                   localSiteDto.Parent != null &&
                                                   (localSiteDto.Parent as SiteGroupDto != null)  //todo: replace with when proxy issue fixed
                                                   //localSiteDto.Parent.SiteStructureElementType == "SiteGroup"
                                                       ? (long?)localSiteDto.Parent.Id
                                                       : null,
                                               OriginalLinkId =
                                                   localSiteDto.Parent != null ? (long?)localSiteDto.Parent.Id : null,
                                               AddressLine1 = peninsulaSiteDto.AddressLine1,
                                               AddressLine2 = peninsulaSiteDto.AddressLine2,
                                               AddressLine3 = peninsulaSiteDto.AddressLine3,
                                               AddressLine4 = peninsulaSiteDto.AddressLine4,
                                               AddressLine5 = peninsulaSiteDto.AddressLine5,
                                               County = peninsulaSiteDto.County,
                                               Postcode = peninsulaSiteDto.Postcode,
                                               Telephone = peninsulaSiteDto.Telephone,
                                               SiteContact = localSiteDto.SiteContact,
                                               SiteClosed = localSiteDto.SiteClosed,
                                               SiteStatusCurrent = localSiteDto.SiteClosed ? SiteStatus.Close : SiteStatus.Open
                                           };

            if (_id != default(long))
            {
                siteDetailsViewModel.SiteId = localSiteDto.SiteId.HasValue ? localSiteDto.SiteId.Value : 0;
                siteDetailsViewModel.IsMainSite = localSiteDto.Parent == null;
            }

            else if (_siteId != default(long))
            {
                siteDetailsViewModel.SiteId = _siteId;
                siteDetailsViewModel.IsMainSite = false;
            }

            if (localSiteDto.Id == 0 || localSiteDto.Parent != null)
            {
                long siteId = _siteId != default(long) ? _siteId : localSiteDto.SiteId.Value;

                var sites = _siteService
                    .GetByCompanyIdNotIncluding(_clientId, siteId)
                    .OrderBy(x => x.Name);

                siteDetailsViewModel.ExistingSites = sites
                                                        .Where(x => localSiteDto.ChildIdsThatCannotBecomeParent.Contains(x.Id) == false)
                                                        .Select(AutoCompleteViewModel.ForSite)
                                                        .AddDefaultOption();

                var siteGroups = _siteGroupService
                    .GetByCompanyIdExcludingSiteGroup(_clientId, siteId)
                    .OrderBy(x => x.Name);


                siteDetailsViewModel.ExistingGroups = siteGroups
                                                        .Where(x => localSiteDto.ChildIdsThatCannotBecomeParent.Contains(x.Id) == false)
                                                        .Select(AutoCompleteViewModel.ForSiteGroup)
                                                        .AddDefaultOption();
            }
            else
            {
                siteDetailsViewModel.ExistingSites = new List<AutoCompleteViewModel>()
                                                         {
                                                             new AutoCompleteViewModel("--Select Option--","")
                                                         };
                siteDetailsViewModel.ExistingGroups = new List<AutoCompleteViewModel>() 
                                                         {
                                                             new AutoCompleteViewModel("--Select Option--","")
                                                         };
            }

            return siteDetailsViewModel;
        }
        public void Setup()
        {
            _bus = new Mock<IBus>();
            _clientService = new Mock<IClientService>();
            _emailTemplateService = new Mock<IEmailTemplateService>();
            _templateEngine = new Mock<ITemplateEngine>();
            _emailSenderService = new Mock<IEmail>();
            _companyId = 735L;
            _peninsulaSiteId = 763476L;
            _siteStructureId = 111L;

            _siteAddressDto = new SiteAddressDto
                                  {
                                      AddressLine1 = "Add1",
                                      AddressLine2 = "Add2",
                                      AddressLine3 = "Add3",
                                      AddressLine4 = "Add4",
                                      Postcode = "PC",
                                      Telephone = "01234 567890",
                                      SiteId = _peninsulaSiteId
                                  };

            _can = "my can";
            var _companyDetails = new CompanyDetailsDto(123, "companyName", _can, "address_line1", "address_line2", "address_line3", "address_line4", 123456L, "postcode", "telephone", "website", "main contact"

            );

            _bus.Setup(x => x.Send(It.IsAny<SendSiteDetailsUpdatedEmail>()));

            _clientService
                .Setup(x => x.GetSite(_companyId, _peninsulaSiteId))
                .Returns(_siteAddressDto);

            _clientService
                .Setup(x => x.GetCompanyDetails(_companyId))
                .Returns(_companyDetails);

            _emailTemplateDto = new EmailTemplateDto
                                    {
                                        Subject = "TEST SUBJECT"
                                    };

            _emailTemplateService
                .Setup(x => x.GetByEmailTemplateName(EmailTemplateName.SiteAddressChangeNotification))
                .Returns(_emailTemplateDto);

            _emailBody = "TEST EMAIL BODY";

            _templateEngine
                .Setup(x => x.Render(It.IsAny<CompanyDetails>(), It.IsAny<string>()))
                .Returns(_emailBody);

            _viewModel = new SiteDetailsViewModel
                             {
                                 AddressLine1 = "Add1",
                                 AddressLine2 = "Add2",
                                 AddressLine3 = "Add3",
                                 AddressLine4 = "Add4",
                                 Postcode = "PC",
                                 Telephone = "01234 567890",
                                 SiteId = _peninsulaSiteId,
                                 SiteStructureId = _siteStructureId,
                                 ClientId = _companyId,
                                 SiteStatusUpdated = SiteStatus.NoChange
                             };

            _emailSenderService.SetupSet(x => x.Body = It.IsAny<string>()).Verifiable();
            _emailSenderService.SetupSet(x => x.Subject = It.IsAny<string>()).Verifiable();
            _emailSenderService.SetupSet(x => x.From = It.IsAny<string>()).Verifiable();
        }
 public static long? GetParentId(SiteDetailsViewModel siteDetailsViewModel)
 {
     return
         new ParentIdFinder(siteDetailsViewModel.LinkToSiteId, siteDetailsViewModel.LinkToGroupId).GetLinkId();
 }
 public CreateUpdateSiteRequest Map(SiteDetailsViewModel siteDetailsViewModel, Guid currentUserId)
 {
     var request = Mapper.Map<SiteDetailsViewModel, CreateUpdateSiteRequest>(siteDetailsViewModel);
     request.CurrentUserId = currentUserId;
     return request;
 }
        private void SetSavedSiteSuccessMessage(SiteDetailsViewModel siteDetailsViewModel, bool onlyAddressDetailInformationIsChanged)
        {
            const string ifOnlyDetailInfoChangedMessage = "A member of Client Services has been notified and will be in contact in due course";
            const string ifAddressDetailInfoChangedMessage = "Your changes have been successfully saved";

            TempData[MessageKey] = siteDetailsViewModel.SiteStructureId == 0
                                       ? "Your new Site has been successfully created"
                                       : (onlyAddressDetailInformationIsChanged ? ifOnlyDetailInfoChangedMessage : ifAddressDetailInfoChangedMessage);
        }
        public void Given_a_valid_model_When_update_site_Then_should_call_appropiate_methods()
        {
            //Given
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                            .Create()
                                            .Build();



            var target = GetTarget();

            //When
            var result = target.UpdateSite(_siteDetailsViewModel) as ViewResult;

            //Then            
            _siteService.Setup(x => x.CreateUpdate(It.IsAny<CreateUpdateSiteRequest>()));

        }
        public void Given_a_valid_model_When_update_site_Then_should_set_correct_route_values()
        {
            //Given
            _siteDetailsViewModel = SiteDetailsViewModelBuilder
                                            .Create()
                                            .WithSiteId(100)
                                            .Build();



            var target = GetTarget();

            //When
            var result = target.UpdateSite(_siteDetailsViewModel) as RedirectToRouteResult;

            //Then            
            Assert.That(result, Is.Not.Null);
            Assert.That(result.RouteValues["action"], Is.EqualTo("Index"));
            Assert.That(result.RouteValues["controller"], Is.EqualTo("SitesStructure"));
            Assert.That(result.RouteValues.Values.Where(x => x.ToString() == "id"), Is.Not.Null);
            Assert.That(target.TempData[SitesController.UpdateSiteIdKey], Is.EqualTo(_siteDetailsViewModel.SiteId));
        }
 public static SiteDetailsViewModelBuilder Create()
 {
     _siteDetailsViewModel = new SiteDetailsViewModel();
     return new SiteDetailsViewModelBuilder();
 }
 public ActionResult UpdateSite(SiteDetailsViewModel siteDetailsViewModel)
 {
     return SaveSite(siteDetailsViewModel);
 }