public void GetNumberOfRoutesBetweenTownsByDistance_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.GetNumberOfRoutesBetweenTownsByDistance(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <TownMap>(), It.IsAny <double>(), It.IsAny <LimitType>())).Returns(5);

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

            var payload = new GetNumberOfRoutesBetweenTownsByDistanceResponse
            {
                routes            = _testRoutes,
                startTownId       = "A",
                destinationTownId = "A",
                distance          = 30,
                limitType         = LimitType.MaxOrEqual
            };

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

            Assert.IsInstanceOf <OkObjectResult>(result);
            Assert.IsInstanceOf <GetNumberOfRoutesBetweenTownsByDistanceResponse>(result.Value);
            Assert.AreEqual(5, (result.Value as GetNumberOfRoutesBetweenTownsByDistanceResponse).numberOfStops);
        }
        public void GetNumberOfRoutesBetweenTownsByDistance_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.GetNumberOfRoutesBetweenTownsByDistance(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <TownMap>(), It.IsAny <double>(), It.IsAny <LimitType>())).Throws(new ArgumentException("No such route"));

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

            var payload = new GetNumberOfRoutesBetweenTownsByDistanceResponse
            {
                routes            = _testRoutes,
                startTownId       = "A",
                destinationTownId = "A",
                distance          = 30,
                limitType         = LimitType.MaxOrEqual
            };

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

            Assert.IsInstanceOf <NotFoundObjectResult>(result);
            Assert.AreEqual("No such route", result.Value);
        }
        public IActionResult GetNumberOfRoutesBetweenTownsByDistance([FromBody] GetNumberOfRoutesBetweenTownsByDistanceResponse response)
        {
            if (response == null)
            {
                return(BadRequest("Route has missing/invalid values"));
            }

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

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

            return(Ok(response));
        }