예제 #1
0
        public void GetVet_ParametersMatchExpectedValues()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var fakeVet = new FakeVet {
            }.Generate();

            //Act
            using (var context = new VetClinicDbContext(dbOptions))
            {
                context.Vets.AddRange(fakeVet);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                //Assert
                var vetById = service.GetVet(fakeVet.VetId);
                vetById.VetId.Should().Be(fakeVet.VetId);
                vetById.Name.Should().Be(fakeVet.Name);
                vetById.Capacity.Should().Be(fakeVet.Capacity);
                vetById.OpenDate.Should().Be(fakeVet.OpenDate);
                vetById.HasSpayNeuter.Should().Be(fakeVet.HasSpayNeuter);
            }
        }
예제 #2
0
        public async void GetVetsAsync_ListOpenDateSortedInDescOrder()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var currentUser = new Mock <ICurrentUserService>();

            currentUser.SetupGet(c => c.UserId).Returns("testuser");
            var currentUserService = currentUser.Object;

            var fakeVetOne = new FakeVet {
            }.Generate();

            fakeVetOne.OpenDate = DateTime.Now.AddDays(2);

            var fakeVetTwo = new FakeVet {
            }.Generate();

            fakeVetTwo.OpenDate = DateTime.Now.AddDays(1);

            var fakeVetThree = new FakeVet {
            }.Generate();

            fakeVetThree.OpenDate = DateTime.Now.AddDays(3);

            //Act
            using (var context = new VetClinicDbContext(dbOptions, currentUserService, new DateTimeService()))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                var vetRepo = await service.GetVetsAsync(new VetParametersDto { SortOrder = "-OpenDate" });

                //Assert
                vetRepo.Should()
                .ContainInOrder(fakeVetThree, fakeVetOne, fakeVetTwo);

                context.Database.EnsureDeleted();
            }
        }
예제 #3
0
        public async void GetVetsAsync_FilterHasSpayNeuterListWithExact()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var currentUser = new Mock <ICurrentUserService>();

            currentUser.SetupGet(c => c.UserId).Returns("testuser");
            var currentUserService = currentUser.Object;

            var fakeVetOne = new FakeVet {
            }.Generate();

            fakeVetOne.HasSpayNeuter = false;

            var fakeVetTwo = new FakeVet {
            }.Generate();

            fakeVetTwo.HasSpayNeuter = true;

            var fakeVetThree = new FakeVet {
            }.Generate();

            fakeVetThree.HasSpayNeuter = false;

            //Act
            using (var context = new VetClinicDbContext(dbOptions, currentUserService, new DateTimeService()))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                var vetRepo = await service.GetVetsAsync(new VetParametersDto { Filters = $"HasSpayNeuter == true" });

                //Assert
                vetRepo.Should()
                .HaveCount(1);

                context.Database.EnsureDeleted();
            }
        }
예제 #4
0
        public void DeleteVet_ReturnsProperCount()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var currentUser = new Mock <ICurrentUserService>();

            currentUser.SetupGet(c => c.UserId).Returns("testuser");
            var currentUserService = currentUser.Object;

            var fakeVetOne = new FakeVet {
            }.Generate();
            var fakeVetTwo = new FakeVet {
            }.Generate();
            var fakeVetThree = new FakeVet {
            }.Generate();

            //Act
            using (var context = new VetClinicDbContext(dbOptions, currentUserService, new DateTimeService()))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));
                service.DeleteVet(fakeVetTwo);

                context.SaveChanges();

                //Assert
                var vetList = context.Vets.ToList();

                vetList.Should()
                .NotBeEmpty()
                .And.HaveCount(2);

                vetList.Should().ContainEquivalentOf(fakeVetOne);
                vetList.Should().ContainEquivalentOf(fakeVetThree);
                Assert.DoesNotContain(vetList, v => v == fakeVetTwo);

                context.Database.EnsureDeleted();
            }
        }
예제 #5
0
        public async void GetVetsAsync_CountMatchesAndContainsEquivalentObjects()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var currentUser = new Mock <ICurrentUserService>();

            currentUser.SetupGet(c => c.UserId).Returns("testuser");
            var currentUserService = currentUser.Object;

            var fakeVetOne = new FakeVet {
            }.Generate();
            var fakeVetTwo = new FakeVet {
            }.Generate();
            var fakeVetThree = new FakeVet {
            }.Generate();

            //Act
            using (var context = new VetClinicDbContext(dbOptions, currentUserService, new DateTimeService()))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                var vetRepo = await service.GetVetsAsync(new VetParametersDto());

                //Assert
                vetRepo.Should()
                .NotBeEmpty()
                .And.HaveCount(3);

                vetRepo.Should().ContainEquivalentOf(fakeVetOne);
                vetRepo.Should().ContainEquivalentOf(fakeVetTwo);
                vetRepo.Should().ContainEquivalentOf(fakeVetThree);

                context.Database.EnsureDeleted();
            }
        }
