using Microsoft.EntityFrameworkCore; using Strata.ContinuousImprovement.Biz.ClientWarehouses; using Strata.ContinuousImprovement.Biz.Dtos; using Strata.ContinuousImprovement.Biz.GMDN; using Strata.ContinuousImprovement.Biz.Network; using Strata.ContinuousImprovement.Biz.OpportunityComments; using Strata.ContinuousImprovement.Biz.OpportunityTypeWorkbooks; using Strata.ContinuousImprovement.Biz.OpportunityWorkbooks; using Strata.ContinuousImprovement.Biz.Population; using Strata.ContinuousImprovement.Biz.StrategicOpportunities; using Strata.ContinuousImprovement.Biz.Test.Unit.Utilities; using System.Diagnostics.CodeAnalysis; namespace Strata.ContinuousImprovement.Biz.Test.Integration.CentralDbIntegrationTests { [ExcludeFromCodeCoverage] [TestFixture, Category("Integration"), Category("CCI")] public class TestCentralDbOrm : IntegrationTestBase { public async Task TestGeneric(TestContext testContext) where T : class { try { var testName = testContext.TestName(typeof(T).Name); var dbSet = ((DbContext)CentralDbContext).Set(); var count = await dbSet.CountAsync(CancellationToken.None); Assert.That(count, Is.GreaterThanOrEqualTo(0)); if (count == 0) { if (Activator.CreateInstance(typeof(T)) is T obj) { await dbSet.AddAsync(obj, CancellationToken.None); await ((DbContext)CentralDbContext).SaveChangesAsync(CancellationToken.None); } } var result = await dbSet.FirstOrDefaultAsync(CancellationToken.None); Assert.That(result, Is.Not.Null.And.InstanceOf()); } catch { // ILB } } public async Task TestFirst(TestContext testContext) where T : class { try { var testName = testContext.TestName(typeof(T).Name) + " First"; var dbSet = ((DbContext)CentralDbContext).Set(); var any = await dbSet.AnyAsync(CancellationToken.None); if (!any) { if (Activator.CreateInstance(typeof(T)) is T obj) { await dbSet.AddAsync(obj, CancellationToken.None); await ((DbContext)CentralDbContext).SaveChangesAsync(CancellationToken.None); } } var result = await dbSet.FirstOrDefaultAsync(CancellationToken.None); Assert.That(result, Is.Not.Null.And.InstanceOf()); } catch { // ILB } } public async Task TestCount(TestContext testContext) where T : class { try { var testName = testContext.TestName(typeof(T).Name) + " Count"; var dbSet = ((DbContext)CentralDbContext).Set(); var count = await dbSet.CountAsync(CancellationToken.None); Assert.That(count, Is.GreaterThanOrEqualTo(0)); } catch { // ILB } } [TestCaseSource(nameof(TestCaseSources))] public async Task TestOrmCases(string typeName, bool first) { var entityType = ((DbContext)CentralDbContext).Model.GetEntityTypes() .SingleOrDefault(et => et.ClrType.Name == typeName); if (entityType == null) { return; } if (first) { FirstCaseTests(typeName); } CountCaseTests(typeName); } public async Task FirstCaseTests(string typeName) { switch (typeName) { case nameof(ClientNetworkOpportunity): await TestFirst(TestContext.CurrentContext); break; case nameof(ClientNetworkOpportunityLink): await TestFirst(TestContext.CurrentContext); break; case nameof(ClientWarehouse): await TestFirst(TestContext.CurrentContext); break; case nameof(Comment): await TestFirst(TestContext.CurrentContext); break; case nameof(DeviceIdentifierDimension): await TestFirst(TestContext.CurrentContext); break; case nameof(DeviceIdentifierTerm): await TestFirst(TestContext.CurrentContext); break; case nameof(GMDNCategory): await TestFirst(TestContext.CurrentContext); break; case nameof(GMDNTerm): await TestFirst(TestContext.CurrentContext); break; case nameof(GMDNTermCategory): await TestFirst(TestContext.CurrentContext); break; case nameof(GUDIDDevice): await TestFirst(TestContext.CurrentContext); break; case nameof(GUDIDIdentifier): await TestFirst(TestContext.CurrentContext); break; case nameof(GUDIDTerm): await TestFirst(TestContext.CurrentContext); break; case nameof(NetworkOpportunity): await TestFirst(TestContext.CurrentContext); break; case nameof(OpportunityTypeWorkbook): await TestFirst(TestContext.CurrentContext); break; case nameof(OpportunityWorkbook): await TestFirst(TestContext.CurrentContext); break; case nameof(TmpGUDIDIdentifier): await TestFirst(TestContext.CurrentContext); break; default: throw new NotImplementedException(typeName); } } public async Task CountCaseTests(string typeName) { switch (typeName) { case nameof(ClientNetworkOpportunity): await TestCount(TestContext.CurrentContext); break; case nameof(ClientNetworkOpportunityLink): await TestCount(TestContext.CurrentContext); break; case nameof(ClientWarehouse): await TestCount(TestContext.CurrentContext); break; case nameof(Comment): await TestCount(TestContext.CurrentContext); break; case nameof(DeviceIdentifierDimension): await TestCount(TestContext.CurrentContext); break; case nameof(DeviceIdentifierTerm): await TestCount(TestContext.CurrentContext); break; case nameof(GMDNCategory): await TestCount(TestContext.CurrentContext); break; case nameof(GMDNTerm): await TestCount(TestContext.CurrentContext); break; case nameof(GMDNTermCategory): await TestCount(TestContext.CurrentContext); break; case nameof(GUDIDDevice): await TestCount(TestContext.CurrentContext); break; case nameof(GUDIDIdentifier): await TestCount(TestContext.CurrentContext); break; case nameof(GUDIDTerm): await TestCount(TestContext.CurrentContext); break; case nameof(NetworkOpportunity): await TestCount(TestContext.CurrentContext); break; case nameof(OpportunityTypeWorkbook): await TestCount(TestContext.CurrentContext); break; case nameof(OpportunityWorkbook): await TestCount(TestContext.CurrentContext); break; case nameof(TmpGUDIDIdentifier): await TestCount(TestContext.CurrentContext); break; default: throw new NotImplementedException(typeName); } } [Test] public async Task MissingCentralDbContextTestCases() { var types = ((DbContext)CentralDbContext).Model.GetEntityTypes() .Select(e => e.ClrType).OrderBy(c => c.Name).ToList(); var missingTests = TestCaseSources() .Select(tc => tc.Arguments.First().ToString()) .Where(tc => !types.Select(t => t.Name).Contains(tc)); foreach (var test in missingTests) { try { throw new NotImplementedException(test); } catch (Exception) { // ILB throw; } } } [Test] public async Task CentralDbContextTestCases() { var types = ((DbContext)CentralDbContext).Model.GetEntityTypes() .Select(e => e.ClrType).OrderBy(c => c.Name).ToList(); foreach (var type in types) { switch (type.Name) { case nameof(ClientNetworkOpportunity): await TestGeneric(TestContext.CurrentContext); break; case nameof(ClientNetworkOpportunityLink): await TestGeneric(TestContext.CurrentContext); break; case nameof(ClientWarehouse): await TestGeneric(TestContext.CurrentContext); break; case nameof(Comment): await TestGeneric(TestContext.CurrentContext); break; case nameof(DeviceIdentifierDimension): await TestGeneric(TestContext.CurrentContext); break; case nameof(DeviceIdentifierTerm): await TestGeneric(TestContext.CurrentContext); break; case nameof(GMDNCategory): await TestGeneric(TestContext.CurrentContext); break; case nameof(GMDNTerm): await TestGeneric(TestContext.CurrentContext); break; case nameof(GMDNTermCategory): await TestGeneric(TestContext.CurrentContext); break; case nameof(GUDIDDevice): await TestGeneric(TestContext.CurrentContext); break; case nameof(GUDIDIdentifier): await TestGeneric(TestContext.CurrentContext); break; case nameof(GUDIDTerm): await TestGeneric(TestContext.CurrentContext); break; case nameof(NetworkOpportunity): await TestGeneric(TestContext.CurrentContext); break; case nameof(OpportunityTypeWorkbook): await TestGeneric(TestContext.CurrentContext); break; case nameof(OpportunityWorkbook): await TestGeneric(TestContext.CurrentContext); break; case nameof(TmpGUDIDIdentifier): await TestGeneric(TestContext.CurrentContext); break; case nameof(ExplorationInclusionExclusion): await TestGeneric(TestContext.CurrentContext); break; case nameof(ExplorationPopulation): await TestGeneric(TestContext.CurrentContext); break; case nameof(ExplorationPopulationEncounter): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicOpportunity): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicOpportunityChargeCode): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicOpportunityGL): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicStakeholdersLink): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicOpportunityMeasure): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicOpportunityWorkbook): await TestGeneric(TestContext.CurrentContext); break; case nameof(StrategicOpportunityRampUp): await TestGeneric(TestContext.CurrentContext); break; case nameof(OpportunityRoleAssignment.OpportunityRoleAssignment): await TestGeneric(TestContext.CurrentContext); break; default: var pathArr = TestContext.CurrentContext.TestDirectory.Split(Path.DirectorySeparatorChar); var path = string.Join(Path.DirectorySeparatorChar, pathArr[..(pathArr.Length - 3)].Append("CentralDbIntegrationTests")); var fileName = Path.Combine(path, $"{nameof(TestCentralDbOrm)}_{type.Name}.cs"); if (File.Exists(fileName)) break; var testFile = @" namespace Strata.ContinuousImprovement.Biz.Test.Integration.CentralDbIntegrationTests { [TestFixture, Category(""Integration""), Category(""CCI"")] public partial class TestCentralDbContext : IntegrationTestBase { [Test] public async Task TestCentralDb" + type.Name + @"() { await TestGeneric<" + type.Name + @">(TestContext.CurrentContext); } } } "; File.WriteAllText(fileName, testFile); break; } } } [Test] public async Task ClientNetworkOpportunityTest() { var opp = await CentralDbContext.ClientNetworkOpportunities.FirstOrDefaultAsync(CancellationToken.None); opp ??= new ClientNetworkOpportunity(); opp.NetworkOpportunity ??= new NetworkOpportunity { Name = nameof(ClientNetworkOpportunityTest), Description = nameof(ClientNetworkOpportunityTest), WorkbookTemplateId = 0 }; var result = new ClientNetworkOpportunityDto(opp); Assert.That(result, Is.Not.Null.And.InstanceOf() .And.Property(nameof(ClientNetworkOpportunityDto.Name)).Not.Null .And.Property(nameof(ClientNetworkOpportunityDto.Description)).Not.Null .And.Property(nameof(ClientNetworkOpportunityDto.WorkbookTemplateId)).Not.Null); } } }