public async Task AddCustomerAsync_WithValidCustomerModel_AddsNewRecordIntoDb()
        {
            // Arrange
            using (var context = await RepositoryTestHelper.GetInMemoryCustomerDbContext("AddTest1Db"))
            {
                var customerRepository = new CustomerRepository(context);
                var newCustomer        = new CustomerModel
                {
                    FirstName   = "Alan",
                    LastName    = "Turing",
                    DateOfBirth = new DateTime(1912, 6, 23)
                };

                var expectedResult = RepositoryTestHelper.GetMockCustomerData()
                                     .ToList();
                expectedResult.Add(new CustomerEntity
                {
                    Id          = 5,
                    FirstName   = newCustomer.FirstName,
                    LastName    = newCustomer.LastName,
                    DateOfBirth = newCustomer.DateOfBirth
                }
                                   );

                // Act
                await customerRepository.AddCustomerAsync(newCustomer);

                var result = await customerRepository.GetAllCustomersAsync();

                // Assert
                result.Should().BeEquivalentTo(expectedResult);
            }
        }
        public async Task GetAllCustomersAsync_Returns_AllCustomersFromDb()
        {
            // Arrange
            using (var context = await RepositoryTestHelper.GetInMemoryCustomerDbContext("GetTest1Db"))
            {
                var customerRepository = new CustomerRepository(context);
                var expectedResult     = RepositoryTestHelper.GetMockCustomerData().ToList();

                //Act
                var result = await customerRepository.GetAllCustomersAsync();

                // Assert
                expectedResult.Should().BeEquivalentTo(result);
            }
        }
        public async Task DeleteCustomerAsync_WithInvalidId_ThrowsCustomerNotFoundException()
        {
            // Arrange
            using (var context = await RepositoryTestHelper.GetInMemoryCustomerDbContext("DeleteTest2Db"))
            {
                var customerRepository = new CustomerRepository(context);
                var expectedResult     = RepositoryTestHelper.GetMockCustomerData().ToList();
                expectedResult.RemoveAt(0);

                // Act
                await customerRepository.DeleteCustomerAsync(1);

                var result = await customerRepository.GetAllCustomersAsync();

                // Assert
                result.Should().BeEquivalentTo(expectedResult);
            }
        }
        public async Task DeleteCustomerAsync_WithValidId_RemovesRecordFromDatabase()
        {
            // Arrange
            using (var context = await RepositoryTestHelper.GetInMemoryCustomerDbContext("DeleteTest1Db"))
            {
                var customerRepository = new CustomerRepository(context);
                var expectedResult     = RepositoryTestHelper.GetMockCustomerData().ToList();
                expectedResult.RemoveAt(0);

                // Act
                Func <Task> act = async() =>
                {
                    await customerRepository.DeleteCustomerAsync(99);
                };
                await customerRepository.DeleteCustomerAsync(1);

                // Assert
                act.Should().Throw <CustomerNotFoundException>();
            }
        }
        private async Task SeedData()
        {
            var testCustomerData = RepositoryTestHelper.GetMockCustomerData();

            using (var client = _webApplicationFactory.CreateClient())
            {
                foreach (var testCustomer in testCustomerData)
                {
                    var validNewCustomer = new CustomerModel
                    {
                        FirstName   = testCustomer.FirstName,
                        LastName    = testCustomer.LastName,
                        DateOfBirth = testCustomer.DateOfBirth
                    };
                    var validPostContent = new StringContent(
                        JsonSerializer.Serialize(validNewCustomer),
                        Encoding.UTF8,
                        "application/json"
                        );
                    await client.PostAsync("/customers", validPostContent);
                }
            }
        }