예제 #6
0
        public async void GetVetsAsync_ReturnExpectedPageSize()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var fakeVetOne = new FakeVet {
            }.Generate();
            var fakeVetTwo = new FakeVet {
            }.Generate();
            var fakeVetThree = new FakeVet {
            }.Generate();

            // need id's due to default sorting
            fakeVetOne.VetId   = 1;
            fakeVetTwo.VetId   = 2;
            fakeVetThree.VetId = 3;

            //Act
            using (var context = new VetClinicDbContext(dbOptions))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                var vetRepo = await service.GetVetsAsync(new VetParametersDto { PageSize = 2 });

                //Assert
                vetRepo.Should()
                .NotBeEmpty()
                .And.HaveCount(2);

                vetRepo.Should().ContainEquivalentOf(fakeVetOne);
                vetRepo.Should().ContainEquivalentOf(fakeVetTwo);

                context.Database.EnsureDeleted();
            }
        }
예제 #7
0
        public async void GetVetsAsync_FilterOpenDateListWithExact()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var fakeVetOne = new FakeVet {
            }.Generate();

            fakeVetOne.OpenDate = DateTime.Now.AddDays(1);

            var fakeVetTwo = new FakeVet {
            }.Generate();

            fakeVetTwo.OpenDate = DateTime.Parse(DateTime.Now.AddDays(2).ToString("MM/dd/yyyy"));

            var fakeVetThree = new FakeVet {
            }.Generate();

            fakeVetThree.OpenDate = DateTime.Now.AddDays(3);

            //Act
            using (var context = new VetClinicDbContext(dbOptions))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                var vetRepo = await service.GetVetsAsync(new VetParametersDto { Filters = $"OpenDate == {fakeVetTwo.OpenDate}" });

                //Assert
                vetRepo.Should()
                .HaveCount(1);

                context.Database.EnsureDeleted();
            }
        }
예제 #8
0
        public async void GetVetsAsync_ListCapacitySortedInDescOrder()
        {
            //Arrange
            var dbOptions = new DbContextOptionsBuilder <VetClinicDbContext>()
                            .UseInMemoryDatabase(databaseName: $"VetDb{Guid.NewGuid()}")
                            .Options;
            var sieveOptions = Options.Create(new SieveOptions());

            var fakeVetOne = new FakeVet {
            }.Generate();

            fakeVetOne.Capacity = 2;

            var fakeVetTwo = new FakeVet {
            }.Generate();

            fakeVetTwo.Capacity = 1;

            var fakeVetThree = new FakeVet {
            }.Generate();

            fakeVetThree.Capacity = 3;

            //Act
            using (var context = new VetClinicDbContext(dbOptions))
            {
                context.Vets.AddRange(fakeVetOne, fakeVetTwo, fakeVetThree);
                context.SaveChanges();

                var service = new VetRepository(context, new SieveProcessor(sieveOptions));

                var vetRepo = await service.GetVetsAsync(new VetParametersDto { SortOrder = "-Capacity" });

                //Assert
                vetRepo.Should()
                .ContainInOrder(fakeVetThree, fakeVetOne, fakeVetTwo);

                context.Database.EnsureDeleted();
            }
        }
예제 #9
0
        public async Task GetVets_ReturnsSuccessCodeAndResourceWithAccurateFields()
        {
            var fakeVetOne = new FakeVet {
            }.Generate();
            var fakeVetTwo = new FakeVet {
            }.Generate();

            var appFactory = _factory;

            using (var scope = appFactory.Services.CreateScope())
            {
                var context = scope.ServiceProvider.GetRequiredService <VetClinicDbContext>();
                context.Database.EnsureCreated();

                //context.Vets.RemoveRange(context.Vets);
                context.Vets.AddRange(fakeVetOne, fakeVetTwo);
                context.SaveChanges();
            }

            var client = appFactory.CreateClient(new WebApplicationFactoryClientOptions
            {
                AllowAutoRedirect = false
            });

            var result = await client.GetAsync("api/Vets")
                         .ConfigureAwait(false);

            var responseContent = await result.Content.ReadAsStringAsync()
                                  .ConfigureAwait(false);

            var response = JsonConvert.DeserializeObject <IEnumerable <VetDto> >(responseContent);

            // Assert
            result.StatusCode.Should().Be(200);
            response.Should().ContainEquivalentOf(fakeVetOne, options =>
                                                  options.ExcludingMissingMembers());
            response.Should().ContainEquivalentOf(fakeVetTwo, options =>
                                                  options.ExcludingMissingMembers());
        }
