// TODO: Identify the better approach - to pass in the logger factory OR the typed logger
 public CachingTenantResolver(
     JobAssistantContext context, IMemoryCache cache, ILoggerFactory loggerFactory)
     : base(cache, loggerFactory)
 {
     _context = context;
     _logger  = loggerFactory.CreateLogger <CachingTenantResolver>();
 }
Beispiel #2
0
        public async void PageJobResultsTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var repositoryUnderTest = new Repository(context);

                await repositoryUnderTest.Create(new Job { JobId = 11001, Name = "Job Name " + 11001 });

                var mySecondJob = new Job {
                    JobId = 12001, Name = "Job Name " + 12001
                };
                await repositoryUnderTest.Create(mySecondJob);

                await repositoryUnderTest.Create(new Job { JobId = 13001, Name = "Job Name " + 13001 });

                var myFourthJob = new Job {
                    JobId = 14001, Name = "Job Name " + 14001
                };
                await repositoryUnderTest.Create(myFourthJob);

                await repositoryUnderTest.Create(new Job { JobId = 15001, Name = "Job Name " + 15001 });

                int total;
                var jobs = repositoryUnderTest.Filter(Job.IsValid(), out total, 1, 2);
                Assert.True(total == 2);
                Assert.True((from j in jobs where j.JobId == 14001 select j).Count() == 1);
            }
        }
        public void VerifyDatabaseInsertOfJobWithPowerToolsTenant()
        {
            var helper   = new TestContextHelper("test_in-memory_DB-" + RandomNumberHelper.NextInteger());
            var context  = new JobAssistantContext(helper.Options);
            var ptDomain = new Tenant {
                DomainId = "Power Tools"
            };

            context.Tenants.Add(ptDomain);

            var grindJob = new Job
            {
                Name     = "Grind",
                DomainId = ptDomain.DomainId
            };

            Assert.True(grindJob.JobId == 0);
            context.Jobs.Add(grindJob);
            var efDefaultId = grindJob.JobId; // Temporarily assigned by EF

            Assert.True(efDefaultId > 0);
            var savedCount = context.SaveChanges();

            Assert.True(savedCount == 2);
            Assert.True(grindJob.JobId > 0); // New id is likely different than temporary id assigned above
        }
        public async void RepositoryCreateDeleteCategories()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var repositoryUnderTest = new Repository(context);
                int firstId             = RandomNumberHelper.NextInteger();
                var firstCategory       = await repositoryUnderTest.Create <Category>(new Category { CategoryId = firstId, Name = "Test Category " + firstId }); // Was .Result

                int secondId       = RandomNumberHelper.NextInteger();
                var secondCategory = await repositoryUnderTest.Create <Category>(new Category { CategoryId = secondId, Name = "Test Category " + secondId }); // Was .Result

                Assert.Equal("Test Category " + firstId, context.Categories.Single(c => c.CategoryId == firstId).Name);
                Assert.Equal("Test Category " + secondId, context.Categories.Single(c => c.CategoryId == secondId).Name);

                await repositoryUnderTest.Delete <Category>(firstCategory);

                var verifyCategory = repositoryUnderTest.Single <Category>(c => c.CategoryId == firstCategory.CategoryId);
                Assert.Null(verifyCategory);

                await repositoryUnderTest.Delete <Category>(secondCategory);

                verifyCategory = repositoryUnderTest.Single <Category>(c => c.CategoryId == secondCategory.CategoryId);
                Assert.Null(verifyCategory);
            }
        }
        public async void RepositoryCreateCategoryAndJobTest()
        {
            int nextId = RandomNumberHelper.NextInteger();

            using (var context = new JobAssistantContext(helper.Options)) {
                var category = new Category {
                    CategoryId = nextId, Name = "Test Category " + nextId
                };
                var job = new Job {
                    JobId = nextId, Name = "Test Job " + nextId
                };
                category.Jobs = new List <Job>();
                category.Jobs.Add(job);

                var repositoryUnderTest = new Repository(context);
                await repositoryUnderTest.Create <Category>(category);
            }

            using (var context = new JobAssistantContext(helper.Options)) {
                var repositoryUnderTest = new Repository(context);
                var parentCategory      = repositoryUnderTest.All <Category>().Include(c => c.Jobs).Single(c => c.CategoryId == nextId);
                Assert.NotNull(parentCategory);
                Assert.NotNull(parentCategory.Jobs);
                Assert.Equal(1, parentCategory.Jobs.Count);
                var childJob = parentCategory.Jobs.Single(j => j.JobId == nextId);
                Assert.Equal("Test Job " + nextId, childJob.Name);
                context.Remove(parentCategory);
                context.SaveChanges();
                var hasCategory = context.Categories.Any(c => c.CategoryId == nextId);
                Assert.False(hasCategory);
            }
        }
 public void VerifyCategoryToCategoryRelationshipTest()
 {
     // Categories -> Category
     using (var context = new JobAssistantContext(_helper.Options))
     {
         var firstCategory = context.Categories.Include(c => c.Categories).First();
         Assert.NotNull(firstCategory);
         Assert.True(firstCategory.CategoryId > 0);
     }
 }
