public async Task ValidateDataFilesForUpload_MetadataFileNotCsv()
        {
            var(subjectService, fileTypeService) = Mocks();

            await using (var context = InMemoryApplicationDbContext())
            {
                var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, context);

                var dataFile = CreateSingleLineFormFile("test.csv", "test.csv");
                var metaFile = CreateSingleLineFormFile("test.meta.csv", "test.meta.csv");

                fileTypeService
                .Setup(s => s.HasMatchingMimeType(dataFile, It.IsAny <IEnumerable <Regex> >()))
                .ReturnsAsync(() => true);
                fileTypeService
                .Setup(s => s.HasMatchingMimeType(metaFile, It.IsAny <IEnumerable <Regex> >()))
                .ReturnsAsync(() => false);
                fileTypeService
                .Setup(s => s.HasMatchingEncodingType(dataFile, It.IsAny <IEnumerable <string> >()))
                .Returns(() => true);
                fileTypeService
                .Setup(s => s.HasMatchingEncodingType(metaFile, It.IsAny <IEnumerable <string> >()))
                .Returns(() => true);

                var result = await service.ValidateDataFilesForUpload(Guid.NewGuid(), dataFile, metaFile);

                Assert.True(result.IsLeft);
                AssertValidationProblem(result.Left, MetaFileMustBeCsvFile);
            }
        }
        public async Task ValidateFileForUpload_ExceptionThrownForDataFileType()
        {
            var(subjectService, fileTypeService) = Mocks();
            var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, null);

            var file = CreateFormFile("test.csv", "test.csv");

            await Assert.ThrowsAsync <ArgumentException>(() => service.ValidateFileForUpload(file, FileType.Data));
        }
        public async Task ValidateFileForUpload_FileCannotBeEmpty()
        {
            var(subjectService, fileTypeService) = Mocks();
            var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, null);

            var file = CreateFormFile("test.csv", "test.csv");

            var result = await service.ValidateFileForUpload(file, Ancillary);

            Assert.True(result.IsLeft);
            AssertValidationProblem(result.Left, FileCannotBeEmpty);
        }
        public async Task ValidateSubjectName_SubjectNameContainsSpecialCharacters()
        {
            var(subjectService, fileTypeService) = Mocks();

            await using (var context = InMemoryApplicationDbContext())
            {
                var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, context);

                var result = await service.ValidateSubjectName(Guid.NewGuid(), "Subject & Title");

                Assert.True(result.IsLeft);
                AssertValidationProblem(result.Left, SubjectTitleCannotContainSpecialCharacters);
            }
        }
        public async Task ValidateFileForUpload_FileTypeIsValid()
        {
            var(subjectService, fileTypeService) = Mocks();

            var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, null);

            var file = CreateSingleLineFormFile("test.csv", "test.csv");

            fileTypeService
            .Setup(s => s.HasMatchingMimeType(file, It.IsAny <IEnumerable <Regex> >()))
            .ReturnsAsync(() => true);
            var result = await service.ValidateFileForUpload(file, Ancillary);

            Assert.True(result.IsRight);
        }
        public async Task ValidateDataFilesForUpload_MetadataFileIsEmpty()
        {
            var(subjectService, fileTypeService) = Mocks();

            await using (var context = InMemoryApplicationDbContext())
            {
                var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, context);

                var dataFile = CreateSingleLineFormFile("test.csv", "test.csv");
                var metaFile = CreateFormFile("test.meta.csv", "test.meta.csv");

                var result = await service.ValidateDataFilesForUpload(Guid.NewGuid(), dataFile, metaFile);

                Assert.True(result.IsLeft);
                AssertValidationProblem(result.Left, MetadataFileCannotBeEmpty);
            }
        }
        public async Task ValidateSubjectName_SubjectNameNotUnique()
        {
            var(subjectService, fileTypeService) = Mocks();

            subjectService.Setup(service => service.Get(It.IsAny <Guid>(), "Subject Title"))
            .ReturnsAsync(new Subject());

            await using (var context = InMemoryApplicationDbContext())
            {
                var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, context);

                var result = await service.ValidateSubjectName(Guid.NewGuid(), "Subject Title");

                Assert.True(result.IsLeft);
                AssertValidationProblem(result.Left, SubjectTitleMustBeUnique);
            }
        }
        public async Task UploadedZippedDatafileIsValid()
        {
            var(subjectService, fileTypeService) = Mocks();

            await using (var context = InMemoryApplicationDbContext())
            {
                var service = new FileUploadsValidatorService(subjectService.Object, fileTypeService.Object, context);

                var archiveFile = GetArchiveFile("data-zip-valid.zip");

                fileTypeService
                .Setup(s => s.HasMatchingMimeType(It.IsAny <Stream>(),
                                                  It.IsAny <IEnumerable <Regex> >()))
                .ReturnsAsync(() => true);

                var result = await service.ValidateDataArchiveEntriesForUpload(Guid.NewGuid(),
                                                                               archiveFile);

                Assert.True(result.IsRight);
            }
        }