예제 #10
0
        public async Task PatchVet204AndFieldsWereSuccessfullyUpdated()
        {
            //Arrange
            var mapper = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile <VetProfile>();
            }).CreateMapper();

            var lookupVal = "Easily Identified Value For Test"; // don't know the id at this scope, so need to have another value to lookup
            var fakeVetOne = new FakeVet {
            }.Generate();

            var expectedFinalObject = mapper.Map <VetDto>(fakeVetOne);

            expectedFinalObject.Name = lookupVal;

            var appFactory = _factory;

            using (var scope = appFactory.Services.CreateScope())
            {
                var context = scope.ServiceProvider.GetRequiredService <VetClinicDbContext> ();
                context.Database.EnsureCreated();

                context.Vets.RemoveRange(context.Vets);
                context.Vets.AddRange(fakeVetOne);
                context.SaveChanges();
            }

            var client = appFactory.CreateClient(new WebApplicationFactoryClientOptions
            {
                AllowAutoRedirect = false
            });

            var patchDoc = new JsonPatchDocument <VetForUpdateDto>();

            patchDoc.Replace(v => v.Name, lookupVal);
            var serializedVetToUpdate = JsonConvert.SerializeObject(patchDoc);

            // Act
            // get the value i want to update. assumes I can use sieve for this field. if this is not an option, just use something else
            var getResult = await client.GetAsync($"api/Vets/?filters=Name=={fakeVetOne.Name}")
                            .ConfigureAwait(false);

            var getResponseContent = await getResult.Content.ReadAsStringAsync()
                                     .ConfigureAwait(false);

            var getResponse = JsonConvert.DeserializeObject <Response <IEnumerable <VetDto> > >(getResponseContent);
            var id          = getResponse.Data.FirstOrDefault().VetId;

            // patch it
            var method       = new HttpMethod("PATCH");
            var patchRequest = new HttpRequestMessage(method, $"api/Vets/{id}")
            {
                Content = new StringContent(serializedVetToUpdate,
                                            Encoding.Unicode, "application/json")
            };
            var patchResult = await client.SendAsync(patchRequest)
                              .ConfigureAwait(false);

            // get it again to confirm updates
            var checkResult = await client.GetAsync($"api/Vets/{id}")
                              .ConfigureAwait(false);

            var checkResponseContent = await checkResult.Content.ReadAsStringAsync()
                                       .ConfigureAwait(false);

            var checkResponse = JsonConvert.DeserializeObject <Response <VetDto> >(checkResponseContent);

            // Assert
            patchResult.StatusCode.Should().Be(204);
            checkResponse.Should().BeEquivalentTo(expectedFinalObject, options =>
                                                  options.ExcludingMissingMembers());
        }
예제 #11
0
        public async Task PutVetReturnsBodyAndFieldsWereSuccessfullyUpdated()
        {
            //Arrange
            var mapper = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile <VetProfile>();
            }).CreateMapper();

            var fakeVetOne = new FakeVet {
            }.Generate();
            var expectedFinalObject = mapper.Map <VetDto>(fakeVetOne);

            expectedFinalObject.Name = "Easily Identified Value For Test";

            var appFactory = _factory;

            using (var scope = appFactory.Services.CreateScope())
            {
                var context = scope.ServiceProvider.GetRequiredService <VetClinicDbContext> ();
                context.Database.EnsureCreated();

                context.Vets.RemoveRange(context.Vets);
                context.Vets.AddRange(fakeVetOne);
                context.SaveChanges();
            }

            var client = appFactory.CreateClient(new WebApplicationFactoryClientOptions
            {
                AllowAutoRedirect = false
            });

            var serializedVetToUpdate = JsonConvert.SerializeObject(expectedFinalObject);

            // Act
            // get the value i want to update. assumes I can use sieve for this field. if this is not an option, just use something else
            var getResult = await client.GetAsync($"api/Vets/?filters=Name=={fakeVetOne.Name}")
                            .ConfigureAwait(false);

            var getResponseContent = await getResult.Content.ReadAsStringAsync()
                                     .ConfigureAwait(false);

            var getResponse = JsonConvert.DeserializeObject <Response <IEnumerable <VetDto> > >(getResponseContent);
            var id          = getResponse.Data.FirstOrDefault().VetId;

            // put it
            var patchResult = await client.PutAsJsonAsync($"api/Vets/{id}", expectedFinalObject)
                              .ConfigureAwait(false);

            // get it again to confirm updates
            var checkResult = await client.GetAsync($"api/Vets/{id}")
                              .ConfigureAwait(false);

            var checkResponseContent = await checkResult.Content.ReadAsStringAsync()
                                       .ConfigureAwait(false);

            var checkResponse = JsonConvert.DeserializeObject <Response <VetDto> >(checkResponseContent);

            // Assert
            patchResult.StatusCode.Should().Be(204);
            checkResponse.Should().BeEquivalentTo(expectedFinalObject, options =>
                                                  options.ExcludingMissingMembers());
        }