Beispiel #7
0
        public void VerifyFirstMaterialAndFirstAssociatedChildToolTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var firstMaterial = context.Materials.First();
                Assert.NotNull(firstMaterial);

                var firstTool = context.Tools.First();
                Assert.NotNull(firstTool);
            }
        }
Beispiel #8
0
 public void VerifyMaterialToApplicationsRelationshipsTest()
 {
     using (var context = new JobAssistantContext(_helper.Options))
     {
         var laminatedWoodMaterial = (from hta in context.Materials.Include(m => m.Applications).Include(a => a.Applications)
                                      where hta.MaterialId == 122
                                      select hta).First();
         Assert.True(laminatedWoodMaterial.Applications.Count == 3);
         var hasMediumTorqueApplication = (from a in laminatedWoodMaterial.Applications where a.Name == "Medium Torque Drive & Fasten" select a).Count();
         Assert.True(hasMediumTorqueApplication == 1);
     }
 }
Beispiel #9
0
        public void CacheTenantSetupAndGetProperties()
        {
            var          dbId       = RandomNumberHelper.NextInteger();
            var          helper     = new TestContextHelper("test_in-memory_DB-" + dbId);
            var          context    = new JobAssistantContext(helper.Options);
            IMemoryCache cache      = new MemoryCache(new MemoryCacheOptions());
            var          resolver   = new CachingTenantResolver(context, cache, _loggerFactory);
            var          properties = resolver.GetProps();

            Assert.NotNull(properties);
            Assert.Empty(properties);
        }
Beispiel #10
0
        public async void AddCategoryJobMaterialToolAndQueryTest()
        {
            var nextId = RandomNumberHelper.NextInteger();

            var parentCategory = new Category
            {
                CategoryId = nextId,
                Jobs       = new List <Job>()
            };

            var job = new Job {
                JobId = nextId, Name = "Test Job " + nextId
            };

            var material = new Material
            {
                MaterialId = nextId,
                Name       = "Test Material " + nextId,
                Tools      = new List <Tool> {
                    new Tool {
                        ToolId = nextId, Name = "Test Tool " + nextId
                    }
                }
            };

            job.Materials = new List <Material> {
                material
            };

            parentCategory.Jobs.Add(job);

            var helper = new TestContextHelper("test_in-memory_DB-" + RandomNumberHelper.NextInteger());

            using (var otherContext = new JobAssistantContext(helper.Options))
            {
                var repositoryUnderCreateTest = new Repository(otherContext);
                await repositoryUnderCreateTest.Create <Category>(parentCategory);

                await repositoryUnderCreateTest.SaveChanges();

                var repositoryUnderQueryTest = new Repository(otherContext);
                var myJob = repositoryUnderQueryTest.All <Category>().Include(c => c.Jobs).ThenInclude(m => m.Materials)
                            .ThenInclude(t => t.Tools).Single(c => c.CategoryId == nextId).Jobs.Single(j => j.JobId == nextId);
                Assert.Equal("Test Job " + nextId, myJob.Name);

                var associatedTool = material.Tools.First();
                Assert.NotNull(associatedTool);
                Assert.Equal(nextId, associatedTool.ToolId);

                repositoryUnderCreateTest.Dispose();
                repositoryUnderQueryTest.Dispose();
            }
        }
 public void VerifyJobToMaterialsRelationshipsTest()
 {
     using (var context = new JobAssistantContext(_helper.Options))
     {
         var hammerAndHammerDrilJob = (from hammerJob in context.Jobs.Include(j => j.Materials)
                                       where hammerJob.Name.Equals("Hammer & Hammer Drill")
                                       select hammerJob).First();
         Assert.True(hammerAndHammerDrilJob.Materials.Count == 9);
         var hasMediumToqrueApplication = (from m in hammerAndHammerDrilJob.Materials where m.Name == "Plywood" select m).Count();
         Assert.True(hasMediumToqrueApplication == 1);
     }
 }
