public async Task Return_CorrectHttpStatusCodeResult_WhenUserIsNotTheOwnerOfTheFoundReviewAndIsNotAdmin()
        {
            // Arrange
            var fileMock = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(new MemoryStream());
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var bindingModel = new ChangeImageBindingModel
            {
                Image = fileMock.Object
            };
            var beerReview = new Mock <IBeerReview>();

            var context = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(It.IsAny <int>()))
            .Returns(beerReview.Object);
            // Act
            var result = await sut.ChangeImage(bindingModel) as HttpStatusCodeResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual((int)HttpStatusCode.Unauthorized, result.StatusCode);
            StringAssert.Contains("edit other people", result.StatusDescription);
        }
        public async Task Call_ReviewServiceGetByIdMethodOnceWithCorrectparams_WhenUserIsTheOwnerOfTheFoundReview()
        {
            // Arrange
            var expectedId = 20;
            var fileMock   = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(new MemoryStream());
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var bindingModel = new ChangeImageBindingModel
            {
                Id    = expectedId,
                Image = fileMock.Object
            };
            var beerReview = new Mock <IBeerReview>();

            var context = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(expectedId))
            .Returns(beerReview.Object);
            // Act
            await sut.ChangeImage(bindingModel);

            // Assert
            reviewService.Verify(r => r.GetById(expectedId), Times.Once);
        }
        public async Task Return_CorrectHttpStatusCodeResult_WhenImageUploadFails()
        {
            // Arrange
            var fileMock = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(new MemoryStream());
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var bindingModel = new ChangeImageBindingModel
            {
                Image = fileMock.Object
            };
            var beerReview = this.MockingKernel.Get <IBeerReview>(ForCurrentUser);
            var context    = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(It.IsAny <int>()))
            .Returns(beerReview);

            // Act
            var result = await sut.ChangeImage(bindingModel) as HttpStatusCodeResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual((int)HttpStatusCode.InternalServerError, result.StatusCode);
            StringAssert.Contains("could not be uploaded", result.StatusDescription);
        }
        public async Task Call_ImageUploadUploadImageMethodOnceWithCorrectParams_WhenUserIsTheOwnerOfTheFoundReview()
        {
            // Arrange
            var expectedStream = new MemoryStream();
            var fileMock       = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(expectedStream);
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var bindingModel = new ChangeImageBindingModel
            {
                Image = fileMock.Object
            };
            var beerReview = this.MockingKernel.Get <IBeerReview>(ForCurrentUser);
            var context    = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(It.IsAny <int>()))
            .Returns(beerReview);
            var imgUploadServie = this.MockingKernel.GetMock <IImageUploadService>();

            // Act
            await sut.ChangeImage(bindingModel);

            // Assert
            imgUploadServie.Verify(s => s.UploadImageAsync(expectedStream, Constants.DefaultImageSizePx, Constants.DefaultImageSizePx), Times.Once);
        }
        public async Task <ActionResult> ChangeImage(ChangeImageBindingModel model)
        {
            var img = model.Image;
            var id  = model.Id;

            var review = this.reviewService.GetById(id);
            var userId = this.User?.Identity.GetUserId();

            if (userId != review.ApplicationUserId && !this.User.IsInRole(Constants.AdminRole))
            {
                return(this.Unauthorized());
            }

            var url = await this.imageUpload.UploadImageAsync(img.InputStream, Constants.DefaultImageSizePx, Constants.DefaultImageSizePx);

            if (url == null)
            {
                return(this.ImageUploadFailure());
            }

            review.ImgUrl = url;
            var result = this.reviewService.UpdateReview(review);

            if (result.Successful)
            {
                return(this.Json(new UrlOnlyDto {
                    url = url
                }));
            }

            return(this.ImageUploadFailure());
        }
        public void Setters_ShouldSetPropertiesCorrectly()
        {
            // Arrange
            var expectedId    = this.Fixture.Create <int>();
            var expectedImage = new Mock <HttpPostedFileBase>();
            var sut           = new ChangeImageBindingModel();

            // Act
            sut.Id    = expectedId;
            sut.Image = expectedImage.Object;
            // Assert
            Assert.AreEqual(expectedId, sut.Id);
            Assert.AreSame(expectedImage.Object, sut.Image);
        }
        public async Task ReturnCorrectResult_WhenUpdateSucceeds()
        {
            // Arrange
            var expectedUrl = "I'm not an empty string";
            var fileMock    = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(new MemoryStream());
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var updateResult = new Mock <IDataModifiedResult>();

            updateResult.Setup(r => r.Successful)
            .Returns(true);
            var bindingModel = new ChangeImageBindingModel
            {
                Image = fileMock.Object
            };
            var beerReview = this.MockingKernel.Get <IBeerReview>(ForCurrentUser);
            var context    = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(It.IsAny <int>()))
            .Returns(beerReview);
            reviewService.Setup(r => r.UpdateReview(beerReview))
            .Returns(updateResult.Object);
            var imgUpload = this.MockingKernel.GetMock <IImageUploadService>();

            imgUpload.Setup(i => i.UploadImageAsync(It.IsAny <Stream>(), It.IsAny <int>(), It.IsAny <int>()))
            .Returns(Task.FromResult(expectedUrl));
            // Act
            var result = await sut.ChangeImage(bindingModel) as JsonResult;

            // Assert
            Assert.IsNotNull(result);
            var viewModel = result.Data as UrlOnlyDto;

            Assert.IsNotNull(viewModel);
            Assert.AreSame(expectedUrl, viewModel.url);
        }
        public async Task ReturnCorrectResult_WhenUpdateFails()
        {
            // Arrange
            var expectedUrl = "I'm not an empty string";
            var fileMock    = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(new MemoryStream());
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var updateResult = new Mock <IDataModifiedResult>();
            var bindingModel = new ChangeImageBindingModel
            {
                Image = fileMock.Object
            };
            var beerReview = this.MockingKernel.Get <IBeerReview>(ForCurrentUser);
            var context    = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(It.IsAny <int>()))
            .Returns(beerReview);
            reviewService.Setup(r => r.UpdateReview(beerReview))
            .Returns(updateResult.Object);
            var imgUpload = this.MockingKernel.GetMock <IImageUploadService>();

            imgUpload.Setup(i => i.UploadImageAsync(It.IsAny <Stream>(), It.IsAny <int>(), It.IsAny <int>()))
            .Returns(Task.FromResult(expectedUrl));
            // Act
            var result = await sut.ChangeImage(bindingModel) as HttpStatusCodeResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual((int)HttpStatusCode.InternalServerError, result.StatusCode);
            StringAssert.Contains("could not be uploaded", result.StatusDescription);
        }
        public async Task SetReviewImgUrlPropertyToUploadImageReturnValueAndCallUpdateReview_WhenUploadIsSuccessful()
        {
            // Arrange
            var expectedUrl = "I'm not an empty string";
            var fileMock    = new Mock <HttpPostedFileBase>();

            fileMock.Setup(m => m.InputStream)
            .Returns(new MemoryStream());
            var sut          = this.MockingKernel.Get <ReviewsController>();
            var updateResult = new Mock <IDataModifiedResult>();
            var bindingModel = new ChangeImageBindingModel
            {
                Image = fileMock.Object
            };
            var beerReview = this.MockingKernel.Get <IBeerReview>(ForCurrentUser);
            var context    = this.MockingKernel.Get <HttpContextBase>();

            sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
            var reviewService = this.MockingKernel.GetMock <IBeerReviewService>();

            reviewService.Setup(r => r.GetById(It.IsAny <int>()))
            .Returns(beerReview);
            reviewService.Setup(r => r.UpdateReview(beerReview))
            .Returns(updateResult.Object);
            var mockedReview = this.MockingKernel.GetMock <IBeerReview>();
            var imgUpload    = this.MockingKernel.GetMock <IImageUploadService>();

            imgUpload.Setup(i => i.UploadImageAsync(It.IsAny <Stream>(), It.IsAny <int>(), It.IsAny <int>()))
            .Returns(Task.FromResult(expectedUrl));
            // Act
            await sut.ChangeImage(bindingModel);

            // Assert
            mockedReview.VerifySet(r => r.ImgUrl = expectedUrl, Times.Once);
            reviewService.Verify(r => r.UpdateReview(beerReview), Times.Once);
        }