public async Task<ActionResult> New(NewJobOpportunityViewModel model, bool captchaValid)
        {
            if (!ModelState.IsValid)
            {
                return View(model)
                    .WithError("Han ocurrido errores de validación que no permiten continuar el proceso");
            }

            if (string.IsNullOrWhiteSpace(model.LocationPlaceId))
            {
                ModelState.AddModelError("LocationName", "");
                return View(model).WithError("Debe seleccionar una Localidad.");
            }

            var jobOpportunity = model.ToEntity();

            _jobOpportunityService.CreateNewJobOpportunity(jobOpportunity);

            await _twitterService.PostNewJobOpportunity(jobOpportunity);

            return RedirectToAction("Detail", new
            {
                id = UrlHelperExtensions.SeoUrl(jobOpportunity.Id, jobOpportunity.Title)
            });
        }
        public ActionResult New()
        {
            var viewModel = new NewJobOpportunityViewModel();

            return View(viewModel)
                .WithInfo("Prueba nuestro nuevo proceso guiado de creación de posiciones haciendo <b><a href='"+Url.Action("Wizard")+"'>click aquí</a></b>");
        }
        // GET: /JobOpportunity/New
        public ActionResult New()
        {
            var viewModel = new NewJobOpportunityViewModel();

            LoadLocations(viewModel);

            return View(viewModel);
        }
        public ActionResult New(NewJobOpportunityViewModel model)
        {
            if (!ModelState.IsValid)
            {
                LoadLocations(model);
                ViewBag.ErrorMessage = "Han ocurrido errores de validación que no permiten continuar el proceso";
                return View(model);
            }

            _jobOpportunityService.CreateNewJobOpportunity(model.ToEntity());

            return RedirectToAction("Index");
        }
        public async Task<ActionResult> New(NewJobOpportunityViewModel model, bool captchaValid)
        {

            if (!ModelState.IsValid)
            {
                LoadLocations(model);
                ViewBag.ErrorMessage = "Han ocurrido errores de validación que no permiten continuar el proceso";
                return View(model);
            }

            var jobOpportunity = model.ToEntity();

            _jobOpportunityService.CreateNewJobOpportunity(jobOpportunity);

            await _twitterService.PostNewJobOpportunity(jobOpportunity);

            return RedirectToAction("detail", new { id = UrlHelperExtensions.SeoUrl(jobOpportunity.Id, jobOpportunity.Title) });
        }
        public ActionResult New(NewJobOpportunityViewModel job)
        {
            if (!ModelState.IsValid)
            {
                @ViewBag.ErrorMessage = "Han ocurrido errores de validación que no permiten continuar el proceso";
                return View(job);
            }

            _databaseContext.JobOpportunities.Add(job.ToEntity());

            _databaseContext.SaveChanges();

            return RedirectToAction("Index");
        }
        public async Task<ActionResult> New(NewJobOpportunityViewModel model, bool captchaValid)
        {
            if (!ModelState.IsValid)
            {
                return View(model)
                    .WithError("Han ocurrido errores de validación que no permiten continuar el proceso");
            }

            if (string.IsNullOrWhiteSpace(model.LocationPlaceId))
            {
                ModelState.AddModelError(nameof(model.LocationName), "");
                return View(model).WithError("Debe seleccionar una Localidad.");
            }

            if (!string.IsNullOrWhiteSpace(model.CompanyLogoUrl) && !UrlHelperExtensions.IsImageAvailable(model.CompanyLogoUrl))
            {
                return View(model).WithError("La url del logo debe ser a una imagen en formato png o jpg");
            }

            var jobOpportunity = model.ToEntity();
            var userId = User.Identity.GetUserId();

            _jobOpportunityService.CreateNewJobOpportunity(jobOpportunity, userId);

            await _twitterService.PostNewJobOpportunity(jobOpportunity, Url).ConfigureAwait(false);

            return RedirectToAction(nameof(Detail), new
            {
                id = UrlHelperExtensions.SeoUrl(jobOpportunity.Id, jobOpportunity.Title)
            });
        }
        private void LoadLocations(NewJobOpportunityViewModel viewModel)
        {
            var locations = _locationService.GetAllLocations();

            viewModel.Locations = locations.ToSelectList(x => x.Id, x => x.Name);
        }
 private static void VerifyGeneratedJobOpportunityEntity(
     NewJobOpportunityViewModel model,
     JobOpportunity entity)
 {
     entity.Title.Should().Be(model.Title);
     entity.Category.Should().Be(model.Category);
     entity.Description.Should().Be(model.Description);
     entity.CompanyName.Should().Be(model.CompanyName);
     entity.CompanyUrl.Should().Be(model.CompanyUrl);
     entity.CompanyLogoUrl.Should().Be(model.CompanyLogoUrl);
     entity.CompanyEmail.Should().Be(model.CompanyEmail);
     entity.PublishedDate.Should().BeCloseTo(DateTime.Now);
     entity.IsRemote.Should().Be(model.IsRemote);
     entity.JobType.Should().Be(model.JobType);
     entity.JobOpportunityLocation.Should().Match<JobOpportunityLocation>(x =>
         x.Latitude == model.LocationLatitude
         && x.Longitude == model.LocationLongitude
         && x.Name == model.LocationName
         && x.PlaceId == model.LocationPlaceId
         );
 }
        public async Task New_POST_ValidModel_CreatesJob_PostsTweet_RedirectsToDetail()
        {
            // Arrange
            var model = new NewJobOpportunityViewModel {
                Title = "myTitle",
                Category = JobCategory.MobileDevelopment,
                Description = "My description",
                CompanyName = "Company",
                CompanyUrl = "http://example.com",
                CompanyLogoUrl = "http://example.com/logo.png",
                CompanyEmail = "*****@*****.**",
                IsRemote = true,
                LocationName = "My location",
                LocationPlaceId = "123",
                LocationLatitude = "18.3939393",
                LocationLongitude = "-69.22222",
                JobType = JobType.FullTime
            };

            _jobOpportunityService.WhenForAnyArgs(x => x.CreateNewJobOpportunity(null))
                .Do(x => { x.Arg<JobOpportunity>().Id = 1; });

            // Act
            var result = (RedirectToRouteResult)await _sut.New(model, false);

            // Assert
            _jobOpportunityService.Received(1).CreateNewJobOpportunity(
                Arg.Do<JobOpportunity>(entity => VerifyGeneratedJobOpportunityEntity(model, entity)));
            await _twitterService.Received(1).PostNewJobOpportunity(
                Arg.Do<JobOpportunity>(entity => VerifyGeneratedJobOpportunityEntity(model, entity)));

            result.RouteValues["action"].Should().Be(nameof(_sut.Detail));
            result.RouteValues["id"].Should().Be(UrlHelperExtensions.SeoUrl(1, "myTitle"));
        }
        public async Task New_POST_LocationPlaceIdNullOrWhitespace_ReturnsViewWithError(
            [Values(null, "", " ")] string placeId
            )
        {
            // Arrange
            var model = new NewJobOpportunityViewModel { LocationPlaceId = placeId };

            // Act
            var result = (AlertDecoratorResult)await _sut.New(model, false);

            // Assert
            _jobOpportunityService.DidNotReceiveWithAnyArgs().CreateNewJobOpportunity(null);
            await _twitterService.DidNotReceiveWithAnyArgs().PostNewJobOpportunity(null);

            _sut.ModelState.IsValid.Should().BeFalse();
            _sut.ModelState.Should().ContainKey(nameof(model.LocationName));

            result.AlertClass.Should().Be("alert-danger");
            result.Message.Should().Be("Debe seleccionar una Localidad.");

            var innerResult = (ViewResult)result.InnerResult;
            innerResult.ViewName.Should().BeEmpty();
            innerResult.Model.Should().BeSameAs(model);
        }
        public async Task New_POST_ModelStateInvalid_ReturnsViewWithError()
        {
            // Arrange
            var model = new NewJobOpportunityViewModel();
            _sut.ModelState.AddModelError("", "");

            // Act
            var result = (AlertDecoratorResult)await _sut.New(model, false);

            // Assert
            _jobOpportunityService.DidNotReceiveWithAnyArgs().CreateNewJobOpportunity(null);
            await _twitterService.DidNotReceiveWithAnyArgs().PostNewJobOpportunity(null);

            _sut.ModelState.IsValid.Should().BeFalse();

            result.AlertClass.Should().Be("alert-danger");
            result.Message.Should().Be("Han ocurrido errores de validación que no permiten continuar el proceso");

            var innerResult = (ViewResult)result.InnerResult;
            innerResult.ViewName.Should().BeEmpty();
            innerResult.Model.Should().BeSameAs(model);
        }
        public void New_GET_ReturnsView_WithEmptyModel()
        {
            // Arrange
            var model = new NewJobOpportunityViewModel();
            _sut.Url = Substitute.For<UrlHelper>();
            _sut.Url.Action("Wizard").Returns("/jobs/wizard");

            // Act
            var result = (AlertDecoratorResult)_sut.New();

            // Assert
            result.AlertClass.Should().Be("alert-info");
            result.Message.Should().Be(
                "Prueba nuestro nuevo proceso guiado de creación de posiciones haciendo "
                + "<b><a href='/jobs/wizard'>click aquí</a></b>");

            var viewResult = (ViewResult)result.InnerResult;
            viewResult.ViewName.Should().BeEmpty();
            ((NewJobOpportunityViewModel)viewResult.Model).ShouldBeEquivalentTo(model);
        }