Beispiel #12
0
        public TradeRelationshipTests()
        {
            /**
             * This constructor is executed prior to each [Fact]-based unit test method.
             * Considering this, a seperate NAMED in-memory DB is initialized.
             */
            var dbId = RandomNumberHelper.NextInteger();

            _helper = new TestContextHelper("test_in-memory_DB-" + dbId);
            var context = new JobAssistantContext(_helper.Options);

            SampleBoschToolsDataSet.SeedBoschToolTradesGraphData(context);
        }
Beispiel #13
0
        public void VerifyTradeToCategoryRelationshipTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var firstTrade = context.Trades.Include(t => t.Categories).First();
                Assert.NotNull(firstTrade);
                Assert.True(firstTrade.TradeId > 0);

                var associatedCategory = firstTrade.Categories.First();
                Assert.NotNull(associatedCategory);
                Assert.True(associatedCategory.CategoryId > 0);
            }
        }
        public DatabaseSetupTestFixture()
        {
            var helper = new TestContextHelper("test" /* prod (or not "test" string */);

            databaseContext = new JobAssistantContext(helper.Options);
            try
            {
                databaseContext.Database.EnsureCreated();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception thrown during database schema creation: " + e);
            }
        }
Beispiel #15
0
        public async void RepositoryCreateJobTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var nextId = RandomNumberHelper.NextInteger();
                var repositoryUnderTest = new Repository(context);
                var myJob = new Job {
                    JobId = nextId, Name = "Job Name " + nextId
                };
                await repositoryUnderTest.Create(myJob);

                var verifyJob = repositoryUnderTest.Single <Job>(j => j.JobId == nextId);
                Assert.NotNull(verifyJob);
            }
        }
        public async void RepositoryCreateTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                int nextId = RandomNumberHelper.NextInteger();
                var repositoryUnderTest = new Repository(context);

                var newCategory = repositoryUnderTest.Create <Category>(new Category {
                    CategoryId = nextId, Name = "Test Category " + nextId
                }).Result;
                Assert.Equal("Test Category " + nextId, context.Categories.Single(c => c.CategoryId == nextId).Name);
                await repositoryUnderTest.Delete <Category>(newCategory);

                var verifyJob = repositoryUnderTest.Single <Category>(c => c.CategoryId == nextId);
                Assert.Null(verifyJob);
            }
        }
