Пример #1
0
        public void ImageVisibility()
        {
            // arrange
            var vm = new ImageFieldViewModel();
            Mock.NonPublic.Arrange<bool>(vm, "IsImageExists", new object[] { ArgExpr.IsAny<object>() }).Returns(true);

            // act
            var imageVisibility = vm.ImageVisibility;

            // assert
            Assert.IsTrue(imageVisibility);
        }
Пример #2
0
        protected override DriverResult Editor(ContentPart part, Fields.ImageField field, dynamic shapeHelper)
        {
            var settings = field.PartFieldDefinition.Settings.GetModel <ImageFieldSettings>();

            AssignDefaultMediaFolder(settings);

            var viewModel = new ImageFieldViewModel {
                Settings      = settings,
                Field         = field,
                AlternateText = field.AlternateText
            };

            return(ContentShape("Fields_Contrib_Image_Edit", GetDifferentiator(field, part),
                                () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: viewModel, Prefix: GetPrefix(field, part))));
        }
Пример #3
0
        public void MaxFileSize()
        {
            // arrange
            var vm = new ImageFieldViewModel();

            // act
            var privateAccessor = new PrivateAccessor(vm);
            var maxFileSize = privateAccessor.GetProperty("MaxFileSize");

            // assert
            Assert.AreEqual((ulong)0, maxFileSize);

            // arrange
            var systemOptions = Mock.Create<ISystemOptionsInfo>(Behavior.Loose);
            systemOptions.MaxFileSize = 10 * 10 * 1024;

            Mock.Arrange(() => SystemOptionsInfo.SystemOptions).Returns(systemOptions);

            // act
            maxFileSize = privateAccessor.GetProperty("MaxFileSize");

            // assert
            Assert.AreEqual((ulong)10 * 10 * 1024, maxFileSize);
        }
Пример #4
0
        public void Init()
        {
            // arrange
            var vm = new ImageFieldViewModel();
            var editableRoot = Mock.Create<IEditableRoot>(Behavior.Loose);

            Mock.Arrange(() => vm.Property).Returns(GetType().GetProperty("Image1"));

            // act
            vm.Init(editableRoot, null, null);

            // assert
            Assert.AreEqual(320, vm.ImageSize.Width);
            Assert.AreEqual(240, vm.ImageSize.Height);

            // arrange
            Mock.Arrange(() => vm.Property).Returns(GetType().GetProperty("Image2"));

            // act
            vm.Init(editableRoot, null, null);

            // assert
            Assert.AreEqual(400, vm.ImageSize.Width);
            Assert.AreEqual(400, vm.ImageSize.Height);
        }
Пример #5
0
        public void OnImageFailed()
        {
            // arrange
            var vm = new ImageFieldViewModel();
            var exception = Mock.Create<ExceptionRoutedEventArgs>(Behavior.CallOriginal);

            var popupFactory = new PopupFactory();
            var notifyFailureCalled = false;
            Mock.Arrange(() => popupFactory.NotifyFailure(Arg.IsAny<Exception>(), "Popup_Error", false)).DoInstead(() => notifyFailureCalled = true);

            vm.ThePopupFactory = popupFactory;

            // act
            new PrivateAccessor(vm).CallMethod("OnImageFailed", new object[] { null, exception });

            // assert
            Assert.IsTrue(notifyFailureCalled);
        }
Пример #6
0
        public void IsImageExists()
        {
            // arrange
            var vm = new ImageFieldViewModel
                {
                    Value = new byte[] { 1, 2, 3 }
                };

            // act
            var isImageExists = new PrivateAccessor(vm).CallMethod("IsImageExists", new object[] { null } );

            // assert
            Assert.IsTrue((bool)isImageExists);
        }
