public async Task Post_ReturnsBadRequestObject_WhenUrlServiceThrowsError()
        {
            //arange
            var urlService = new Mock <IUrlService>();

            urlService.Setup(x => x.GetFinalLink(It.IsAny <HttpRequest>(), It.IsAny <string>()))
            .ReturnsAsync(() => throw new Exception("Error"));

            var logger            = new Mock <ILogger <ShortenedUrlsController> >();
            var controllerContext = new ControllerContext()
            {
                HttpContext = new DefaultHttpContext()
            };
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object)
            {
                ControllerContext = controllerContext
            };
            var vm = new CreateShortUrlViewModel()
            {
                Url = constUrl
            };

            //act
            var action = await controller.Post(vm);

            //assert
            var result = Assert.IsType <BadRequestObjectResult>(action);
            var value  = Assert.IsAssignableFrom <string>(result.Value);

            Assert.Equal("Error", value);
        }
        public async Task Post_CreatesShortUrl()
        {
            //arange
            var finalLink  = $"https://url.sh/{ranCod}";
            var request    = new Mock <HttpRequest>();
            var urlService = new Mock <IUrlService>();

            urlService.Setup(x => x.GetFinalLink(It.IsAny <HttpRequest>(), It.IsAny <string>()))
            .ReturnsAsync(() => finalLink);

            var logger            = new Mock <ILogger <ShortenedUrlsController> >();
            var controllerContext = new ControllerContext()
            {
                HttpContext = new DefaultHttpContext()
            };
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object)
            {
                ControllerContext = controllerContext
            };
            var vm = new CreateShortUrlViewModel()
            {
                Url = constUrl
            };

            //act
            var action = await controller.Post(vm);

            //assert
            var result   = Assert.IsType <CreatedResult>(action);
            var location = Assert.IsAssignableFrom <string>(result.Location);
            var value    = Assert.IsAssignableFrom <string>(result.Value);

            Assert.Equal(finalLink, location);
            Assert.Equal(finalLink, value);
        }
        public async Task GetCode_ReturnsBadRequest_WhenCodeIsEmpty()
        {
            //arange
            var urlService = new Mock <IUrlService>();

            var logger     = new Mock <ILogger <ShortenedUrlsController> >();
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object);

            //act
            var action = await controller.Get("");

            //assert
            Assert.IsType <BadRequestResult>(action);
        }
        public void Get_ReturnsOk()
        {
            //arange
            var urlService = new Mock <IUrlService>();
            var logger     = new Mock <ILogger <ShortenedUrlsController> >();
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object);

            //act
            var action = controller.Get();

            //assert
            var result = Assert.IsType <OkObjectResult>(action);
            var value  = Assert.IsAssignableFrom <string>(result.Value);

            Assert.Equal("Ok", value);
        }
        public async Task GetCode_ReturnsNotFound_WhenNoUrlProvidedByUrlService()
        {
            //arange
            var urlService = new Mock <IUrlService>();

            urlService.Setup(x => x.GetUrlByCode(It.IsAny <string>()))
            .ReturnsAsync(() => "");

            var logger     = new Mock <ILogger <ShortenedUrlsController> >();
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object);

            //act
            var action = await controller.Get(ranCod);

            //assert
            Assert.IsType <NotFoundResult>(action);
        }
        public async Task GetCode_ReturnsUrlAsync()
        {
            //arange
            var urlService = new Mock <IUrlService>();

            urlService.Setup(x => x.GetUrlByCode(It.IsAny <string>()))
            .ReturnsAsync(() => constUrl);
            var logger     = new Mock <ILogger <ShortenedUrlsController> >();
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object);

            //act
            var action = await controller.Get(ranCod);

            //assert
            var result = Assert.IsType <OkObjectResult>(action);
            var value  = Assert.IsAssignableFrom <string>(result.Value);

            Assert.Equal(constUrl, value);
        }
        public async Task Post_ReturnsBadRequest_WhenModelStateIsNotValid()
        {
            //arange
            var urlService = new Mock <IUrlService>();

            var logger     = new Mock <ILogger <ShortenedUrlsController> >();
            var controller = new ShortenedUrlsController(logger.Object, urlService.Object);
            var vm         = new CreateShortUrlViewModel()
            {
                Url = ""
            };

            controller.ModelState.AddModelError("Url", "Url is required");

            //act
            var action = await controller.Post(vm);

            //assert
            Assert.IsType <BadRequestResult>(action);
        }