Beispiel #17
0
        public ApplicationRelationshipTests()
        {
            /**
             * This constructor is executed prior to each [Fact]-based unit test method.
             * Considering this, a seperate NAMED in-memory DB is initialized.
             */
            var dbId = RandomNumberHelper.NextInteger();

            _helper  = new TestContextHelper("test_in-memory_DB-" + dbId);
            _context = new JobAssistantContext(_helper.Options);

            /**
             *  Add sample data with ToolsSampleData.SeedBoschToolsGraphData(_context);
             *  or using the subset with SeedBoschToolsSubsetData(_context).
             */
            SampleBoschToolsDataSet.SeedBoschToolsSubsetData(_context);
        }
        public void LoadGraphAndVerifyFirstJobFirstMaterialAndFirstToolTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var firstJob = context.Jobs.First();
                Assert.NotNull(firstJob);
                Assert.Equal(1, firstJob.JobId);

                var firstMaterial = context.Materials.First();
                Assert.NotNull(firstMaterial);
                Assert.True(firstMaterial.MaterialId > 0);

                var firstTool = context.Tools.First();
                Assert.NotNull(firstTool);
                Assert.True(firstTool.ToolId > 0);
            }
        }
        public void EraseAllData()
        {
            var helper = new DbSchemaContextHelper("prod");

            DatabaseContext = new JobAssistantContext(helper.Options);
            try
            {
                DatabaseContext.Database.ExecuteSqlCommand(
                    "DELETE FROM Accessories; DELETE FROM Tools; DELETE FROM Applications; DELETE FROM Materials; DELETE FROM Jobs; DELETE FROM Categories; DELETE FROM Trades;");
                _logger.LogInformation(
                    "Successfully erased ALL data from tables: 'Accessories', 'Tools', 'Applications', 'Materials', 'Jobs', 'Categories', 'Trades'");
            }
            catch (Exception exception)
            {
                _logger.LogError("Exception thrown during execution of SQL DELETE FROM: " + exception);
            }
        }
Beispiel #20
0
        public void VerifyDatabaseInsertOfNewApplication()
        {
            var helper      = new TestContextHelper("test_in-memory_DB-" + RandomNumberHelper.NextInteger());
            var context     = new JobAssistantContext(helper.Options);
            var application = new Application {
                Name = "Level"
            };

            Assert.True(application.ApplicationId == 0);
            context.Applications.Add(application);
            var efDefaultId = application.ApplicationId;

            Assert.True(efDefaultId > 0);
            var savedCount = context.SaveChanges();

            Assert.True(savedCount == 1);
            Assert.True(application.ApplicationId > 0);
        }
 public void CreateSchema()
 {
     using (_logger.BeginScope(typeof(DbSchemaManager)))
     {
         var helper = new DbSchemaContextHelper("prod" /* production database instance */);
         DatabaseContext = new JobAssistantContext(helper.Options);
         try
         {
             DatabaseContext.Database.EnsureCreated();
             _logger.LogInformation("Successfully created table-based database schema for DB: {0}",
                                    DatabaseContext.Database.GetDbConnection().Database);
         }
         catch (Exception e)
         {
             _logger.LogError("Exception thrown during database schema creation: " + e);
         }
     }
 }
        public void VerifyDatabaseInsertOfNewTrade()
        {
            var helper    = new TestContextHelper("test_in-memory_DB-" + RandomNumberHelper.NextInteger());
            var context   = new JobAssistantContext(helper.Options);
            var autoTrade = new Trade {
                Name = "Automotive and Other Vehicle Maintenance"
            };

            Assert.True(autoTrade.TradeId == 0);
            context.Trades.Add(autoTrade);
            var efDefaultId = autoTrade.TradeId;

            Assert.True(efDefaultId > 0);
            var savedCount = context.SaveChanges();

            Assert.True(savedCount == 1);
            Assert.True(autoTrade.TradeId > 0);
        }
