public async Task book_appointment_raises_an_exception_when_drs_service_responds_with_error_when_opening_session()
        {
            var scheduleBookingResponse = new scheduleBookingResponse(new xmbScheduleBookingResponse {
                status = responseStatus.success
            });
            var mockLogger = new Mock <ILoggerAdapter <AppointmentActions> >();
            var mockAppointmentsService = new Mock <IHackneyAppointmentsService>();
            var openSessionResponse     = new openSessionResponse(
                new xmbOpenSessionResponse
            {
                status    = responseStatus.error,
                sessionId = ""
            }
                );
            var closeSessionResponse = new closeSessionResponse(
                new xmbCloseSessionResponse
            {
                status = responseStatus.success
            }
                );
            var drsOrder = new DrsOrder {
                wo_ref = "01550854"
            };

            mockAppointmentsService.Setup(service => service.OpenSessionAsync(It.IsAny <xmbOpenSession>()))
            .ReturnsAsync(openSessionResponse);
            mockAppointmentsService.Setup(service => service.CloseSessionAsync(It.IsAny <xmbCloseSession>()))
            .ReturnsAsync(closeSessionResponse);
            mockAppointmentsService.Setup(service => service.ScheduleBookingAsync(It.IsAny <xmbScheduleBooking>()))
            .ReturnsAsync(scheduleBookingResponse);
            var mockRepairsService = new Mock <IHackneyRepairsService>();

            mockRepairsService.Setup(service => service.GetWorkOrderDetails("01550854")).ReturnsAsync(drsOrder);
            var fakeRequestBuilder = new Mock <IHackneyAppointmentsServiceRequestBuilder>();

            fakeRequestBuilder.Setup(service => service.BuildXmbOpenSessionRequest()).Returns(new xmbOpenSession());
            fakeRequestBuilder.Setup(service => service.BuildXmbCloseSessionRequest("123456"))
            .Returns(new xmbCloseSession());
            fakeRequestBuilder.Setup(service => service.BuildXmbScheduleBookingRequest("01550854", "123456",
                                                                                       new DateTime(2017, 11, 21, 10, 00, 00), new DateTime(2017, 11, 21, 12, 00, 00), drsOrder))
            .Returns(new xmbScheduleBooking());
            var fakeRepairRequestBuilder          = new Mock <IHackneyRepairsServiceRequestBuilder>();
            AppointmentActions appointmentActions = new AppointmentActions(mockLogger.Object, mockAppointmentsService.Object, fakeRequestBuilder.Object, mockRepairsService.Object, fakeRepairRequestBuilder.Object);
            await Assert.ThrowsAsync <AppointmentServiceException>(async() => await appointmentActions.BookAppointment("01550854", new DateTime(2017, 11, 21, 10, 00, 00), new DateTime(2017, 11, 21, 12, 00, 00)));
        }
        public async Task <JsonResult> Post(string workOrderReference, [FromBody] ScheduleAppointmentRequest request)
        {
            try
            {
                var validationResult = _scheduleBookingRequestValidator.Validate(workOrderReference, request);
                if (validationResult.Valid)
                {
                    var appointmentsActions = new AppointmentActions(_loggerAdapter, _appointmentsService,
                                                                     _serviceRequestBuilder, _repairsService, _repairsServiceRequestBuilder);
                    var result = await appointmentsActions.BookAppointment(workOrderReference,
                                                                           DateTime.Parse(request.BeginDate),
                                                                           DateTime.Parse(request.EndDate));

                    var json = Json(result);
                    json.StatusCode  = 200;
                    json.ContentType = "application/json";
                    return(json);
                }
                else
                {
                    var errors = validationResult.ErrorMessages.Select(error => new ApiErrorMessage
                    {
                        developerMessage = error,
                        userMessage      = error
                    }).ToList();
                    var jsonResponse = Json(errors);
                    jsonResponse.StatusCode = 400;
                    return(jsonResponse);
                }
            }
            catch (Exception e)
            {
                var errorMessage = new ApiErrorMessage
                {
                    developerMessage = e.Message,
                    userMessage      = "We had some problems processing your request"
                };
                var jsonResponse = Json(errorMessage);
                jsonResponse.StatusCode = 500;
                return(jsonResponse);
            }
        }
        public async Task book_appointment_returns_success_result()
        {
            var scheduleBookingResponse = new scheduleBookingResponse(new xmbScheduleBookingResponse {
                status = responseStatus.success
            });
            var mockLogger = new Mock <ILoggerAdapter <AppointmentActions> >();
            var mockAppointmentsService = new Mock <IHackneyAppointmentsService>();
            var openSessionResponse     = new openSessionResponse(
                new xmbOpenSessionResponse
            {
                status    = responseStatus.success,
                sessionId = "123456"
            }
                );
            var closeSessionResponse = new closeSessionResponse(
                new xmbCloseSessionResponse
            {
                status = responseStatus.success
            }
                );
            var drsOrder = new DrsOrder {
                wo_ref = "01550854"
            };
            var xmbScheduleBooking = new xmbScheduleBooking
            {
                theBooking = new booking()
            };

            mockAppointmentsService.Setup(service => service.OpenSessionAsync(It.IsAny <xmbOpenSession>()))
            .ReturnsAsync(openSessionResponse);
            mockAppointmentsService.Setup(service => service.CloseSessionAsync(It.IsAny <xmbCloseSession>()))
            .ReturnsAsync(closeSessionResponse);
            mockAppointmentsService.Setup(service => service.ScheduleBookingAsync(xmbScheduleBooking))
            .ReturnsAsync(scheduleBookingResponse);
            mockAppointmentsService.Setup(service => service.SelectOrderAsync(It.IsAny <xmbSelectOrder>()))
            .ReturnsAsync(new selectOrderResponse(new xmbSelectOrderResponse
            {
                status    = responseStatus.success,
                theOrders = new List <order>
                {
                    new order
                    {
                        contract    = "H01",
                        theBookings = new List <booking>
                        {
                            new booking
                            {
                                bookingId = 123456
                            }
                        }.ToArray(),
                        theLocation = new location
                        {
                            locationId = "012345",
                            contract   = "H01",
                            name       = "An address",
                            address1   = "An address",
                            postCode   = "Apostcode"
                        }
                    }
                }.ToArray()
            }));
            var mockWorksOrderResponse = new RepairsService.WebResponse
            {
                Success = true
            };
            var mockRepairsService = new Mock <IHackneyRepairsService>();

            mockRepairsService.Setup(service => service.GetWorkOrderDetails("01550854")).ReturnsAsync(drsOrder);
            mockRepairsService.Setup(service => service.IssueOrderAsync(It.IsAny <RepairsService.WorksOrderRequest>()))
            .ReturnsAsync(mockWorksOrderResponse);
            var fakeRequestBuilder = new Mock <IHackneyAppointmentsServiceRequestBuilder>();

            fakeRequestBuilder.Setup(service => service.BuildXmbOpenSessionRequest()).Returns(new xmbOpenSession());
            fakeRequestBuilder.Setup(service => service.BuildXmbCloseSessionRequest("123456"))
            .Returns(new xmbCloseSession());
            fakeRequestBuilder.Setup(service => service.BuildXmbScheduleBookingRequest("01550854", "123456",
                                                                                       new DateTime(2017, 11, 21, 10, 00, 00), new DateTime(2017, 11, 21, 12, 00, 00), drsOrder))
            .Returns(xmbScheduleBooking);
            var fakeRepairRequestBuilder          = new Mock <IHackneyRepairsServiceRequestBuilder>();
            AppointmentActions appointmentActions = new AppointmentActions(mockLogger.Object, mockAppointmentsService.Object, fakeRequestBuilder.Object, mockRepairsService.Object, fakeRepairRequestBuilder.Object);
            var result = await appointmentActions.BookAppointment("01550854", new DateTime(2017, 11, 21, 10, 00, 00), new DateTime(2017, 11, 21, 12, 00, 00));

            Assert.Contains("{ beginDate = 2017-11-21T10:00:00Z, endDate = 2017-11-21T12:00:00Z }", result.ToString());
        }