public IActionResult Edit(OrganizationEditModel organization)
        {
            if (ModelState.IsValid)
            {
                int id = _bus.Send(new OrganizationEditCommand { Organization = organization });
                return RedirectToAction("Details", new { id = id, area = "Admin" });
            }

            return View("Edit", organization);
        }
        public  IActionResult Create(OrganizationEditModel organization)
        {
            if (organization == null)
                return new BadRequestResult();
            if (ModelState.IsValid)
            {
                _bus.Send(new OrganizationEditCommand { Organization = organization });
                return RedirectToRoute("areaRoute", new {controller = "Organization", action = "Index"});
            }

            return View("Create", organization);
        }
 public OrganizationControllerTests()
 {
     _organizationEditModel = new OrganizationEditModel
     {
         Id = 0,
         LogoUrl = "http://www.example.com/image.jpg",
         Name = "Test",
         PrimaryContactFirstName = "FirstName",
         PrimaryContactLastName = "LastName",
         PrimaryContactPhoneNumber = "0123456798",
         PrimaryContactEmail = "*****@*****.**",
         WebUrl = "http://www.example.com"
     };
 }
        public IActionResult Edit(OrganizationEditModel organization)
        {
            if (organization == null)
            {
                return HttpBadRequest();
            }
            
            if (ModelState.IsValid)
            {
                int id = _mediator.Send(new OrganizationEditCommand { Organization = organization });
                return RedirectToAction("Details", new { id = id, area = "Admin" });
            }

            return View("Edit", organization);
        }
        /// <summary>
        /// Creates an OrganizationEditModel from an existing Organization 
        /// </summary>
        /// <param name="organization">An Organization that will be supply the initial values for editing.</param>
        /// <returns>An OrganizationEditModel that can be used to capture the fields for an Organization
        /// and it's location and primary contact built from values from the supplied organization. </returns>
        public static OrganizationEditModel ToEditModel_Organization(Organization organization)
        {
            OrganizationEditModel ret = new OrganizationEditModel()
            {
                Id = organization.Id,
                Name = organization.Name,
                Location = organization.Location.ToEditModel(),
                LogoUrl = organization.LogoUrl,
                WebUrl = organization.WebUrl,
                PrivacyPolicy = organization.PrivacyPolicy
            };
            if (organization.OrganizationContacts?.SingleOrDefault(tc => tc.ContactType == (int)ContactTypes.Primary)?.Contact != null)
            {
                ret = (OrganizationEditModel)organization.OrganizationContacts?.SingleOrDefault(tc => tc.ContactType == (int)ContactTypes.Primary)?.Contact.ToEditModel(ret);
            }

            return ret;
        }
        public IActionResult Edit(OrganizationEditModel organization)
        {
            if (organization == null)
            {
                return HttpBadRequest();
            }
            
            if (ModelState.IsValid)
            {
                bool isNameUnique = _mediator.Send(new OrganizationNameUniqueQuery() { OrganizationName = organization.Name, OrganizationId = organization.Id });
                if (isNameUnique)
                {
                    int id = _mediator.Send(new OrganizationEditCommand { Organization = organization });
                    return RedirectToAction("Details", new { id = id, area = "Admin" });
                }
                else
                {
                    ModelState.AddModelError(nameof(organization.Name), "Organization with same name already exists. Please use different name.");
                }
            }

            return View("Edit", organization);
        }
        public async Task<IActionResult> Edit(OrganizationEditModel organization)
        {
            if (organization == null)
            {
                return BadRequest();
            }

            var errors = _organizationValidator.Validate(organization);
            errors.ToList().ForEach(e => ModelState.AddModelError(e.Key, e.Value));

            if (ModelState.IsValid)
            {
                var isNameUnique = await _mediator.SendAsync(new OrganizationNameUniqueQueryAsync { OrganizationName = organization.Name, OrganizationId = organization.Id });
                if (isNameUnique)
                {
                    var id = await _mediator.SendAsync(new EditOrganizationAsync { Organization = organization });
                    return RedirectToAction(nameof(Details), new { id, area = "Admin" });
                }

                ModelState.AddModelError(nameof(organization.Name), "Organization with same name already exists. Please use different name.");
            }

            return View("Edit", organization);
        }
        public async Task EditGetReturnsCorrectViewAndViewModel_WhenMediatorReturnsOrganizationEditModel()
        {
            CreateSut();

      var model = new OrganizationEditModel();

            _mediator.Setup(x => x.SendAsync(It.Is<OrganizationEditQueryAsync>(y => y.Id == Id))).ReturnsAsync(model);

            var result = (ViewResult) await _sut.Edit(Id);

      Assert.Equal("Edit", result.ViewName);
      Assert.Same(model, result.ViewData.Model);
    }
        public void EditPostShouldRedirectToDetailsWithTheIdFromTheMediatorIfModelStateIsValid()
        {
            var mockMediator = new Mock<IMediator>();

            var controller = new OrganizationController(mockMediator.Object);

            var mockContext = MockActionContextWithUser(SiteAdmin());
            controller.ActionContext = mockContext.Object;

            var model = new OrganizationEditModel();

            mockMediator.Setup(x => x.Send(It.Is<OrganizationEditCommand>(y => y.Organization == model))).Returns(Id);

            var result = (RedirectToActionResult)controller.Edit(model);

            Assert.Equal("Details", result.ActionName);
            Assert.Equal("Admin", result.RouteValues["area"]);
            Assert.Equal(Id, result.RouteValues["id"]);
        }
        public void EditPostShouldReturnTheEditViewWithTheModelPassedInIfTheModelStateIsInvalid()
        {
            var controller = new OrganizationController(new Mock<IMediator>().Object);

            var mockContext = MockActionContextWithUser(SiteAdmin());
            controller.ActionContext = mockContext.Object;

            controller.ModelState.AddModelError("foo", "bar");

            var model = new OrganizationEditModel();

            var result = (ViewResult)controller.Edit(model);

            Assert.Equal("Edit", result.ViewName);
            Assert.Same(model, result.ViewData.Model);
        }
        public void EditGetShouldReturnEditViewWhenMediatorReturnsOrganizationEditModel()
        {
            CreateSut();

            var model = new OrganizationEditModel();

            _mediator.Setup(x => x.Send(It.Is<OrganizationEditQuery>(y => y.Id == Id))).Returns(model);

            var result = (ViewResult)_sut.Edit(Id);

            Assert.Equal("Edit", result.ViewName);
            Assert.Same(model, result.ViewData.Model);
        }
        public void EditPostShouldRedirectToDetailsWithTheIdFromTheBusIfModelStateIsValid()
        {
            CreateSut();

            var model = new OrganizationEditModel();

            _bus.Setup(x => x.Send(It.Is<OrganizationEditCommand>(y => y.Organization == model))).Returns(Id);

            var result = (RedirectToActionResult)_sut.Edit(model);

            Assert.Equal("Details", result.ActionName);
            Assert.Equal("Admin", result.RouteValues["area"]);
            Assert.Equal(Id, result.RouteValues["id"]);
        }
        public void EditPostShouldReturnTheEditViewWithTheModelPassedInIfTheModelStateIsInvalid()
        {
            CreateSut();
            AddErrorToModelState();

            var model = new OrganizationEditModel();

            var result = (ViewResult)_sut.Edit(model);

            Assert.Equal("Edit", result.ViewName);
            Assert.Same(model, result.ViewData.Model);
        }
        public async Task EditPostSendsOrganizationNameUniqueQueryWithCorrectParametersWhenModelStateIsValid()
        {
            var mediator = new Mock<IMediator>();
            var organizationEditModel = new OrganizationEditModel { Name = "name", Id = 1 };

            var controller = new OrganizationController(mediator.Object, SuccessValidator());
            await controller.Edit(organizationEditModel);

            mediator.Verify(x => x.SendAsync(It.Is<OrganizationNameUniqueQueryAsync>(y => y.OrganizationName == organizationEditModel.Name && y.OrganizationId == organizationEditModel.Id)), 
                Times.Once());
        }
        public async Task EditPostReturnsTheCorrectViewAndViewModelWhenModelStateIsInvalid()
        {
            var model = new OrganizationEditModel();

            var controller = new OrganizationController(new Mock<IMediator>().Object, SuccessValidator());
            controller.ModelState.AddModelError("foo", "bar");
            var result = (ViewResult)await controller.Edit(model);

            Assert.Equal("Edit", result.ViewName);
            Assert.Same(model, result.ViewData.Model);
        }
 public void CreateNewOrganizationWithExistingOrganizationNameReturnsEditView()
 {
   CreateSut();
   var model = new OrganizationEditModel();
   model.Name = "test";
   model.Id = 0;
   _mediator.Setup(x => x.Send(It.Is<OrganizationEditCommand>(y => y.Organization == model))).Returns(Id);
   var result = (ViewResult)_sut.Create();
   Assert.Equal("Edit", result.ViewName);
 }
        public async Task EditPostRedirectsToCorrectActionWithCorrectData_WhenModelStateIsValid_AndOrganizationNameIsUnique()
        {
            var model = new OrganizationEditModel();
            var mockMediator = new Mock<IMediator>();
            mockMediator.Setup(y => y.SendAsync(It.IsAny<OrganizationNameUniqueQueryAsync>())).ReturnsAsync(true);
            mockMediator.Setup(x => x.SendAsync(It.Is<EditOrganizationAsync>(y => y.Organization == model))).ReturnsAsync(Id);            

            var controller = new OrganizationController(mockMediator.Object, SuccessValidator());
            var result = (RedirectToActionResult) await controller.Edit(model);

      Assert.Equal("Details", result.ActionName);
      Assert.Equal("Admin", result.RouteValues["area"]);
      Assert.Equal(Id, result.RouteValues["id"]);
    }