public virtual async Task<IHttpActionResult> UploadFile()
        {
            if (!Request.Content.IsMimeMultipartContent())
                throw new Exception();
            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);
            var fileInfo = new FileDataContract {UserName = User.Identity.Name};
            Stream buffer = null;
            foreach (var content in provider.Contents)
            {
                var name = content.Headers.ContentDisposition.Name.Trim('\"');
                if (string.Equals(name, "referenceNotes", StringComparison.InvariantCultureIgnoreCase))
                {
                    fileInfo.ReferenceNotes = await content.ReadAsStringAsync();
                    continue;
                }
                if (string.Equals(name, "fileHandler", StringComparison.InvariantCultureIgnoreCase))
                {
                    fileInfo.HandlerName = await content.ReadAsStringAsync();
                    continue;
                }
                if (string.Equals(name, "mediaType", StringComparison.InvariantCultureIgnoreCase))
                {
                    fileInfo.MediaType = await content.ReadAsStringAsync();
                    continue;
                }
                if (!string.Equals(name, "file", StringComparison.InvariantCultureIgnoreCase)) continue;
                fileInfo.OriginalFileName = content.Headers.ContentDisposition.FileName.Trim('\"');
                buffer = await content.ReadAsStreamAsync();
            }
            var result = await service.UpsertFileDataSource(fileInfo, buffer);

            return Ok(result);
        }
 public virtual Task<SourceResultDataContract> UpsertFileDataSource(FileDataContract fileData, Stream stream)
 {
     return Task.Run(() =>
         {
             lock (UpsertFileDataSourceLock)
             {
                 var hash = GetHash(stream);
                 var fileSource = Context.GetFileDataSource(fileData.SourceId, hash);
                 if (fileSource == null)
                 {
                     fileSource = new FileDataSource
                         {
                             OriginalFileName = fileData.OriginalFileName,
                             DateEdit = DateTime.Now,
                             InputStatus = SourceStatus.PendingExtraction,
                             ReferenceNotes = fileData.ReferenceNotes,
                             UserName = fileData.UserName,
                             HandlerName = fileData.HandlerName,
                             FileHash = hash,
                             MediaType = fileData.MediaType
                         };
                     fileSource = Context.AddDataSource(fileSource);
                     var newFileName = streamManager
                         .StageStream(
                             fileSource.Id,
                             fileData.OriginalFileName,
                             stream);
                     fileSource.CurrentFileName = newFileName;
                 }
                 if (fileSource.InputStatus != SourceStatus.PendingExtraction)
                 {
                     return DataContractError(fileSource.Id,
                                              DataSourceServiceResources.FileSourceIsNotPendingExtraction);
                 }
                 fileSource.OriginalFileName = fileData.OriginalFileName ?? fileSource.OriginalFileName;
                 fileSource.HandlerName = fileData.HandlerName ?? fileSource.HandlerName;
                 fileSource.MediaType = fileData.MediaType ?? fileSource.MediaType;
                 fileSource.UserName = fileData.UserName;
                 fileSource.DateEdit = DateTime.Now;
                 fileSource.ReferenceNotes = fileData.ReferenceNotes ?? fileSource.ReferenceNotes;
                 Context.UpdateDataSource(fileSource);
                 return ValidateSource(fileSource.Id);
             }
         });
 }
        public void UpsertFileDataMustNotUpdateReferenceNotesIfNull()
        {
            //Arrange
            var source = new FileDataSource
                {
                    Id = newSourceId, 
                    InputStatus = SourceStatus.PendingExtraction,
                    HandlerName = "oldHandlerName",
                    OriginalFileName = "oldFileName",
                    ReferenceNotes ="oldReferenceNotes"
                };
            mockContext
                .Setup(context => context.GetFileDataSource(It.IsAny<Guid>(), It.IsAny<string>()))
                .Returns(source)
                .Verifiable();
            CreateService();
            mockService
                .Setup(service => service.ValidateSource(It.IsAny<Guid>()))
                .Returns((SourceResultDataContract)null)
                .Verifiable();
            var contract = new FileDataContract
            {
                SourceId = newSourceId,
                HandlerName = "newHandlerName",
                OriginalFileName = "newFileName",
            };            

            //Act
            mockService.Object.UpsertFileDataSource(contract,new MemoryStream());

            //Assert
            mockService.Verify();
            mockContext.Verify();
            mockContext
                .Verify(context => context.UpdateDataSource(It.Is<FileDataSource>(
                    dataSource =>
                    (dataSource.Id == newSourceId) &&
                    (dataSource.UserName == "testUserName") &&
                    (dataSource.OriginalFileName == "newFileName") &&
                    (dataSource.HandlerName == "newHandlerName") &&
                    (dataSource.ReferenceNotes == "oldReferenceNotes"))));
        }
        public void UpsertFileDataSourceMustCallValidateIfUpdating()
        {
            //Arrange
            var source = new FileDataSource { Id = newSourceId,InputStatus =  SourceStatus.PendingExtraction};
            mockContext
                .Setup(context => context.GetFileDataSource(It.IsAny<Guid>(), It.IsAny<string>()))
                .Returns(source)
                .Verifiable();

            var uploadContract = new FileDataContract
            {
                SourceId = newSourceId,
                OriginalFileName = "Original Name"
            };
            var fileStream = new MemoryStream(new byte[] { 100 });

            //Act
            CreateService().UpsertFileDataSource(uploadContract, fileStream);

            //Assert
            mockService
                .Verify(service => service.ValidateSource(It.Is<Guid>(guid => guid == newSourceId)));
        }
        public void UpsertFileDataSourceMustSetTheFileHashIfInserting()
        {
            //Arrange
            var source = new FileDataSource { Id = newSourceId };
            mockContext
                .Setup(context => context.AddDataSource(It.IsAny<FileDataSource>()))
                .Returns(source)
                .Verifiable();

            var uploadContract = new FileDataContract
            {
                SourceId = newSourceId,
                OriginalFileName = "Original Name",
            };
            var fileStream = new MemoryStream(new byte[] {100});

            //Act
            CreateService().UpsertFileDataSource(uploadContract, fileStream);

            //Assert
             mockContext
                .Verify(context => context.AddDataSource(
                    It.Is<FileDataSource>(
                    dataSource => 
                    (dataSource.OriginalFileName == "Original Name") &&
                    (dataSource.FileHash) == "<686ÏNffi¢]¢€¡†\\-(t")));
        }
        public void UpsertFileDataSourceMustCancelfInsertingAndSourceIdNotNull()
        {
            //Arrange
            var source = new FileDataSource { Id = newSourceId };
            mockContext
                .Setup(context => context.AddDataSource(It.IsAny<FileDataSource>()))
                .Returns(source)
                .Verifiable();

            var uploadContract = new FileDataContract
            {
                SourceId = newSourceId,
                OriginalFileName = "Original Name"
            };

            //Act
            CreateService().UpsertFileDataSource(uploadContract,new MemoryStream());

            //Assert
            mockContext.Verify();
            mockService
                .Verify(service => service.CancelFileSourceExtraction(It.Is<Guid>(guid => guid == newSourceId)));
        }
        public void UpsertFilesourceMustUpdateCurrentFileNameWithTheNewName()
        {
            //Arrange
            var source = new FileDataSource { Id = newSourceId, InputStatus = SourceStatus.PendingExtraction };
            mockStreamManager
                .Setup(manager => manager.StageStream(
                    It.Is<Guid>(guid => guid == newSourceId),
                    It.Is<string>(s => s == "Original Name"),
                    It.IsAny<Stream>()))
                .Returns("NewFileName")
                .Verifiable();
            mockContext
                .Setup(context => context.AddDataSource(It.IsAny<FileDataSource>()))
                .Returns(source);

            var uploadContract = new FileDataContract
                {
                    SourceId = newSourceId,
                    OriginalFileName = "Original Name"
                };

            //Act
            CreateService().UpsertFileDataSource(uploadContract,new MemoryStream());

            //Assert
            mockService.Verify();
            mockStreamManager.Verify();
            mockContext.Verify(context => context.UpdateDataSource(It.Is<FileDataSource>(
                dataSource =>
                (dataSource.Id == newSourceId) &&
                (dataSource.InputStatus == SourceStatus.PendingExtraction) &&
                (dataSource.CurrentFileName == "NewFileName"))), Times.Once);
        }
        public void UpsertFileDataSourceMustCallAddDatasourceWhenInserting()
        {
            //Arrange
            var contract = new FileDataContract
                {
                    ReferenceNotes = "reference notes",
                    OriginalFileName = "Original name",
                    HandlerName = "handler name"
                };
            mockContext
                .Setup(context => context.AddDataSource(It.Is<FileDataSource>(
                    source =>
                    (source.InputStatus == SourceStatus.PendingExtraction) &&
                    (source.ReferenceNotes == "reference notes") &&
                    (source.OriginalFileName == "Original name") &&
                    (source.HandlerName == "handler name") &&
                    (source.UserName == "TestUserName"))))
                .Returns(new FileDataSource {Id = newSourceId, InputStatus = SourceStatus.PendingExtraction})
                .Verifiable();

            //Act
            CreateService().UpsertFileDataSource(contract, new MemoryStream());

            //Assert
            mockContext.Verify();
        }