// 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>(); }
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); } }
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); } }
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); } }
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); }
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); } }
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); }
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); } }
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); } }
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); } }
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); }
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(); } }
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); } }
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); } }