public IActionResult GetShortestDistanceBetweenTownsById([FromBody] GetShortestDistanceBetweenTownsByIdResponse response)
        {
            if (response == null)
            {
                return(BadRequest("Route has missing/invalid values"));
            }

            if (string.IsNullOrWhiteSpace(response.startTownId) ||
                string.IsNullOrWhiteSpace(response.destinationTownId) ||
                response.routes == null)
            {
                return(BadRequest("Invalid or missing arguments"));
            }

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

            return(Ok(response));
        }
        public void GetShortestDistanceBetweenTownsById_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.GetShortestDistanceBetweenTownsById(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <TownMap>())).Throws(new ArgumentException("No such route"));

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

            var payload = new GetShortestDistanceBetweenTownsByIdResponse
            {
                routes            = _testRoutes,
                startTownId       = "A",
                destinationTownId = "A"
            };

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

            Assert.IsInstanceOf <NotFoundObjectResult>(result);
            Assert.AreEqual("No such route", result.Value);
        }
        public void GetShortestDistanceBetweenTownsById_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.GetShortestDistanceBetweenTownsById(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <TownMap>())).Returns(5);

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

            var payload = new GetShortestDistanceBetweenTownsByIdResponse
            {
                routes            = _testRoutes,
                startTownId       = "A",
                destinationTownId = "A"
            };

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

            Assert.IsInstanceOf <OkObjectResult>(result);
            Assert.IsInstanceOf <GetShortestDistanceBetweenTownsByIdResponse>(result.Value);
            Assert.AreEqual(5, (result.Value as GetShortestDistanceBetweenTownsByIdResponse).distance);
        }