Beispiel #23
0
        public void AddAndUpdateMaterialsWithJobsDbSetQueryTest()
        {
            var nextId = RandomNumberHelper.NextInteger();

            var parentCategory = new Category();

            parentCategory.CategoryId = nextId;
            parentCategory.Name       = "Test Category " + nextId;
            parentCategory.Jobs       = new List <Job>();

            var job = new Job {
                JobId = nextId, Name = "Test Job " + nextId
            };

            var material = new Material {
                MaterialId = nextId, Name = "Test Material " + nextId
            };

            job.Materials = new List <Material>();
            job.Materials.Add(material);

            parentCategory.Jobs.Add(job);

            var helper = new TestContextHelper("test_in-memory_DB-" + RandomNumberHelper.NextInteger());

            using (var saveContext = new JobAssistantContext(helper.Options))
            {
                saveContext.Add(parentCategory);
                var entitiesPeristed = saveContext.SaveChanges();
                Assert.Equal(3, entitiesPeristed); // Expect 3 because a category, job and material are being persisted.
            }

            using (var queryContext = new JobAssistantContext(helper.Options))
            {
                var myJob = queryContext.Jobs.Include(j => j.Materials).Single(j => j.JobId == nextId);
                Assert.Equal("Test Job " + nextId, myJob.Name);
                Assert.True(myJob.Materials.Count == 1);
                var someMaterial = queryContext.Materials.Single(m => m.MaterialId == nextId);
                Assert.Equal("Test Material " + nextId, someMaterial.Name);
                var expectedCategoryName = "Test Category " + nextId;
                var topCategory          = queryContext.Categories.Single(c => c.CategoryId == nextId);
                Assert.Equal(expectedCategoryName, topCategory.Name);
            }
        }
        public void VerifyDatabaseInsertOfCategory()
        {
            var helper  = new TestContextHelper("test_in-memory_DB-" + RandomNumberHelper.NextInteger());
            var context = new JobAssistantContext(helper.Options);
            var dremelMultiPurposeCategory = new Category()
            {
                Name = "Multi-Purpose"
            };

            Assert.True(dremelMultiPurposeCategory.CategoryId == 0);
            context.Categories.Add(dremelMultiPurposeCategory);
            var efDefaultId = dremelMultiPurposeCategory.CategoryId; // Temporarily assigned by EF

            Assert.True(efDefaultId > 0);
            int savedCount = context.SaveChanges();

            Assert.True(savedCount == 1);
            Assert.True(dremelMultiPurposeCategory.CategoryId > 0); // New id is likely different than temporary id assigned above
        }
        public void DropSchema()
        {
            var helper = new DbSchemaContextHelper("prod");

            DatabaseContext = new JobAssistantContext(helper.Options);
            try
            {
                DatabaseContext.Database.EnsureDeleted();
                _logger.LogInformation("Successfully dropped or deleted schema via EF API mechanism: {0}.",
                                       DatabaseContext.Database.GetDbConnection().Database);
            }
            catch (MySqlException sqlException)
            {
                _logger.LogError("Exception thrown during MySQL database schema drop or delete: " + sqlException);
            }
            catch (Exception e)
            {
                _logger.LogError("Exception thrown during database schema delete step: " + e);
            }
        }
 public void VerifyTradeToCategoryToToolRelationshipsTest()
 {
     // Trades => Categories -> Tools
     using (var context = new JobAssistantContext(_helper.Options))
     {
         var trades     = context.Trades.Include(t => t.Categories).ThenInclude(c => c.Categories).ToList();
         var firstTrade = trades.First();
         // TODO: Find a better way to trigger tools to be load. Namely, ThenInclude().
         // However, doing an Include() followed by a ToList() was a way to satisfy the test.
         // Possibly there is an issue with how ThenInclude() behaves when used with UseInMemoryDatabase().
         // See https://docs.microsoft.com/en-us/ef/core/querying/related-data for details.
         var alsoTools = context.Categories.Include(c => c.Tools).ToList();
         Assert.True(alsoTools.Count > 0);
         var firstCategory = firstTrade.Categories.First();
         Assert.NotNull(firstCategory);
         Assert.True(firstCategory.CategoryId > 0);
         var firstTool = firstCategory.Tools.First();
         Assert.True(firstTool.ToolId > 0);
     }
 }
        public void TraversalOfJobsMaterialsApplicationsThenTools()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                SampleBoschToolsDataSet.SeedBoschToolsSubsetData(context);

                var repositoryUnderTest = new Repository(context);
                // PC: forward load all objects, OR, investigate if you can load per-level (and more on de-mand)
                var jobs = repositoryUnderTest.All <Job>().Include(j => j.Materials).ThenInclude(m => m.Applications)
                           .ThenInclude(a => a.ToolRelationships);
                Assert.NotNull(jobs);
                Assert.NotEmpty(jobs);

                var jobEnumerator = jobs.GetEnumerator();
                jobEnumerator.MoveNext();
                var firstjob = jobEnumerator.Current;
                Assert.NotNull(firstjob);

                // PC: Pick a material, then get a list of applications
                Debug.Assert(firstjob.Materials != null, "firstjob.Materials != null");
                var materialEnumerator = firstjob.Materials.GetEnumerator();
                materialEnumerator.MoveNext();
                var firstMaterial = materialEnumerator.Current;
                Assert.NotNull(firstMaterial);
                materialEnumerator.Dispose();

                // PC: Pick an Application, then get a list of tools
                var applicationEnumerator = firstMaterial.Applications.GetEnumerator();
                applicationEnumerator.MoveNext();
                var firstApplication = applicationEnumerator.Current;
                Assert.NotNull(firstApplication);
                applicationEnumerator.Dispose();

                // PC: Read the tool details, then assert
                var toolsEnumerator = firstApplication.ToolRelationships.GetEnumerator();
                toolsEnumerator.MoveNext();
                var firstTool = toolsEnumerator.Current;
                Assert.NotNull(firstTool);
                toolsEnumerator.Dispose();
            }
        }
