public async Task EmptySearchStringReturnsNoResults()
        {
            // Arrange
            var databaseContext =
                new PersonDatabaseContext(
                    new DbContextOptionsBuilder <PersonDatabaseContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString())
                    .Options
                    )
            ;

            var testFirstName = "foo";

            var testPerson =
                new PersonModel()
            {
                Age         = 14
                , FirstName = testFirstName
                , LastName  = "bar"
                , Id        = Guid.NewGuid()
            }
            ;

            databaseContext.PersonSet.Add(testPerson);
            databaseContext.SaveChanges();

            var appSettingsMock = new Mock <IOptionsSnapshot <AppSettings> >();

            appSettingsMock
            .Setup(personSearchOptions =>
                   personSearchOptions.Value
                   )
            .Returns(new AppSettings
            {
                PersonSearchMaxResults = 100
            })
            ;

            var controller =
                new PersonController(
                    databaseContext: databaseContext
                    , appSettings: appSettingsMock.Object
                    )
            ;

            // Act
            var result = await controller.Search(personName : string.Empty);

            // Assert
            var viewResult = Assert.IsType <OkObjectResult>(result);
            var model      =
                Assert
                .IsAssignableFrom <PersonSearchResult>(
                    viewResult
                    .Value
                    )
            ;

            Assert.Empty(model.PersonSet);
        }
        public async Task PostReturnsValidationErrorForInvalidModel()
        {
            // Arrange
            var databaseContext =
                new PersonDatabaseContext(
                    new DbContextOptionsBuilder <PersonDatabaseContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString())
                    .Options
                    )
            ;

            var testPerson =
                new PersonModel()
            {
                Age         = 131
                , FirstName = "foo"
                , LastName  = "bar"
                , Id        = Guid.NewGuid()
            }
            ;

            var appSettingsMock = new Mock <IOptionsSnapshot <AppSettings> >();

            appSettingsMock
            .Setup(personSearchOptions =>
                   personSearchOptions.Value
                   )
            .Returns(new AppSettings
            {
                PersonSearchMaxResults = 100
            })
            ;

            var controller =
                new PersonController(
                    databaseContext: databaseContext
                    , appSettings: appSettingsMock.Object
                    )
            ;

            controller.ModelState.AddModelError("error", "some error");

            // Act
            var result = await controller.Post(model : testPerson);

            // Assert
            var viewResult = Assert.IsType <BadRequestObjectResult>(result);
            var model      =
                Assert
                .IsAssignableFrom <PersonValidationResult>(
                    viewResult
                    .Value
                    )
            ;

            Assert.NotEmpty(model.ValidationErrors);
        }
        public async Task PostAddsNewRecordForValidModel()
        {
            // Arrange
            var databaseContext =
                new PersonDatabaseContext(
                    new DbContextOptionsBuilder <PersonDatabaseContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString())
                    .Options
                    )
            ;

            var testPerson =
                new PersonModel()
            {
                Age         = 14
                , FirstName = "foo"
                , LastName  = "bar"
                , Id        = Guid.NewGuid()
            }
            ;

            var appSettingsMock = new Mock <IOptionsSnapshot <AppSettings> >();

            appSettingsMock
            .Setup(personSearchOptions =>
                   personSearchOptions.Value
                   )
            .Returns(new AppSettings
            {
                PersonSearchMaxResults = 100
            })
            ;

            var controller =
                new PersonController(
                    databaseContext: databaseContext
                    , appSettings: appSettingsMock.Object
                    )
            ;

            // Act
            var result = await controller.Post(model : testPerson);

            // Assert
            var viewResult = Assert.IsType <OkResult>(result);

            Assert.NotEmpty(databaseContext.PersonSet);
        }
 public PersonController(PersonDatabaseContext context)
 {
     _context = context;
 }