Пример #7
0
        public void ShowImageCommand()
        {
            // arrange
            var vm = new ImageFieldViewModel
                {
                    Value = new byte[] {1, 2, 3}
                };

            var imageViewerViewModel = Mock.Create<IImageViewerViewModel>(Behavior.Loose);

            vm.TheImageViewerFactory = new ExportFactory<IImageViewerViewModel>(() => new Tuple<IImageViewerViewModel, Action>(imageViewerViewModel, null));

            var okCalled = false;
            var popupFactory = Mock.Create<PopupFactory>();
            var popupBuilder = new PopupBuilder();
            Mock.Arrange(() => popupBuilder.Show(Arg.IsAny<Action>(), Arg.IsAny<Func<bool>>())).DoInstead((Action ok, Action cancel) =>
                {
                    ok();
                    okCalled = true;
                });
            Mock.Arrange(() => popupFactory.Popup()).Returns(popupBuilder);

            vm.ThePopupFactory = popupFactory;

            // act
            vm.ShowImageCommand.Execute(null);

            // assert
            CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, (ICollection)imageViewerViewModel.Image);
            Assert.IsTrue(okCalled);
        }
Пример #8
0
        public void ClearImageCommand()
        {
            // arrange
            var vm = new ImageFieldViewModel();

            var imageVisibilityRaises = false;
            Mock.NonPublic.Arrange(vm, "RaisePropertyChanged", ArgExpr.IsAny<Expression<Func<bool>>>()).DoInstead(() => imageVisibilityRaises = true);

            var downloadImageCommandRaises = false;
            Mock.Arrange(() => vm.DownloadImageCommand.RaiseCanExecuteChanged()).DoInstead(() => downloadImageCommandRaises = true);

            var clearImageCommandRaises = false;
            Mock.Arrange(() => vm.ClearImageCommand.RaiseCanExecuteChanged()).DoInstead(() => clearImageCommandRaises = true);

            vm.Value = new byte[] { 1, 2, 3 };

            // act
            vm.ClearImageCommand.Execute(null);

            // assert
            Assert.IsNull(vm.Value);
            Assert.IsTrue(imageVisibilityRaises);
            Assert.IsTrue(downloadImageCommandRaises);
            Assert.IsTrue(clearImageCommandRaises);
        }
Пример #9
0
        public void DownloadImageCommand()
        {
            // arrange
            var vm = new ImageFieldViewModel();

            var saveFileDialog = Mock.Create<SaveFileDialog>(Behavior.CallOriginal);
            Mock.Arrange(() => saveFileDialog.ShowDialog()).Returns(false);

            var privateAccessor = new PrivateAccessor(vm);
            privateAccessor.SetField("_saveFileDialog", saveFileDialog);

            Mock.NonPublic.Arrange<bool>(vm, "IsImageExists", new object[] { ArgExpr.IsAny<object>() }).Returns(true);

            var editableRoot = Mock.Create<IEditableRoot>(Behavior.Loose);
            Mock.Arrange(() => editableRoot.ProcessName).Returns("eCar_p");
            Mock.Arrange(() => editableRoot.Id).Returns(1);

            Mock.Arrange(() => vm.ParentModel).Returns(editableRoot);

            Mock.Arrange(() => vm.Property).Returns(GetType().GetProperty("Image2"));

            // act
            try
            {
                vm.DownloadImageCommand.Execute(null);
            }
            catch(Exception ex)
            {
                // assert
                Assert.Fail("Expected no exception, but got: " + ex.Message);
            }

            // arrange
            Mock.Arrange(() => saveFileDialog.ShowDialog()).Returns(true);

            Mock.Arrange(() => saveFileDialog.OpenFile()).Returns(new MemoryStream());

            var array = new byte[8 * 1024 + 1];
            for (var i = 0; i < array.Length; i++)
            {
                array[i] = new byte();
            }

            vm.Value = array;

            var popupFactory = new PopupFactory();
            var notifySuccessCalled = false;
            Mock.Arrange(() => popupFactory.NotifySuccess(LanguageService.Translate("Msg_SuccessfullySaved"), "Popup_Success")).DoInstead(() => notifySuccessCalled = true);

            vm.ThePopupFactory = popupFactory;

            // act
            vm.DownloadImageCommand.Execute(null);

            // assert
            Assert.IsTrue(notifySuccessCalled);
            Assert.IsNull(privateAccessor.GetField("_saveFileDialog"));
        }
