public async Task <IActionResult> CreateCourseDemand(CreateCourseDemandRequest request)
        {
            try
            {
                var commandResult = await _mediator.Send(new RegisterDemandCommand
                {
                    Id = request.Id,
                    OrganisationName    = request.OrganisationName,
                    ContactEmailAddress = request.ContactEmailAddress,
                    NumberOfApprentices = request.NumberOfApprentices,
                    Lat          = request.LocationItem.Location.GeoPoint.First(),
                    Lon          = request.LocationItem.Location.GeoPoint.Last(),
                    LocationName = request.LocationItem.Name,
                    CourseId     = request.TrainingCourse.Id,
                    CourseTitle  = request.TrainingCourse.Title,
                    CourseLevel  = request.TrainingCourse.Level,
                    CourseSector = request.TrainingCourse.Sector
                });

                return(Created("", commandResult));
            }
            catch (HttpRequestContentException e)
            {
                return(StatusCode((int)e.StatusCode, e.ErrorContent));
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Error creating course demand item");
                return(new StatusCodeResult((int)HttpStatusCode.InternalServerError));
            }
        }
        public async Task Then_The_Command_Is_Processed_By_Mediator_And_Id_Returned(
            Guid returnId,
            CreateCourseDemandRequest request,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] DemandController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.Is <RegisterDemandCommand>(command =>
                                                     command.Id == request.Id &&
                                                     command.OrganisationName.Equals(request.OrganisationName) &&
                                                     command.ContactEmailAddress.Equals(request.ContactEmailAddress) &&
                                                     command.NumberOfApprentices.Equals(request.NumberOfApprentices) &&
                                                     command.Lat.Equals(request.LocationItem.Location.GeoPoint.First()) &&
                                                     command.Lon.Equals(request.LocationItem.Location.GeoPoint.Last()) &&
                                                     command.LocationName.Equals(request.LocationItem.Name) &&
                                                     command.CourseId.Equals(request.TrainingCourse.Id) &&
                                                     command.CourseTitle.Equals(request.TrainingCourse.Title) &&
                                                     command.CourseLevel.Equals(request.TrainingCourse.Level) &&
                                                     command.CourseRoute.Equals(request.TrainingCourse.Route) &&
                                                     command.ConfirmationLink.Equals(request.ResponseUrl) &&
                                                     command.StopSharingUrl.Equals(request.StopSharingUrl) &&
                                                     command.StartSharingUrl.Equals(request.StartSharingUrl) &&
                                                     command.ExpiredCourseDemandId.Equals(request.ExpiredCourseDemandId) &&
                                                     command.EntryPoint.Equals(request.EntryPoint)
                                                     ),
                       It.IsAny <CancellationToken>())).ReturnsAsync((returnId));

            var controllerResult = await controller.CreateCourseDemand(request) as CreatedResult;

            controllerResult !.StatusCode.Should().Be((int)HttpStatusCode.Created);
            controllerResult.Value.Should().Be(returnId);
        }
        public async Task Then_If_There_Is_An_Error_A_Bad_Request_Is_Returned(
            CreateCourseDemandRequest request,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] DemandController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.IsAny <RegisterDemandCommand>(),
                       It.IsAny <CancellationToken>())).ThrowsAsync(new Exception());

            var controllerResult = await controller.CreateCourseDemand(request) as StatusCodeResult;

            controllerResult !.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError);
        }
        public async Task Then_If_Null_Is_Returned_Then_Conflict_returned(
            Guid returnId,
            CreateCourseDemandRequest request,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] DemandController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.Is <RegisterDemandCommand>(command =>
                                                     command.Id == request.Id),
                       It.IsAny <CancellationToken>())).ReturnsAsync((Guid?)null);

            var controllerResult = await controller.CreateCourseDemand(request) as StatusCodeResult;

            controllerResult !.StatusCode.Should().Be((int)HttpStatusCode.Conflict);
        }
        public async Task Then_If_There_Is_A_HttpException_It_Is_Returned(
            string errorContent,
            CreateCourseDemandRequest request,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] DemandController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.IsAny <RegisterDemandCommand>(),
                       It.IsAny <CancellationToken>()))
            .ThrowsAsync(new HttpRequestContentException("Error", HttpStatusCode.BadRequest, errorContent));

            var controllerResult = await controller.CreateCourseDemand(request) as ObjectResult;

            controllerResult !.StatusCode.Should().Be((int)HttpStatusCode.BadRequest);
            controllerResult.Value.Should().Be(errorContent);
        }
        public async Task <IActionResult> CreateCourseDemand(CreateCourseDemandRequest request)
        {
            try
            {
                var commandResult = await _mediator.Send(new RegisterDemandCommand
                {
                    Id = request.Id,
                    OrganisationName    = request.OrganisationName,
                    ContactEmailAddress = request.ContactEmailAddress,
                    NumberOfApprentices = request.NumberOfApprentices,
                    Lat                   = request.LocationItem.Location.GeoPoint.First(),
                    Lon                   = request.LocationItem.Location.GeoPoint.Last(),
                    LocationName          = request.LocationItem.Name,
                    CourseId              = request.TrainingCourse.Id,
                    CourseTitle           = request.TrainingCourse.Title,
                    CourseLevel           = request.TrainingCourse.Level,
                    CourseRoute           = request.TrainingCourse.Route,
                    ConfirmationLink      = request.ResponseUrl,
                    StopSharingUrl        = request.StopSharingUrl,
                    StartSharingUrl       = request.StartSharingUrl,
                    ExpiredCourseDemandId = request.ExpiredCourseDemandId,
                    EntryPoint            = request.EntryPoint
                });

                if (!commandResult.HasValue)
                {
                    return(Conflict());
                }

                return(Created("", commandResult));
            }
            catch (HttpRequestContentException e)
            {
                return(StatusCode((int)e.StatusCode, e.ErrorContent));
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Error creating course demand item");
                return(new StatusCodeResult((int)HttpStatusCode.InternalServerError));
            }
        }