public void IndexPostInvokesLogInformation_WhenFileIsNull()
        {
            const string userName = "******";

            var logger = new Mock<ILogger<ImportController>>();

            var sut = new ImportController(null, logger.Object);
            sut.SetFakeUserName(userName);
            sut.Index(null);

            var message = $"User {userName} attempted a file upload without specifying a file.";

            logger.Verify(
                x =>
                    x.Log(LogLevel.Information, It.IsAny<EventId>(),
                        It.Is<Microsoft.Extensions.Logging.Internal.FormattedLogValues>(
                            y => (string) y[0].Value == message),
                        It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>()), Times.Once);
        }
        public void IndexPostLogsCorrectMessage_WhenImportSucceeds()
        {
            const string userName = "******";
            const string fileName = "FileName";

            var importRequestViewModels = new List<ImportRequestViewModel>
            {
                new ImportRequestViewModel { Id =  "Id", Name = "Name", Address = "Address", City = "City", Email = "*****@*****.**", Phone = "111-111-1111", State = "State", Zip = "Zip" }
            };

            var iFormFile = new Mock<IFormFile>();
            var csvFactory = new Mock<ICsvFactory>();
            var csvReader = new Mock<ICsvReader>();
            var mediator = new Mock<IMediator>();
            var logger = new Mock<ILogger<ImportController>>();

            iFormFile.Setup(x => x.OpenReadStream()).Returns(new MemoryStream());
            iFormFile.Setup(x => x.Name).Returns(fileName);
            csvFactory.Setup(x => x.CreateReader(It.IsAny<TextReader>())).Returns(csvReader.Object);
            csvReader.Setup(x => x.Configuration).Returns(new CsvConfiguration());
            csvReader.Setup(x => x.GetRecords<ImportRequestViewModel>()).Returns(importRequestViewModels);
            mediator.Setup(x => x.Send(It.IsAny<DuplicateProviderRequestIdsQuery>())).Returns(new List<string>());

            var sut = new ImportController(mediator.Object, logger.Object, csvFactory.Object);
            sut.SetFakeUserName(userName);
            sut.Index(new IndexViewModel { File = iFormFile.Object });

            logger.Verify(m => m.Log(LogLevel.Information, It.IsAny<EventId>(),
            It.Is<FormattedLogValues>(v => v.ToString() == $"{userName} imported file {fileName}"),
            null, It.IsAny<Func<object, Exception, string>>()), Times.Once);
        }
        public void IndexPostAssignsImportSuccessToTrue_WhenImportSucceeds()
        {
            var importRequestViewModels = new List<ImportRequestViewModel>
            {
                new ImportRequestViewModel { Id =  "Id", Name = "Name", Address = "Address", City = "City", Email = "*****@*****.**", Phone = "111-111-1111", State = "State", Zip = "Zip" }
            };

            var iFormFile = new Mock<IFormFile>();
            var csvFactory = new Mock<ICsvFactory>();
            var csvReader = new Mock<ICsvReader>();
            var mediator = new Mock<IMediator>();

            iFormFile.Setup(x => x.OpenReadStream()).Returns(new MemoryStream());
            iFormFile.Setup(x => x.Name).Returns(It.IsAny<string>());
            csvFactory.Setup(x => x.CreateReader(It.IsAny<TextReader>())).Returns(csvReader.Object);
            csvReader.Setup(x => x.Configuration).Returns(new CsvConfiguration());
            csvReader.Setup(x => x.GetRecords<ImportRequestViewModel>()).Returns(importRequestViewModels);
            mediator.Setup(x => x.Send(It.IsAny<DuplicateProviderRequestIdsQuery>())).Returns(new List<string>());

            var sut = new ImportController(mediator.Object, Mock.Of<ILogger<ImportController>>(), csvFactory.Object);
            sut.SetFakeUserName("UserName");
            var result = (IndexViewModel)((ViewResult)sut.Index(new IndexViewModel { File = iFormFile.Object })).Model;

            Assert.True(result.ImportSuccess);
        }
        public void IndexPostSendsImportRequestsCommandWithTheCorrectViewModel()
        {
            var importRequestViewModels = new List<ImportRequestViewModel>
            {
                new ImportRequestViewModel { Id =  "Id", Name = "Name", Address = "Address", City = "City", Email = "*****@*****.**", Phone = "111-111-1111", State = "State", Zip = "Zip" }
            };

            var iFormFile = new Mock<IFormFile>();
            var csvFactory = new Mock<ICsvFactory>();
            var csvReader = new Mock<ICsvReader>();
            var mediator = new Mock<IMediator>();

            iFormFile.Setup(x => x.OpenReadStream()).Returns(new MemoryStream());
            iFormFile.Setup(x => x.Name).Returns(It.IsAny<string>());
            csvFactory.Setup(x => x.CreateReader(It.IsAny<TextReader>())).Returns(csvReader.Object);
            csvReader.Setup(x => x.Configuration).Returns(new CsvConfiguration());
            csvReader.Setup(x => x.GetRecords<ImportRequestViewModel>()).Returns(importRequestViewModels);
            mediator.Setup(x => x.Send(It.IsAny<DuplicateProviderRequestIdsQuery>())).Returns(new List<string>());

            var sut = new ImportController(mediator.Object, Mock.Of<ILogger<ImportController>>(), csvFactory.Object);
            sut.SetFakeUserName("UserName");
            sut.Index(new IndexViewModel { File = iFormFile.Object });

            mediator.Verify(x => x.Send(It.Is<ImportRequestsCommand>(y => 
                y.ImportRequestViewModels[0].Id == importRequestViewModels[0].Id &&
                y.ImportRequestViewModels[0].Name == importRequestViewModels[0].Name &&
                y.ImportRequestViewModels[0].Address == importRequestViewModels[0].Address &&
                y.ImportRequestViewModels[0].City == importRequestViewModels[0].City &&
                y.ImportRequestViewModels[0].Email == importRequestViewModels[0].Email &&
                y.ImportRequestViewModels[0].Phone == importRequestViewModels[0].Phone &&
                y.ImportRequestViewModels[0].State == importRequestViewModels[0].State &&
                y.ImportRequestViewModels[0].Zip == importRequestViewModels[0].Zip &&
                y.ImportRequestViewModels[0].Longitude == 0 &&
                y.ImportRequestViewModels[0].Latitude == 0 &&
                y.ImportRequestViewModels[0].ProviderData == null)), Times.Once);
        }