public void FileUpdaterCanUpdateFileName()
        {
            // Arrange.
            const string ExpectedName = "ExpectedName.test";

            var nameValue = new object();
            var typeConverter = Mock.Create<ITypeConverter>(Behavior.Loose);
            Mock.Arrange(() => typeConverter.Convert<string>(nameValue)).Returns(ExpectedName);

            var fileManager = Mock.Create<IFileManager>(Behavior.Loose);

            var dataContext = Mock.Create<IDataContext>(Behavior.Loose);
            var mapping = new FileFieldMapping(
                ReflectionHelper.GetProperty<TestEdit>(x => x.File),
                dc => dc == dataContext ? nameValue : null,
                null,
                null,
                typeConverter,
                fileManager);

            var file = Mock.Create<IFileProcess>(Behavior.Loose);
            var editableRoot = new TestEdit { File = file };

            // Act.
            mapping.Update(dataContext, editableRoot);

            // Assert.
            Assert.AreEqual(ExpectedName, file.OriginalFileName);
        }
        public void FileUpdaterCanUpdateFileFromBytes()
        {
            // Arrange.
            const string TempFileFullName = @"z:\TempFolder\TestFile.tmp";
            const string TempFileName = "TestFile.tmp";

            var contentValue = new object();
            var expectedContent = new byte[0];

            var typeConverter = Mock.Create<ITypeConverter>(Behavior.Loose);
            Mock.Arrange(() => typeConverter.Convert<byte[]>(contentValue)).Returns(expectedContent);

            var fileManager = Mock.Create<IFileManager>();
            Mock.Arrange(() => fileManager.GetTempFileName(Arg.AnyString)).Returns(TempFileFullName);

            var dataContext = Mock.Create<IDataContext>(Behavior.Loose);
            var mapping = new FileFieldMapping(
                ReflectionHelper.GetProperty<TestEdit>(x => x.File),
                null,
                dc => dc == dataContext ? contentValue : null,
                null,
                typeConverter,
                fileManager);

            var file = Mock.Create<IFileProcess>(Behavior.Loose);
            var editableRoot = new TestEdit { File = file };

            Mock.Arrange(() => File.WriteAllBytes(TempFileFullName, expectedContent)).DoNothing().InOrder();
            Mock.Arrange(() => Path.GetFileName(TempFileFullName)).Returns(TempFileName);
            Mock.Arrange(() => file.UploadFile()).DoNothing().InOrder();

            // Act.
            mapping.Update(dataContext, editableRoot);

            // Assert.
            Mock.Assert(() => File.WriteAllBytes(TempFileFullName, expectedContent), Occurs.Once());
            Assert.AreEqual(TempFileName, file.OriginalFileName);
            Assert.AreEqual(TempFileName, file.FileName);
            Mock.Assert(() => file.UploadFile(), Occurs.Once());
        }
        public void WhenWebResponseContainsContentDisposition_Update_ChangesOriginalFileNameAndExtension()
        {
            // Arrange.
            const string ExpectedLocation = @"http://www.example.com/";
            const string OriginalFileName = "TestFile.png";
            const string TempFileFullName = @"z:\TempFolder\TempFile";
            const string TempFileFullNameWithExtension = @"z:\TempFolder\TempFile.png";
            const string TempFileNameWithExtension = "TempFile.png";

            var locationValue = new object();
            var typeConverter = Mock.Create<ITypeConverter>(Behavior.Loose);
            Mock.Arrange(() => typeConverter.Convert<string>(locationValue)).Returns(ExpectedLocation);

            var fileManager = Mock.Create<IFileManager>();
            Mock.Arrange(() => fileManager.GetTempFileName(Arg.AnyString)).Returns(TempFileFullName);

            var dataContext = Mock.Create<IDataContext>(Behavior.Loose);
            var mapping = new FileFieldMapping(
                ReflectionHelper.GetProperty<TestEdit>(x => x.File),
                null,
                null,
                dc => dc == dataContext ? locationValue : null,
                typeConverter,
                fileManager);

            var file = Mock.Create<IFileProcess>(Behavior.Loose);
            var editableRoot = new TestEdit { File = file };

            var responseHeaders = new WebHeaderCollection();
            responseHeaders["content-disposition"] = "attachment; filename=" + OriginalFileName;

            Mock.Arrange(() => Arg.IsAny<WebClient>().ResponseHeaders).Returns(responseHeaders);
            Mock.Arrange(() => Arg.IsAny<WebClient>().DownloadFile(ExpectedLocation, TempFileFullName)).DoNothing();
            Mock.Arrange(() => File.Move(TempFileFullName, TempFileFullNameWithExtension)).DoNothing().InOrder();
            Mock.Arrange(() => file.UploadFile()).DoNothing().InOrder();

            // Act.
            mapping.Update(dataContext, editableRoot);

            // Assert.
            Mock.Assert(() => Arg.IsAny<WebClient>().DownloadFile(ExpectedLocation, TempFileFullName), Occurs.Once());
            Mock.Assert(() => File.Move(TempFileFullName, TempFileFullNameWithExtension), Occurs.Once());
            Mock.Assert(() => file.UploadFile(), Occurs.Once());
            Assert.AreEqual(OriginalFileName, file.OriginalFileName);
            Assert.AreEqual(TempFileNameWithExtension, file.FileName);
        }
        public void TryCreateFilter_ReturnsFalse()
        {
            // Arrange.
            var typeConverter = Mock.Create<ITypeConverter>(Behavior.Loose);
            var fileManager = Mock.Create<IFileManager>(Behavior.Loose);
            var mapping = new FileFieldMapping(ReflectionHelper.GetProperty<TestEdit>(x => x.File), null, null, null, typeConverter, fileManager);
            var dataContext = Mock.Create<IDataContext>(Behavior.Loose);

            // Act / Assert.
            ColumnFilter filter;

            Assert.IsFalse(mapping.TryCreateFilter(dataContext, out filter));
        }
        public void FileUpdaterCanUpdateFileFromLocation()
        {
            // Arrange.
            const string ExpectedLocation = @"http://www.example.com/";
            const string TempFileFullName = @"z:\TempFolder\TestFile.tmp";
            const string TempFileName = "TestFile.tmp";

            var locationValue = new object();
            var typeConverter = Mock.Create<ITypeConverter>(Behavior.Loose);
            Mock.Arrange(() => typeConverter.Convert<string>(locationValue)).Returns(ExpectedLocation);

            var fileManager = Mock.Create<IFileManager>();
            Mock.Arrange(() => fileManager.GetTempFileName(Arg.AnyString)).Returns(TempFileFullName);

            var dataContext = Mock.Create<IDataContext>(Behavior.Loose);
            var mapping = new FileFieldMapping(
                ReflectionHelper.GetProperty<TestEdit>(x => x.File),
                null,
                null,
                dc => dc == dataContext ? locationValue : null,
                typeConverter,
                fileManager);

            var file = Mock.Create<IFileProcess>(Behavior.Loose);
            var editableRoot = new TestEdit { File = file };

            var responseHeaders = new WebHeaderCollection();

            Mock.Arrange(() => Arg.IsAny<WebClient>().ResponseHeaders).Returns(responseHeaders);
            Mock.Arrange(() => Arg.IsAny<WebClient>().DownloadFile(ExpectedLocation, TempFileFullName)).DoNothing();
            Mock.Arrange(() => file.UploadFile()).DoNothing();

            // Act.
            mapping.Update(dataContext, editableRoot);

            // Assert.
            Mock.Assert(() => Arg.IsAny<WebClient>().DownloadFile(ExpectedLocation, TempFileFullName), Occurs.Once());
            Mock.Assert(() => file.UploadFile(), Occurs.Once());
            Assert.AreEqual(TempFileName, file.OriginalFileName);
            Assert.AreEqual(TempFileName, file.FileName);
        }