Пример #10
0
        public void DownloadImageCommandThrowException()
        {
            // arrange
            var vm = new ImageFieldViewModel();
            Mock.NonPublic.Arrange<bool>(vm, "IsImageExists", new object[] { ArgExpr.IsAny<object>() }).Returns(true);

            var editableRoot = Mock.Create<IEditableRoot>(Behavior.Loose);

            Mock.Arrange(() => vm.ParentModel).Returns(editableRoot);

            Mock.Arrange(() => vm.Property).Returns(GetType().GetProperty("Image2"));

            try
            {
                // act
                vm.DownloadImageCommand.Execute(null);
            }
            catch (Exception ex)
            {
                Assert.IsInstanceOfType(ex, typeof(SecurityException), "Dialogs must be user-initiated.");
                return;
            }

            Assert.IsFalse(true);
        }
Пример #11
0
        public void UploadImageCommand()
        {
            // arrange
            var vm = new ImageFieldViewModel();

            var openFileDialog = Mock.Create<OpenFileDialog>(Behavior.CallOriginal);
            Mock.Arrange(() => openFileDialog.ShowDialog()).Returns(false);

            var privateAccessor = new PrivateAccessor(vm);
            privateAccessor.SetField("_openFileDialog", openFileDialog);

            try
            {
                // act
                vm.UploadImageCommand.Execute(null);
            }
            catch (Exception ex)
            {
                // assert
                Assert.Fail("Expected no exception, but got: " + ex.Message);
            }

            // arrange
            Mock.Arrange(() => openFileDialog.ShowDialog()).Returns(true);

            var file = Mock.Create<FileInfo>(Behavior.CallOriginal);
            Mock.Arrange(() => file.Length).Returns(8 * 1024);
            Mock.Arrange(() => openFileDialog.File).Returns(file);

            var popupFactory = new PopupFactory();
            var notifyFailureCalled = false;
            Mock.Arrange(() => popupFactory.NotifyFailure(Arg.AnyString, "Popup_Error", 3, false)).DoInstead(() => notifyFailureCalled = true);

            vm.ThePopupFactory = popupFactory;

            // act
            vm.UploadImageCommand.Execute(null);

            // assert
            Assert.IsTrue(notifyFailureCalled);

            // arrange
            Mock.NonPublic.Arrange<ulong>(vm, "MaxFileSize").Returns((ulong)file.Length + 1);

            var fileStream = Mock.Create<FileStream>(Behavior.Loose);

            var exit = false;
            Mock.Arrange(() => fileStream.Read(Arg.IsAny<byte[]>(), 0, Arg.AnyInt)).Returns(() =>
                    {
                        if (!exit)
                        {
                            exit = true;
                            return 1;
                        }

                        return 0;
                    });

            Mock.Arrange(() => file.OpenRead()).Returns(fileStream);

            var imageVisibilityRaises = false;
            Mock.NonPublic.Arrange(vm, "RaisePropertyChanged", ArgExpr.IsAny<Expression<Func<bool>>>()).DoInstead(() => imageVisibilityRaises = true);

            var downloadImageCommandRaises = false;
            Mock.Arrange(() => vm.DownloadImageCommand.RaiseCanExecuteChanged()).DoInstead(() => downloadImageCommandRaises = true);

            var clearImageCommandRaises = false;
            Mock.Arrange(() => vm.ClearImageCommand.RaiseCanExecuteChanged()).DoInstead(() => clearImageCommandRaises = true);

            // act
            vm.UploadImageCommand.Execute(null);

            // assert
            Assert.AreEqual(8 * 1024, ((byte[])vm.Value).Length);
            Assert.IsTrue(imageVisibilityRaises);
            Assert.IsTrue(downloadImageCommandRaises);
            Assert.IsTrue(clearImageCommandRaises);
            Assert.IsNull(privateAccessor.GetField("_openFileDialog"));
        }
