public async Task LoadWaterAllocation_ExemptOfPriorityFlow_BadData(bool exemptOfPriorityFlow, DateTime?priorityDate, string allocationFlow_CFS, string allocationVolume_AF)
        {
            OrganizationsDim organization;
            VariablesDim     variable;
            WaterSourcesDim  waterSource;
            MethodsDim       method;
            DateDim          dataPublicationDate;
            WaterAllocation  waterAllocation;
            string           startTestString = "01/01";
            string           endTestString   = "12/01";
            int errorCount = 0;

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                errorCount = db.ImportErrors.Count();

                organization = await OrganizationsDimBuilder.Load(db);

                variable = await VariablesDimBuilder.Load(db);

                waterSource = await WaterSourcesDimBuilder.Load(db);

                method = await MethodsDimBuilder.Load(db);

                dataPublicationDate = await DateDimBuilder.Load(db);

                waterAllocation = WaterAllocationBuilder.Create(new WaterAllocationBuilderOptions {
                    RecordType = WaterAllocationRecordType.None
                });

                //////////////////// Exempt of Volume Flow Priority Columns
                waterAllocation.ExemptOfVolumeFlowPriority = exemptOfPriorityFlow;
                waterAllocation.AllocationPriorityDate     = priorityDate;
                waterAllocation.AllocationFlow_CFS         = allocationFlow_CFS;
                waterAllocation.AllocationVolume_AF        = allocationVolume_AF;
                ////////////////////

                waterAllocation.OrganizationUUID         = organization.OrganizationUuid;
                waterAllocation.VariableSpecificUUID     = variable.VariableSpecificUuid;
                waterAllocation.WaterSourceUUID          = waterSource.WaterSourceUuid;
                waterAllocation.MethodUUID               = method.MethodUuid;
                waterAllocation.DataPublicationDate      = dataPublicationDate.Date;
                waterAllocation.AllocationTimeframeStart = startTestString;
                waterAllocation.AllocationTimeframeEnd   = endTestString;
            }

            var sut    = CreateWaterAllocationAccessor();
            var result = await sut.LoadWaterAllocation((new Faker()).Random.AlphaNumeric(10), new[] { waterAllocation });

            result.Should().BeFalse();

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                db.ImportErrors.Should().HaveCount(errorCount + 1);
                var error = await db.ImportErrors.LastAsync();

                error.Data.Should().Contain("Allocation Not Exempt of Volume Flow Priority");
            }
        }
        public async Task LoadWaterAllocation_BadLoad_CivilianAndPower()
        {
            OrganizationsDim organization;
            VariablesDim     variable;
            WaterSourcesDim  waterSource;
            MethodsDim       method;
            DateDim          dataPublicationDate;
            DateDim          allocationPriorityDate;
            WaterAllocation  waterAllocation;

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                organization = await OrganizationsDimBuilder.Load(db);

                variable = await VariablesDimBuilder.Load(db);

                waterSource = await WaterSourcesDimBuilder.Load(db);

                method = await MethodsDimBuilder.Load(db);

                dataPublicationDate = await DateDimBuilder.Load(db);

                allocationPriorityDate = await DateDimBuilder.Load(db);

                waterAllocation = WaterAllocationBuilder.Create(new WaterAllocationBuilderOptions {
                    RecordType = WaterAllocationRecordType.Civilian
                });

                waterAllocation.OrganizationUUID       = organization.OrganizationUuid;
                waterAllocation.VariableSpecificUUID   = variable.VariableSpecificUuid;
                waterAllocation.WaterSourceUUID        = waterSource.WaterSourceUuid;
                waterAllocation.MethodUUID             = method.MethodUuid;
                waterAllocation.DataPublicationDate    = dataPublicationDate.Date;
                waterAllocation.AllocationPriorityDate = allocationPriorityDate.Date;

                waterAllocation.GeneratedPowerCapacityMW = (new Faker()).Random.Decimal(0, 1000).ToString();
            }

            var sut    = CreateWaterAllocationAccessor();
            var runId  = (new Faker()).Random.AlphaNumeric(10);
            var result = await sut.LoadWaterAllocation(runId, new[] { waterAllocation });

            result.Should().BeFalse();

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                db.AllocationAmountsFact.Should().HaveCount(0);

                var importError = db.ImportErrors.Single();
                importError.RunId.Should().Be(runId);
                importError.Data.Should().Contain("Cross Group Not Valid");
            }
        }
        public async Task LoadWaterAllocation_LoadAllocationBridge_PrimaryUseCategoryCV_Null()
        {
            OrganizationsDim organization;
            VariablesDim     variable;
            WaterSourcesDim  waterSource;
            MethodsDim       method;
            DateDim          dataPublicationDate;
            DateDim          allocationPriorityDate;
            WaterAllocation  waterAllocation;
            BeneficialUsesCV beneficialUsesCV;
            string           startTestString = "01/01";
            string           endTestString   = "12/01";

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                organization = await OrganizationsDimBuilder.Load(db);

                variable = await VariablesDimBuilder.Load(db);

                waterSource = await WaterSourcesDimBuilder.Load(db);

                method = await MethodsDimBuilder.Load(db);

                dataPublicationDate = await DateDimBuilder.Load(db);

                allocationPriorityDate = await DateDimBuilder.Load(db);

                beneficialUsesCV = await BeneficalUsesBuilder.Load(db);

                waterAllocation = WaterAllocationBuilder.Create(new WaterAllocationBuilderOptions {
                    RecordType = WaterAllocationRecordType.None
                });

                waterAllocation.PrimaryUseCategory = null;

                waterAllocation.BeneficialUseCategory    = beneficialUsesCV.Name;
                waterAllocation.OrganizationUUID         = organization.OrganizationUuid;
                waterAllocation.VariableSpecificUUID     = variable.VariableSpecificUuid;
                waterAllocation.WaterSourceUUID          = waterSource.WaterSourceUuid;
                waterAllocation.MethodUUID               = method.MethodUuid;
                waterAllocation.DataPublicationDate      = dataPublicationDate.Date;
                waterAllocation.AllocationPriorityDate   = allocationPriorityDate.Date;
                waterAllocation.AllocationTimeframeStart = startTestString;
                waterAllocation.AllocationTimeframeEnd   = endTestString;
            }

            var sut    = CreateWaterAllocationAccessor();
            var result = await sut.LoadWaterAllocation((new Faker()).Random.AlphaNumeric(10), new[] { waterAllocation });

            result.Should().BeTrue();

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                var dbAllocationAmount = await db.AllocationAmountsFact.SingleAsync();

                dbAllocationAmount.Should().NotBeNull();
                dbAllocationAmount.PrimaryUseCategoryCV.Should().BeNull();

                var dbAllocationBridge = await db.AllocationBridgeBeneficialUsesFact.SingleAsync();

                dbAllocationBridge.Should().NotBeNull();
                dbAllocationBridge.AllocationBridgeId.Should().BeGreaterThan(0);
                dbAllocationBridge.AllocationAmountId.Should().Be(dbAllocationBridge.AllocationAmountId);
                dbAllocationBridge.BeneficialUseCV.Should().Be(beneficialUsesCV.Name);

                db.ImportErrors.Should().HaveCount(0);
            }
        }
        public async Task LoadWaterAllocation_SimpleLoad()
        {
            OrganizationsDim organization;
            VariablesDim     variable;
            WaterSourcesDim  waterSource;
            MethodsDim       method;
            DateDim          dataPublicationDate;
            DateDim          allocationPriorityDate;
            WaterAllocation  waterAllocation;
            string           startTestString = "01/01";
            string           endTestString   = "12/01";

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                organization = await OrganizationsDimBuilder.Load(db);

                variable = await VariablesDimBuilder.Load(db);

                waterSource = await WaterSourcesDimBuilder.Load(db);

                method = await MethodsDimBuilder.Load(db);

                dataPublicationDate = await DateDimBuilder.Load(db);

                allocationPriorityDate = await DateDimBuilder.Load(db);

                waterAllocation = WaterAllocationBuilder.Create(new WaterAllocationBuilderOptions {
                    RecordType = WaterAllocationRecordType.None
                });

                waterAllocation.OrganizationUUID         = organization.OrganizationUuid;
                waterAllocation.VariableSpecificUUID     = variable.VariableSpecificUuid;
                waterAllocation.WaterSourceUUID          = waterSource.WaterSourceUuid;
                waterAllocation.MethodUUID               = method.MethodUuid;
                waterAllocation.DataPublicationDate      = dataPublicationDate.Date;
                waterAllocation.AllocationPriorityDate   = allocationPriorityDate.Date;
                waterAllocation.AllocationTimeframeStart = startTestString;
                waterAllocation.AllocationTimeframeEnd   = endTestString;
            }

            var sut    = CreateWaterAllocationAccessor();
            var result = await sut.LoadWaterAllocation((new Faker()).Random.AlphaNumeric(10), new[] { waterAllocation });

            result.Should().BeTrue();

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                var dbAllocationAmount = await db.AllocationAmountsFact.SingleAsync();

                dbAllocationAmount.AllocationAmountId.Should().NotBe(0);
                dbAllocationAmount.OrganizationId.Should().Be(organization.OrganizationId);
                dbAllocationAmount.VariableSpecificId.Should().Be(variable.VariableSpecificId);
                dbAllocationAmount.WaterSourceId.Should().Be(waterSource.WaterSourceId);
                dbAllocationAmount.MethodId.Should().Be(method.MethodId);
                dbAllocationAmount.DataPublicationDateId.Should().Be(dataPublicationDate.DateId);
                dbAllocationAmount.AllocationPriorityDateID.Should().Be(allocationPriorityDate.DateId);
                dbAllocationAmount.AllocationTimeframeStart.Should().Be(startTestString);
                dbAllocationAmount.AllocationTimeframeEnd.Should().Be(endTestString);
                db.ImportErrors.Should().HaveCount(0);
            }
        }
        public async Task LoadWaterAllocation_ExemptOfPriorityFlow(bool exemptOfPriorityFlow, DateTime?priorityDate, string allocationFlow_CFS, string allocationVolume_AF)
        {
            OrganizationsDim organization;
            VariablesDim     variable;
            WaterSourcesDim  waterSource;
            MethodsDim       method;
            DateDim          dataPublicationDate;
            WaterAllocation  waterAllocation;
            string           startTestString = "01/01";
            string           endTestString   = "12/01";

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                organization = await OrganizationsDimBuilder.Load(db);

                variable = await VariablesDimBuilder.Load(db);

                waterSource = await WaterSourcesDimBuilder.Load(db);

                method = await MethodsDimBuilder.Load(db);

                dataPublicationDate = await DateDimBuilder.Load(db);

                waterAllocation = WaterAllocationBuilder.Create(new WaterAllocationBuilderOptions {
                    RecordType = WaterAllocationRecordType.None
                });

                //////////////////// Exempt of Volume Flow Priority Columns
                // When exempt is TRUE priority date, allocation flow or allocation volume can be NULL.
                waterAllocation.ExemptOfVolumeFlowPriority = exemptOfPriorityFlow;
                waterAllocation.AllocationPriorityDate     = priorityDate;
                waterAllocation.AllocationFlow_CFS         = allocationFlow_CFS;
                waterAllocation.AllocationVolume_AF        = allocationVolume_AF;
                ////////////////////

                waterAllocation.OrganizationUUID         = organization.OrganizationUuid;
                waterAllocation.VariableSpecificUUID     = variable.VariableSpecificUuid;
                waterAllocation.WaterSourceUUID          = waterSource.WaterSourceUuid;
                waterAllocation.MethodUUID               = method.MethodUuid;
                waterAllocation.DataPublicationDate      = dataPublicationDate.Date;
                waterAllocation.AllocationTimeframeStart = startTestString;
                waterAllocation.AllocationTimeframeEnd   = endTestString;
            }

            var sut    = CreateWaterAllocationAccessor();
            var result = await sut.LoadWaterAllocation((new Faker()).Random.AlphaNumeric(10), new[] { waterAllocation });

            result.Should().BeTrue();

            using (var db = new WaDEContext(Configuration.GetConfiguration()))
            {
                var dbAllocationAmount = await db.AllocationAmountsFact.SingleAsync();

                dbAllocationAmount.AllocationAmountId.Should().NotBe(0);
                dbAllocationAmount.ExemptOfVolumeFlowPriority.GetValueOrDefault(false).Should().Be(exemptOfPriorityFlow);
                dbAllocationAmount.AllocationFlow_CFS.ToString().Should().Be(allocationFlow_CFS ?? "");
                dbAllocationAmount.AllocationVolume_AF.ToString().Should().Be(allocationVolume_AF ?? "");

                if (priorityDate.HasValue)
                {
                    dbAllocationAmount.AllocationPriorityDateID.Should().BeGreaterThan(0);
                }
                else
                {
                    dbAllocationAmount.AllocationPriorityDateID.Should().BeNull();
                }

                db.ImportErrors.Should().HaveCount(0);
            }
        }