Beispiel #28
0
        public async void MultiPageJobResultsTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var repositoryUnderTest = new Repository(context);

                for (var testId = 30000; testId < 30300; testId++)
                {
                    await repositoryUnderTest.Create(new Job { JobId = testId, Name = "Job Name " + testId });
                }

                int total;
                var pagedJobs = repositoryUnderTest.Filter(Job.IsValid(), out total, 1, 40);
                Assert.NotEmpty(pagedJobs);
                Assert.True(total == 40);

                pagedJobs = repositoryUnderTest.Filter(Job.IsValid(), out total, 3, 40);
                Assert.NotEmpty(pagedJobs);
                Assert.True(total == 40);
            }
        }
Beispiel #29
0
        public async void RepositoryUpdateJobTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                var repositoryUnderTest = new Repository(context);
                var nextId = RandomNumberHelper.NextInteger();
                var myJob  = new Job {
                    JobId = nextId, Name = "Job Name " + nextId
                };
                await repositoryUnderTest.Create(myJob);

                var jobName = "Updated Job Name " + nextId;
                myJob.Name = jobName;
                var updateCount = await repositoryUnderTest.Update(myJob);

                Assert.True(updateCount == 1);
                var verifyJob = repositoryUnderTest.Single <Job>(j => j.JobId == nextId);
                Assert.NotNull(verifyJob);
                Assert.Equal(jobName, verifyJob.Name);
            }
        }
        public async void RepositoryCreateTest()
        {
            using (var context = new JobAssistantContext(_helper.Options))
            {
                int nextId = RandomNumberHelper.NextInteger();
                var repositoryUnderTest = new Repository(context);

                var newTool = new Tool()
                {
                    ToolId      = nextId,
                    Name        = "RH850VC 1 - 7 / 8 In.SDS - max® Rotary Hammer",
                    ModelNumber = "RH850VC"
                };
                await repositoryUnderTest.Create(newTool);

                Assert.Equal("RH850VC 1 - 7 / 8 In.SDS - max® Rotary Hammer", context.Tools.Single(t => t.ToolId == nextId).Name);
                await repositoryUnderTest.Delete(newTool);

                var verifiedTool = repositoryUnderTest.Single <Tool>(c => c.ToolId == nextId);
                Assert.Null(verifiedTool);
            }
        }