Пример #12
0
        public void UploadImageCommandThrowException()
        {
            // arrange
            var vm = new ImageFieldViewModel();

            try
            {
                // act
                vm.UploadImageCommand.Execute(null);
            }
            catch (Exception ex)
            {
                Assert.IsInstanceOfType(ex, typeof(SecurityException), "Dialogs must be user-initiated.");
                return;
            }

            Assert.IsFalse(true);
        }
Пример #13
0
        protected override DriverResult Editor(ContentPart part, Fields.ImageField field, IUpdateModel updater, dynamic shapeHelper)
        {
            var settings  = field.PartFieldDefinition.Settings.GetModel <ImageFieldSettings>();
            var viewModel = new ImageFieldViewModel {
                Settings = settings,
                Field    = field,
                Removed  = false
            };

            if (updater.TryUpdateModel(viewModel, GetPrefix(field, part), null, null))
            {
                var postedFile = ((Controller)updater).Request.Files["ImageField-" + field.Name];

                AssignDefaultMediaFolder(settings);

                var mediaFolder = FormatWithTokens(settings.MediaFolder, part.ContentItem.ContentType, field.Name, part.ContentItem.Id);

                if (postedFile != null && postedFile.ContentLength != 0)
                {
                    // read the file in memory in case we need to apply some transformation
                    var postedFileLength = postedFile.ContentLength;
                    var postedFileStream = postedFile.InputStream;
                    var postedFileData   = new byte[postedFileLength];
                    var postedFileName   = Path.GetFileName(postedFile.FileName);
                    postedFileStream.Read(postedFileData, 0, postedFileLength);

                    if (_mediaService.FileAllowed(postedFile))
                    {
                        string uploadedFileName = String.Empty;

                        Image image;
                        using (var stream = new MemoryStream(postedFileData)) {
                            image = Image.FromStream(stream);
                        }

                        // apply transformation
                        int newWidth = settings.MaxWidth > 0 && image.Width > settings.MaxWidth
                                           ? settings.MaxWidth
                                           : image.Width;
                        float widthFactor = image.Width / (float)newWidth;
                        int   newHeight   = settings.MaxHeight > 0 && image.Height > settings.MaxHeight
                                            ? settings.MaxHeight
                                            : image.Height;
                        float heightFactor = image.Height / (float)newHeight;

                        if (widthFactor != heightFactor)
                        {
                            if (widthFactor > heightFactor)
                            {
                                newHeight = Convert.ToInt32(image.Height / widthFactor);
                            }
                            else
                            {
                                newWidth = Convert.ToInt32(image.Width / heightFactor);
                            }
                        }

                        // create a unique file name
                        string uniqueFileName = postedFileName;

                        try {
                            // try to create the folder before uploading a file into it
                            _mediaService.CreateFolder(null, mediaFolder);
                        }
                        catch {
                            // the folder can't be created because it already exists, continue
                        }

                        var  existingFiles = _mediaService.GetMediaFiles(mediaFolder);
                        bool found         = true;
                        var  index         = 0;
                        while (found)
                        {
                            index++;
                            uniqueFileName = String.Format("{0}-{1}{2}", Path.GetFileNameWithoutExtension(postedFileName), index, Path.GetExtension(postedFileName));
                            found          = existingFiles.Any(f => 0 == String.Compare(uniqueFileName, f.Name, StringComparison.OrdinalIgnoreCase));
                        }

                        // resize the image
                        Image target = null;
                        switch (settings.ResizeAction)
                        {
                        case ResizeActions.Validate:
                            if ((settings.MaxWidth > 0 && image.Width > settings.MaxWidth) ||
                                (settings.MaxHeight > 0 && image.Height > settings.MaxHeight))
                            {
                                updater.AddModelError("File",
                                                      T("The file is bigger than the allowed size: {0}x{1}",
                                                        image.Width, image.Height));
                            }
                            target = new Bitmap(image);
                            break;

                        case ResizeActions.Resize:
                            target = new Bitmap(newWidth, newHeight);
                            using (var graphics = Graphics.FromImage(target)) {
                                graphics.CompositingQuality = CompositingQuality.HighSpeed;
                                graphics.InterpolationMode  = InterpolationMode.HighQualityBicubic;
                                graphics.CompositingMode    = CompositingMode.SourceCopy;
                                graphics.DrawImage(image, 0, 0, newWidth, newHeight);
                            }
                            Services.Notifier.Information(T("The image {0} has been resized to {1}x{2}",
                                                            field.Name.CamelFriendly(), newWidth, newHeight));
                            break;

                        case ResizeActions.Scale:
                            target = new Bitmap(image);
                            break;

                        case ResizeActions.Crop:
                            target = new Bitmap(newWidth, newHeight);
                            using (var graphics = Graphics.FromImage(target)) {
                                graphics.DrawImage(image, 0, 0, new Rectangle(0, 0, newWidth, newHeight), GraphicsUnit.Pixel);
                            }
                            Services.Notifier.Information(T("The image {0} has been cropped to {1}x{2}",
                                                            field.Name.CamelFriendly(), newWidth, newHeight));
                            break;
                        }

                        if (target != null)
                        {
                            using (var imageStream = new MemoryStream()) {
                                // keeps the original format
                                ImageFormat imageFormat;
                                switch (Path.GetExtension(postedFileName).ToLower())
                                {
                                case ".bmp":
                                    imageFormat = ImageFormat.Bmp;
                                    break;

                                case ".gif":
                                    imageFormat = ImageFormat.Gif;
                                    break;

                                case ".jpg":
                                    imageFormat = ImageFormat.Jpeg;
                                    break;

                                default:
                                    imageFormat = ImageFormat.Png;
                                    break;
                                }

                                target.Save(imageStream, imageFormat);
                                uploadedFileName = _mediaService.UploadMediaFile(mediaFolder, uniqueFileName, imageStream.ToArray(), false);
                            }

                            // assigning actual size to be rendered in html
                            field.Width  = newWidth;
                            field.Height = newHeight;

                            // don't convert the url to ~/ if it's a fully qualified
                            // as it might be stored on a remote storage (cdn, blob, ...)
                            field.FileName = VirtualPathUtility.IsAbsolute(uploadedFileName)
                                ? VirtualPathUtility.ToAppRelative(uploadedFileName)
                                : uploadedFileName;
                        }
                        else
                        {
                            field.Width    = 0;
                            field.Height   = 0;
                            field.FileName = String.Empty;
                        }
                    }
                    else
                    {
                        updater.AddModelError("File", T("The file type is not allowed for: {0}.", postedFile.FileName));
                    }
                }
                else
                {
                    if (settings.Required && string.IsNullOrWhiteSpace(field.FileName))
                    {
                        updater.AddModelError("File", T("You must provide an image file for {0}.", field.Name.CamelFriendly()));
                    }

                    if (!settings.Required && viewModel.Removed)
                    {
                        field.FileName = null;
                        field.Height   = 0;
                        field.Width    = 0;

                        Services.Notifier.Information(T("{0} was removed.", field.Name.CamelFriendly()));
                    }
                }

                // define alernate text
                if (settings.AlternateText)
                {
                    field.AlternateText = String.IsNullOrWhiteSpace(viewModel.AlternateText)
                        ? postedFile == null || String.IsNullOrEmpty(postedFile.FileName) ? String.Empty : VirtualPathUtility.GetFileName(postedFile.FileName)
                        : viewModel.AlternateText;
                }
            }

            return(Editor(part, field, shapeHelper));
        }