public void GetRouteDistance_NoRoute()
        {
            var townServiceMock = new Mock <ITownService>();

            townServiceMock.Setup(x => x.GenerateTownMapByRoutes(It.IsAny <List <Route> >())).Returns(_testTowns);
            var routeServiceMock = new Mock <IRouteService>();

            routeServiceMock.Setup(x => x.GetRouteDistance(It.IsAny <string>(), It.IsAny <TownMap>())).Throws(new ArgumentException("No such route"));

            TrainsController trainsController = new TrainsController(townServiceMock.Object, routeServiceMock.Object);

            var payload = new GetRouteDistanceResponse
            {
                routes = _testRoutes,
                route  = "A-A-A"
            };

            var result = trainsController.GetRouteDistance(payload) as NotFoundObjectResult;

            Assert.IsInstanceOf <NotFoundObjectResult>(result);
            Assert.AreEqual("No such route", result.Value);
        }
        public void GetRouteDistance_Success()
        {
            var townServiceMock = new Mock <ITownService>();

            townServiceMock.Setup(x => x.GenerateTownMapByRoutes(It.IsAny <List <Route> >())).Returns(_testTowns);
            var routeServiceMock = new Mock <IRouteService>();

            routeServiceMock.Setup(x => x.GetRouteDistance(It.IsAny <string>(), It.IsAny <TownMap>())).Returns(5);

            TrainsController trainsController = new TrainsController(townServiceMock.Object, routeServiceMock.Object);

            var payload = new GetRouteDistanceResponse
            {
                routes = _testRoutes,
                route  = "A-A-A"
            };

            var result = trainsController.GetRouteDistance(payload) as OkObjectResult;

            Assert.IsInstanceOf <OkObjectResult>(result);
            Assert.IsInstanceOf <GetRouteDistanceResponse>(result.Value);
            Assert.AreEqual(5, (result.Value as GetRouteDistanceResponse).distance);
        }
        public IActionResult GetRouteDistance([FromBody] GetRouteDistanceResponse response)
        {
            if (response == null)
            {
                return(BadRequest("Route has missing/invalid values"));
            }

            if (string.IsNullOrWhiteSpace(response.route) || response.routes == null)
            {
                return(BadRequest("Route has missing/invalid values"));
            }

            try
            {
                var townMap = _townService.GenerateTownMapByRoutes(response.routes);
                response.distance = _routeService.GetRouteDistance(response.route, townMap);
            }
            catch (Exception ex)
            {
                return(NotFound(ex.Message));
            }

            return(Ok(response));
        }