public void CreateNewPlan_For_State_Unit_SavesMaterialDataCorrectly(
            bool thisPeriodSubmitted,
            bool lastPeriod1Submitted,
            bool lastPeriod2Submitted
            )
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();
            var reportingTerms = ReportingPeriod.GetReportingTerms(reportingFrequency);

            if (reportingTerms.All(o => o != reportingTerm))
            {
                return;
            }

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var organizations = IntegrationTestOrganizationHelper.SetupOrzanizations(
                    stateReportingFrequency: reportingFrequency,
                    zoneReportingFrequency: ReportingFrequency.Monthly);

                var nswState  = organizations.First(o => o.Key == IntegrationTestOrganizationHelper.NswState).Value;
                var laPerouse = new OrganizationBuilder()
                                .SetDescription("La perouse")
                                .SetOrganizationType(OrganizationType.Unit)
                                .SetReportingFreQuency(ReportingFrequency.Monthly)
                                .SetParent(nswState)
                                .BuildAndPersist(s);

                var lalorPark = new OrganizationBuilder()
                                .SetDescription("Lalor park")
                                .SetOrganizationType(OrganizationType.Unit)
                                .SetReportingFreQuency(ReportingFrequency.Monthly)
                                .SetParent(nswState)
                                .BuildAndPersist(s);

                var description = DataProvider.Get <string>();
                var year        = 2019;
                OrganizationReference organizationRef = nswState;

                var reportingPeriod = new ReportingPeriod(reportingFrequency, reportingTerm, year);
                var expected        = new StateReportBuilder()
                                      .SetDescription(description)
                                      .SetOrganization(organizationRef)
                                      .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingPeriod.ReportingTerm,
                                                                              reportingPeriod.Year))
                                      .Build();


                var lastPeriod1 = reportingPeriod.GetReportingPeriodOfPreviousTerm();
                var lastPeriod2 = lastPeriod1.GetReportingPeriodOfPreviousTerm();

                var laPerouseThisPeriodUnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(thisPeriodSubmitted, laPerouse, reportingPeriod, s);
                var laPerouseLastPeriod1UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod1Submitted, laPerouse, lastPeriod1, s);
                var laPerouseLastPeriod2UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod2Submitted, laPerouse, lastPeriod2, s);

                var lalorParkThisPeriodUnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(thisPeriodSubmitted, lalorPark, reportingPeriod, s);
                var lalorParkLastPeriod1UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod1Submitted, lalorPark, lastPeriod1, s);
                var lalorParkLastPeriod2UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod2Submitted, lalorPark, lastPeriod2, s);

                var allUnitReports = new[]
                {
                    laPerouseThisPeriodUnitReport,
                    laPerouseLastPeriod1UnitReport,
                    laPerouseLastPeriod2UnitReport,
                    lalorParkThisPeriodUnitReport,
                    lalorParkLastPeriod1UnitReport,
                    lalorParkLastPeriod2UnitReport,
                };

                var submittedReports = IntegrationTestStateReportHelper.GetSubmittedReports(allUnitReports, reportingPeriod);

                var expectedBookSaleMaterialData          = IntegrationTestStateReportHelper.GetExpectedMaterialData(submittedReports, nameof(StateReport.BookSaleMaterialData));
                var expectedBookSaleMaterialGeneratedData = expectedBookSaleMaterialData;

                var expectedBookDistributionMaterialData          = IntegrationTestStateReportHelper.GetExpectedMaterialData(submittedReports, nameof(StateReport.BookDistributionMaterialData));
                var expectedBookDistributionMaterialGeneratedData = expectedBookDistributionMaterialData;

                var expectedVhsSaleMaterialData          = IntegrationTestStateReportHelper.GetExpectedMaterialData(submittedReports, nameof(StateReport.VhsSaleMaterialData));
                var expectedVhsSaleMaterialGeneratedData = expectedVhsSaleMaterialData;

                var expectedVhsDistributionMaterialData          = IntegrationTestStateReportHelper.GetExpectedMaterialData(submittedReports, nameof(StateReport.VhsDistributionMaterialData));
                var expectedVhsDistributionMaterialGeneratedData = expectedVhsDistributionMaterialData;

                var expectedEmailDistributionMaterialData          = IntegrationTestStateReportHelper.GetExpectedMaterialData(submittedReports, nameof(StateReport.EmailDistributionMaterialData));
                var expectedEmailDistributionMaterialGeneratedData = expectedEmailDistributionMaterialData;

                var expectedIpdcLeafletDistributionMaterialData          = IntegrationTestStateReportHelper.GetExpectedMaterialData(submittedReports, nameof(StateReport.IpdcLeafletDistributionMaterialData));
                var expectedIpdcLeafletDistributionMaterialGeneratedData = expectedIpdcLeafletDistributionMaterialData;


                return(new
                {
                    description,
                    reportingPeriod,
                    organizationRef,
                    expected,
                    expectedBookSaleMaterialData,
                    expectedBookSaleMaterialGeneratedData,
                    expectedBookDistributionMaterialData,
                    expectedBookDistributionMaterialGeneratedData,
                    expectedVhsSaleMaterialData,
                    expectedVhsSaleMaterialGeneratedData,
                    expectedVhsDistributionMaterialData,
                    expectedVhsDistributionMaterialGeneratedData,
                    expectedEmailDistributionMaterialData,
                    expectedEmailDistributionMaterialGeneratedData,
                    expectedIpdcLeafletDistributionMaterialData,
                    expectedIpdcLeafletDistributionMaterialGeneratedData
                });
            });
            var result = Endpoint.Act(AssemblySetupFixture.EndpointTestContainer,
                                      c =>
            {
                var stateReport = c.GetInstance <IStateReportFactory>()
                                  .CreateNewStatePlan(testParams.description,
                                                      testParams.organizationRef,
                                                      testParams.reportingPeriod.ReportingTerm,
                                                      testParams.reportingPeriod.Year,
                                                      reportingFrequency);
                return(new
                {
                    stateReport
                });
            });

            result.stateReport.Should().NotBeNull();

            result.stateReport.BookSaleMaterialData.Should().BeEquivalentTo(testParams.expectedBookSaleMaterialData);
            result.stateReport.BookSaleMaterialGeneratedData.Should().BeEquivalentTo(testParams.expectedBookSaleMaterialGeneratedData);

            result.stateReport.BookDistributionMaterialData.Should().BeEquivalentTo(testParams.expectedBookDistributionMaterialData);
            result.stateReport.BookDistributionMaterialGeneratedData.Should().BeEquivalentTo(testParams.expectedBookDistributionMaterialGeneratedData);

            result.stateReport.VhsSaleMaterialData.Should().BeEquivalentTo(testParams.expectedVhsSaleMaterialData);
            result.stateReport.VhsSaleMaterialGeneratedData.Should().BeEquivalentTo(testParams.expectedVhsSaleMaterialGeneratedData);

            result.stateReport.VhsDistributionMaterialData.Should().BeEquivalentTo(testParams.expectedVhsDistributionMaterialData);
            result.stateReport.VhsDistributionMaterialGeneratedData.Should().BeEquivalentTo(testParams.expectedVhsDistributionMaterialGeneratedData);

            result.stateReport.EmailDistributionMaterialData.Should().BeEquivalentTo(testParams.expectedEmailDistributionMaterialData);
            result.stateReport.EmailDistributionMaterialGeneratedData.Should().BeEquivalentTo(testParams.expectedEmailDistributionMaterialGeneratedData);

            result.stateReport.IpdcLeafletDistributionMaterialData.Should().BeEquivalentTo(testParams.expectedIpdcLeafletDistributionMaterialData);
            result.stateReport.IpdcLeafletDistributionMaterialGeneratedData.Should().BeEquivalentTo(testParams.expectedIpdcLeafletDistributionMaterialGeneratedData);
        }
        public async Task Handle_SavesReport(ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var username      = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new OrganizationBuilder()
                                    .SetOrganizationType(OrganizationType.Unit)
                                    .SetReportingFreQuency(reportingFrequency)
                                    .BuildAndPersist(s);

                var report = new UnitReportBuilder()
                             .SetOrganization(organization)
                             .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                             .Build();
                report.MarkStatusAsPlanPromoted();
                s.Save(report);

                var associateMemberReportData = new TestObjectBuilder <MemberReportData>()
                                                .Build();

                var preliminaryMemberReportData = new TestObjectBuilder <MemberReportData>()
                                                  .Build();

                var unitReportLastPeriodUpdateData = new ReportLastPeriodUpdateDataBuilder()
                                                     .SetAssociateMemberReportData(associateMemberReportData)
                                                     .SetPreliminaryMemberReportData(preliminaryMemberReportData)
                                                     .Build();


                EntityReference reportRef = report;
                var expectedEvt           = Test.CreateInstance <IUnitReportUpdated>(e =>
                {
                    e.Organization = organization;
                    e.Username     = username;
                    e.UnitReport   = reportRef;
                });

                return(new
                {
                    Cmd = new UpdateUnitReportLastPeriodDataCommand(report.Id,
                                                                    unitReportLastPeriodUpdateData),
                    Report = report,
                    username,
                    expectedEvt
                });
            });

            var context = await Endpoint.Act <UpdateUnitReportLastPeriodDataCommandHandler>(AssemblySetupFixture.EndpointTestContainer,
                                                                                            (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <IUnitReportUpdated>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var unitReport = s.Get <UnitReport>(testParams.Cmd.ReportId);
                unitReport.Should().NotBeNull();

                unitReport.Should().BeEquivalentTo(testParams.Report, e =>
                                                   e.Excluding(p => p.AssociateMemberData)
                                                   .Excluding(p => p.PreliminaryMemberData)
                                                   .Excluding(p => p.SupporterMemberData)
                                                   .Excluding(p => p.WorkerMeetingProgramData)
                                                   .Excluding(p => p.DawahMeetingProgramData)
                                                   .Excluding(p => p.StateLeaderMeetingProgramData)
                                                   .Excluding(p => p.StateOutingMeetingProgramData)
                                                   .Excluding(p => p.IftarMeetingProgramData)
                                                   .Excluding(p => p.LearningMeetingProgramData)
                                                   .Excluding(p => p.SocialDawahMeetingProgramData)
                                                   .Excluding(p => p.DawahGroupMeetingProgramData)
                                                   .Excluding(p => p.NextGMeetingProgramData)
                                                   .Excluding(p => p.CmsMeetingProgramData)
                                                   .Excluding(p => p.SmMeetingProgramData)
                                                   .Excluding(p => p.MemberMeetingProgramData)
                                                   .Excluding(p => p.TafsirMeetingProgramData)
                                                   .Excluding(p => p.UnitMeetingProgramData)
                                                   .Excluding(p => p.FamilyVisitMeetingProgramData)
                                                   .Excluding(p => p.EidReunionMeetingProgramData)
                                                   .Excluding(p => p.BbqMeetingProgramData)
                                                   .Excluding(p => p.GatheringMeetingProgramData)
                                                   .Excluding(p => p.OtherMeetingProgramData)
                                                   .Excluding(p => p.MemberMemberData)
                                                   .Excluding(p => p.BaitulMalFinanceData)
                                                   .Excluding(p => p.ADayMasjidProjectFinanceData)
                                                   .Excluding(p => p.MasjidTableBankFinanceData)
                                                   .Excluding(p => p.QardeHasanaSocialWelfareData)
                                                   .Excluding(p => p.PatientVisitSocialWelfareData)
                                                   .Excluding(p => p.SocialVisitSocialWelfareData)
                                                   .Excluding(p => p.TransportSocialWelfareData)
                                                   .Excluding(p => p.ShiftingSocialWelfareData)
                                                   .Excluding(p => p.ShoppingSocialWelfareData)
                                                   .Excluding(p => p.FoodDistributionSocialWelfareData)
                                                   .Excluding(p => p.CleanUpAustraliaSocialWelfareData)
                                                   .Excluding(p => p.OtherSocialWelfareData)
                                                   .Excluding(p => p.BookSaleMaterialData)
                                                   .Excluding(p => p.BookDistributionMaterialData)
                                                   .Excluding(p => p.BookLibraryStockData)
                                                   .Excluding(p => p.OtherSaleMaterialData)
                                                   .Excluding(p => p.OtherDistributionMaterialData)
                                                   .Excluding(p => p.OtherLibraryStockData)
                                                   .Excluding(p => p.VhsSaleMaterialData)
                                                   .Excluding(p => p.VhsDistributionMaterialData)
                                                   .Excluding(p => p.VhsLibraryStockData)
                                                   .Excluding(p => p.EmailDistributionMaterialData)
                                                   .Excluding(p => p.IpdcLeafletDistributionMaterialData)


                                                   .Excluding(p => p.GroupStudyTeachingLearningProgramData)
                                                   .Excluding(p => p.StudyCircleTeachingLearningProgramData)
                                                   .Excluding(p => p.PracticeDarsTeachingLearningProgramData)
                                                   .Excluding(p => p.StateLearningCampTeachingLearningProgramData)
                                                   .Excluding(p => p.QuranStudyTeachingLearningProgramData)
                                                   .Excluding(p => p.QuranClassTeachingLearningProgramData)
                                                   .Excluding(p => p.MemorizingAyatTeachingLearningProgramData)
                                                   .Excluding(p => p.StateLearningSessionTeachingLearningProgramData)
                                                   .Excluding(p => p.StateQiyamulLailTeachingLearningProgramData)
                                                   .Excluding(p => p.StudyCircleForAssociateMemberTeachingLearningProgramData)
                                                   .Excluding(p => p.HadithTeachingLearningProgramData)
                                                   .Excluding(p => p.WeekendIslamicSchoolTeachingLearningProgramData)
                                                   .Excluding(p => p.MemorizingHadithTeachingLearningProgramData)
                                                   .Excluding(p => p.MemorizingDoaTeachingLearningProgramData)
                                                   .Excluding(p => p.OtherTeachingLearningProgramData)
                                                   .Excluding(p => p.Comment)
                                                   );

                ReportLastPeriodUpdateData reportUpdateData = unitReport;
                reportUpdateData.Should().BeEquivalentTo(testParams.Cmd.LastPeriodUpdateData);

                evt.Should().BeEquivalentTo(testParams.expectedEvt, e => e.Excluding(p => p.SerializedData));
                evt.SerializedData.Should().NotBe(null);
            });
        }
        public void BuilderAllExplicit()
        {
            const string searchterms = "";
            const int    from        = 1;
            const int    size        = 25;
            const string sortby      = "organization_name";

            string[]     state  = { "ny" };
            const string zip    = "";
            const int    radius = 50;

            string[]   msa           = { "" };
            string[]   city          = { "" };
            string[]   county        = { "" };
            string[]   profilelevel  = { "Platinum", "Bronze" };
            string[]   nteemajor     = { "" };
            string[]   nteeminor     = { "" };
            string[]   subsection    = { "" };
            string[]   foundation    = { "" };
            const bool bmfstatus     = true;
            const bool pub78verified = true;
            const int  minemployees  = 0;
            const int  maxemployees  = 1000000000;
            const int  minrevenue    = 0;
            const int  maxrevenue    = 1000000000;
            const int  minexpenses   = 0;
            const int  maxexpesnes   = 1000000000;
            const int  minassets     = 0;
            const int  maxassets     = 100000000;

            var payload = SearchPayloadBuilder.Create()
                          //search terms is a string used as a keyword search
                          .WithSearchTerms(searchterms)
                          //from is an integer to specify which record to start at for pagination
                          .From(from)
                          //size is an integer to specify how many records to return
                          .Size(size)
                          .Sort(SortBuilder =>
            {
                //sortby is a string to specify how to sort the records
                SortBuilder.SortBy(sortby);
                //sortbyascending is used to sort the records alphabectically. The sort is set to true when this is present in the form.
                SortBuilder.SortByAscending();
                //sortbydescending is used to sort the records reverse alphabectically. The sort is set to true when this is present in the form.
                //SortBuilder.SortByDescending();
            }
                                )
                          .Filters(filterBuilder =>
            {
                filterBuilder.Geography(geographyBuilder =>
                {
                    //state is a string array to filter on multiple states
                    geographyBuilder.HavingState(state);
                    //zip is a string to filter on 1 zip code
                    //geographyBuilder.HavingZipCode(zip);
                    //radius is an integer to include up to 50 miles from the zip
                    geographyBuilder.WithinZipRadius(radius);
                    //msa is an string array to filter on multiple msa codes
                    geographyBuilder.HavingMSA(msa);
                    //city is a string array to filter on multiple cities
                    geographyBuilder.HavingCity(city);
                    //county is a string array to filter on multiple counties
                    geographyBuilder.HavingCounty(county);
                }
                                        );
                filterBuilder.Organization(OrganizationBuilder =>
                {
                    //profilelevel is a string array to filter on the seal of transparencies
                    OrganizationBuilder.HavingProfileLevel(profilelevel);
                    //nteemajor is a string array to filter on major ntee codes
                    OrganizationBuilder.HavingNTEEMajorCode(nteemajor);
                    //nteeminor is a string array to filter on minor ntee codes
                    OrganizationBuilder.HavingNTEEMinorCode(nteeminor);
                    //subsection is a string array to filer on subsection codes
                    OrganizationBuilder.HavingSubsectionCode(subsection);
                    //foundation is a string array to filer on foundation codes
                    OrganizationBuilder.HavingFoundationCode(foundation);
                    //bmfstatus is a boolean to filter on bmf status
                    OrganizationBuilder.IsOnBMF(bmfstatus);
                    //pub78verified is a boolean to filter on verification on pub 78
                    OrganizationBuilder.IsPub78Verified(pub78verified);
                    OrganizationBuilder.AffiliationType(AffiliationTypeBuilder =>
                    {
                        //only parents is used to filter parent organizations. The search is set to true when this is present in the form.
                        //AffiliationTypeBuilder.OnlyParents();
                        //only subordinate is used to filter subordinate organizations. The search is set to true when this is present in the form.
                        //AffiliationTypeBuilder.OnlySubordinate();
                        //only independent is used to filter independent organizations. The search is set to true when this is present in the form.
                        //AffiliationTypeBuilder.OnlyIndependent();
                        //only headquarters is used to filter headquarter organizations. The search is set to true when this is present in the form.
                        //AffiliationTypeBuilder.OnlyHeadquarters();
                    }
                                                        );
                    OrganizationBuilder.SpecificExclusions(SpecificExclusionBuilder =>
                    {
                        //exclude revoked organizations is used to filter out any revoked organizations. The search is set to true when this is present in the form.
                        SpecificExclusionBuilder.ExcludeRevokedOrganizations();
                        //exclude defunct or merged organizations is used to filter out any defunct or merged organizations. the search is set to true when this is present in the form.
                        SpecificExclusionBuilder.ExcludeDefunctOrMergedOrganizations();
                    }
                                                           );
                    OrganizationBuilder.NumberOfEmployees(MinMaxBuilder =>
                    {
                        //maxemployees is an integer to include organizations with the number of employees less than the specified amount
                        MinMaxBuilder.HavingMaximum(maxemployees);
                        //minemployees is an integer to include organizations with the number of employees more than the specified amount
                        MinMaxBuilder.HavingMinimum(minemployees);
                    }
                                                          );
                    OrganizationBuilder.FormTypes(FormTypeBuilder =>
                    {
                        //only f990 is used to filter organizations who filed a form 990. The search is set to true when this is present in the form.
                        FormTypeBuilder.OnlyF990();
                        //only f990pf is used to filter organizations who filed a form 990-pf. The search is set to true when this is present in the form.
                        //FormTypeBuilder.OnlyF990PF();
                        //only f990t required is used to filter organizations who are required to filed a form 990-t. The search is set to true when this is present in the form.
                        //FormTypeBuilder.Only990tRequired();
                    }
                                                  );
                    OrganizationBuilder.Audits(AuditBuilder =>
                    {
                        // having a133 audit is used to filter organizations who have completed an a133 audit. The search is set to true when this is present in the form.
                        AuditBuilder.HavingA133Audit();
                    }
                                               );
                }
                                           );
                filterBuilder.Financials(finBuilder =>
                {
                    finBuilder.Form990Assets(assets =>
                    {
                        //maxassets is an integer to include organizations with assets less than the specified amount
                        assets.HavingMaximum(maxassets);
                        //minassets is an integer to include organizations with assets more than the specified amount
                        assets.HavingMinimum(minassets);
                    }
                                             );
                    finBuilder.Form990Expenses(expenses =>
                    {
                        //maxexpenses is an integer to include organizations with expenses less than the specified amount
                        expenses.HavingMaximum(maxexpesnes);
                        //minexpenses is an integer to include organizations with expenses more than the specified amount
                        expenses.HavingMinimum(minexpenses);
                    }
                                               );
                    finBuilder.Form990Revenue(revenue =>
                    {
                        //maxrevenue is an integer to include organizations with revenue less than the specified amount
                        revenue.HavingMaximum(maxrevenue);
                        //minrevenue is an integer to include organizations with revenue more than the specified amount
                        revenue.HavingMinimum(minrevenue);
                    }
                                              );
                }
                                         );
            }
                                   )
                          .Build();

            GuideStarClient.SubscriptionKeys.Add(Domain.EssentialsV2, ESSENTIALS_KEY);
            var essentials = EssentialsResource.GetOrganization(payload);
        }
        public async Task Handle_SavesPlan(ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var username      = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new OrganizationBuilder()
                                    .SetOrganizationType(OrganizationType.State)
                                    .SetReportingFreQuency(reportingFrequency)
                                    .BuildAndPersist(s);

                var associateMemberData = new TestObjectBuilder <MemberData>()
                                          .Build();

                var preliminaryMemberData = new TestObjectBuilder <MemberData>()
                                            .Build();

                PlanData planData = new ReportDataBuilder()
                                    .SetAssociateMemberData(associateMemberData)
                                    .SetPreliminaryMemberData(preliminaryMemberData)
                                    .Build();

                var report = new StateReportBuilder()
                             .SetOrganization(organization)
                             .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                             .BuildAndPersist(s);
                report.UpdatePlan(planData);
                s.Save(report);

                EntityReference reportRef = report;
                var expectedEvt           = Test.CreateInstance <IStatePlanPromoted>(e =>
                {
                    e.Organization = organization;
                    e.Username     = username;
                    e.StateReport  = reportRef;
                });

                return(new
                {
                    Cmd = new PromotePlanToStateReportCommand(report.Id),
                    Report = report,
                    username,
                    expectedEvt
                });
            });

            var context = await Endpoint.Act <PromotePlanToStateReportCommandHandler>(AssemblySetupFixture.EndpointTestContainer,
                                                                                      (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <IStatePlanPromoted>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var stateReport = s.Get <StateReport>(testParams.Cmd.PlanId);
                stateReport.Should().NotBeNull();
                stateReport.Should().BeEquivalentTo(testParams.Report, e => e.Excluding(p => p.ReportStatus));
                stateReport.ReportStatus.Should().Be(ReportStatus.PlanPromoted);

                evt.Should().BeEquivalentTo(testParams.expectedEvt, e => e.Excluding(p => p.SerializedData));
                evt.SerializedData.Should().NotBe(null);
            });
        }
Example #5
0
        public async Task Handle_SavesReport(ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var username      = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new OrganizationBuilder()
                                    .SetOrganizationType(OrganizationType.Central)
                                    .SetReportingFreQuency(reportingFrequency)
                                    .BuildAndPersist(s);

                var report = new CentralReportBuilder()
                             .SetOrganization(organization)
                             .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                             .Build();
                report.MarkStatusAsPlanPromoted();
                s.Save(report);
                var memberMemberData = new TestObjectBuilder <MemberData>()
                                       .Build();
                var associateMemberData = new TestObjectBuilder <MemberData>()
                                          .Build();

                var preliminaryMemberData = new TestObjectBuilder <MemberData>()
                                            .Build();

                //Todo pass random data once supporterMember is added to the CentralReport
                var supporterMemberData = new TestObjectBuilder <MemberData>()
                                          .Build();

                var workerMeetingProgramData      = new TestObjectBuilder <MeetingProgramData>().Build();
                var dawahMeetingProgramData       = new TestObjectBuilder <MeetingProgramData>().Build();
                var stateLeaderMeetingProgramData = new TestObjectBuilder <MeetingProgramData>().Build();
                var stateOutingMeetingProgramData = new TestObjectBuilder <MeetingProgramData>().Build();
                var iftarMeetingProgramData       = new TestObjectBuilder <MeetingProgramData>().Build();
                var learningMeetingProgramData    = new TestObjectBuilder <MeetingProgramData>().Build();
                var socialDawahMeetingProgramData = new TestObjectBuilder <MeetingProgramData>().Build();
                var dawahGroupMeetingProgramData  = new TestObjectBuilder <MeetingProgramData>().Build();
                var nextGMeetingProgramData       = new TestObjectBuilder <MeetingProgramData>().Build();

                var cmsMeetingProgramData         = new TestObjectBuilder <MeetingProgramData>().Build();
                var smMeetingProgramData          = new TestObjectBuilder <MeetingProgramData>().Build();
                var memberMeetingProgramData      = new TestObjectBuilder <MeetingProgramData>().Build();
                var tafsirMeetingProgramData      = new TestObjectBuilder <MeetingProgramData>().Build();
                var unitMeetingProgramData        = new TestObjectBuilder <MeetingProgramData>().Build();
                var familyVisitMeetingProgramData = new TestObjectBuilder <MeetingProgramData>().Build();
                var eidReunionMeetingProgramData  = new TestObjectBuilder <MeetingProgramData>().Build();
                var bbqMeetingProgramData         = new TestObjectBuilder <MeetingProgramData>().Build();
                var gatheringMeetingProgramData   = new TestObjectBuilder <MeetingProgramData>().Build();
                var otherMeetingProgramData       = new TestObjectBuilder <MeetingProgramData>().Build();

                var groupStudyTeachingLearningProgramData                    = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var studyCircleTeachingLearningProgramData                   = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var practiceDarsTeachingLearningProgramData                  = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var stateLearningCampTeachingLearningProgramData             = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var quranStudyTeachingLearningProgramData                    = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var quranClassTeachingLearningProgramData                    = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var memorizingAyatTeachingLearningProgramData                = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var stateLearningSessionTeachingLearningProgramData          = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var stateQiyamulLailTeachingLearningProgramData              = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var studyCircleForAssociateMemberTeachingLearningProgramData = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var hadithTeachingLearningProgramData = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var weekendIslamicSchoolTeachingLearningProgramData = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var memorizingHadithTeachingLearningProgramData     = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var memorizingDoaTeachingLearningProgramData        = new TestObjectBuilder <TeachingLearningProgramData>().Build();
                var otherTeachingLearningProgramData = new TestObjectBuilder <TeachingLearningProgramData>().Build();


                var baitulMalFinanceData         = FinanceData.Default();
                var aDayMasjidProjectFinanceData = FinanceData.Default();
                var masjidTableBankFinanceData   = FinanceData.Default();

                var qardeHasanaSocialWelfareData  = SocialWelfareData.Default();
                var patientVisitSocialWelfareData = SocialWelfareData.Default();
                var socialVisitSocialWelfareData  = SocialWelfareData.Default();

                var transportSocialWelfareData        = SocialWelfareData.Default();
                var shiftingSocialWelfareData         = SocialWelfareData.Default();
                var shoppingSocialWelfareData         = SocialWelfareData.Default();
                var foodDistributionSocialWelfareData = SocialWelfareData.Default();
                var cleanUpAustraliaSocialWelfareData = SocialWelfareData.Default();
                var otherSocialWelfareData            = SocialWelfareData.Default();

                var bookSaleMaterialData                = MaterialData.Default();
                var bookDistributionMaterialData        = MaterialData.Default();
                var bookLibraryStockData                = LibraryStockData.Default();
                var otherSaleMaterialData               = MaterialData.Default();
                var otherDistributionMaterialData       = MaterialData.Default();
                var otherLibraryStockData               = LibraryStockData.Default();
                var vhsSaleMaterialData                 = MaterialData.Default();
                var vhsDistributionMaterialData         = MaterialData.Default();
                var vhsLibraryStockData                 = LibraryStockData.Default();
                var emailDistributionMaterialData       = MaterialData.Default();
                var ipdcLeafletDistributionMaterialData = MaterialData.Default();

                //var bookLibraryStockData = LibraryStockData.Default();
                //var vhsLibraryStockData = LibraryStockData.Default();

                var comment = DataProvider.Get <string>();


                ReportUpdateData centralReportUpdateData = new ReportDataBuilder()
                                                           .SetMemberMemberData(memberMemberData)
                                                           .SetAssociateMemberData(associateMemberData)
                                                           .SetPreliminaryMemberData(preliminaryMemberData)
                                                           .SetSupporterMemberData(supporterMemberData)

                                                           .SetWorkerMeetingProgramData(workerMeetingProgramData)
                                                           .SetDawahMeetingProgramData(dawahMeetingProgramData)
                                                           .SetStateLeaderMeetingProgramData(stateLeaderMeetingProgramData)
                                                           .SetStateOutingMeetingProgramData(stateOutingMeetingProgramData)
                                                           .SetIftarMeetingProgramData(iftarMeetingProgramData)
                                                           .SetLearningMeetingProgramData(learningMeetingProgramData)
                                                           .SetSocialDawahMeetingProgramData(socialDawahMeetingProgramData)
                                                           .SetDawahGroupMeetingProgramData(dawahGroupMeetingProgramData)
                                                           .SetNextGMeetingProgramData(nextGMeetingProgramData)

                                                           .SetCmsMeetingProgramData(cmsMeetingProgramData)
                                                           .SetSmMeetingProgramData(smMeetingProgramData)
                                                           .SetMemberMeetingProgramData(memberMeetingProgramData)
                                                           .SetTafsirMeetingProgramData(tafsirMeetingProgramData)
                                                           .SetUnitMeetingProgramData(unitMeetingProgramData)
                                                           .SetFamilyVisitMeetingProgramData(familyVisitMeetingProgramData)
                                                           .SetEidReunionMeetingProgramData(eidReunionMeetingProgramData)
                                                           .SetBbqMeetingProgramData(bbqMeetingProgramData)
                                                           .SetGatheringMeetingProgramData(gatheringMeetingProgramData)
                                                           .SetOtherMeetingProgramData(otherMeetingProgramData)

                                                           .SetGroupStudyTeachingLearningProgramData(groupStudyTeachingLearningProgramData)
                                                           .SetStudyCircleTeachingLearningProgramData(studyCircleTeachingLearningProgramData)
                                                           .SetPracticeDarsTeachingLearningProgramData(practiceDarsTeachingLearningProgramData)
                                                           .SetStateLearningCampTeachingLearningProgramData(stateLearningCampTeachingLearningProgramData)
                                                           .SetQuranStudyTeachingLearningProgramData(quranStudyTeachingLearningProgramData)
                                                           .SetQuranClassTeachingLearningProgramData(quranClassTeachingLearningProgramData)
                                                           .SetMemorizingAyatTeachingLearningProgramData(memorizingAyatTeachingLearningProgramData)
                                                           .SetStateLearningSessionTeachingLearningProgramData(stateLearningSessionTeachingLearningProgramData)
                                                           .SetStateQiyamulLailTeachingLearningProgramData(stateQiyamulLailTeachingLearningProgramData)

                                                           .SetBaitulMalFinanceData(baitulMalFinanceData)
                                                           .SetADayMasjidProjectFinanceData(aDayMasjidProjectFinanceData)
                                                           .SetMasjidTableBankFinanceData(masjidTableBankFinanceData)

                                                           .SetQardeHasanaSocialWelfareData(qardeHasanaSocialWelfareData)
                                                           .SetPatientVisitSocialWelfareData(patientVisitSocialWelfareData)
                                                           .SetSocialVisitSocialWelfareData(socialVisitSocialWelfareData)
                                                           .SetTransportSocialWelfareData(transportSocialWelfareData)
                                                           .SetShiftingSocialWelfareData(shiftingSocialWelfareData)
                                                           .SetShoppingSocialWelfareData(shoppingSocialWelfareData)

                                                           .SetFoodDistributionSocialWelfareData(foodDistributionSocialWelfareData)
                                                           .SetCleanUpAustraliaSocialWelfareData(cleanUpAustraliaSocialWelfareData)
                                                           .SetOtherSocialWelfareData(otherSocialWelfareData)

                                                           .SetBookSaleMaterialData(bookSaleMaterialData)
                                                           .SetBookDistributionMaterialData(bookDistributionMaterialData)
                                                           .SetBookLibraryStockData(bookLibraryStockData)

                                                           .SetOtherSaleMaterialData(otherSaleMaterialData)
                                                           .SetOtherDistributionMaterialData(otherDistributionMaterialData)
                                                           .SetOtherLibraryStockData(otherLibraryStockData)

                                                           .SetVhsSaleMaterialData(vhsSaleMaterialData)
                                                           .SetVhsDistributionMaterialData(vhsDistributionMaterialData)
                                                           .SetVhsLibraryStockData(vhsLibraryStockData)

                                                           .SetEmailDistributionMaterialData(emailDistributionMaterialData)
                                                           .SetIpdcLeafletDistributionMaterialData(ipdcLeafletDistributionMaterialData)

                                                           .SetGroupStudyTeachingLearningProgramData(groupStudyTeachingLearningProgramData)
                                                           .SetStudyCircleTeachingLearningProgramData(studyCircleTeachingLearningProgramData)
                                                           .SetPracticeDarsTeachingLearningProgramData(practiceDarsTeachingLearningProgramData)
                                                           .SetStateLearningCampTeachingLearningProgramData(stateLearningCampTeachingLearningProgramData)
                                                           .SetQuranStudyTeachingLearningProgramData(quranStudyTeachingLearningProgramData)
                                                           .SetQuranClassTeachingLearningProgramData(quranClassTeachingLearningProgramData)
                                                           .SetMemorizingAyatTeachingLearningProgramData(memorizingAyatTeachingLearningProgramData)
                                                           .SetStateLearningSessionTeachingLearningProgramData(stateLearningSessionTeachingLearningProgramData)
                                                           .SetStateQiyamulLailTeachingLearningProgramData(stateQiyamulLailTeachingLearningProgramData)

                                                           .SetStudyCircleForAssociateMemberTeachingLearningProgramData(studyCircleForAssociateMemberTeachingLearningProgramData)
                                                           .SetHadithTeachingLearningProgramData(hadithTeachingLearningProgramData)
                                                           .SetWeekendIslamicSchoolTeachingLearningProgramData(weekendIslamicSchoolTeachingLearningProgramData)
                                                           .SetMemorizingHadithTeachingLearningProgramData(memorizingHadithTeachingLearningProgramData)
                                                           .SetMemorizingDoaTeachingLearningProgramData(memorizingDoaTeachingLearningProgramData)
                                                           .SetOtherTeachingLearningProgramData(otherTeachingLearningProgramData)

                                                           .SetComment(comment)

                                                           .Build();

                EntityReference reportRef = report;
                var expectedEvt           = Test.CreateInstance <ICentralReportUpdated>(e =>
                {
                    e.Organization  = organization;
                    e.Username      = username;
                    e.CentralReport = reportRef;
                });

                return(new
                {
                    Cmd = new UpdateCentralReportCommand(report.Id,
                                                         centralReportUpdateData),
                    Report = report,
                    username,
                    expectedEvt
                });
            });

            var context = await Endpoint.Act <UpdateCentralReportCommandHandler>(AssemblySetupFixture.EndpointTestContainer,
                                                                                 (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <ICentralReportUpdated>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var centralReport = s.Get <CentralReport>(testParams.Cmd.ReportId);
                centralReport.Should().NotBeNull();

                centralReport.Should().BeEquivalentTo(testParams.Report, e =>
                                                      e.Excluding(p => p.MemberMemberData)
                                                      .Excluding(p => p.AssociateMemberData)
                                                      .Excluding(p => p.PreliminaryMemberData)
                                                      .Excluding(p => p.SupporterMemberData)
                                                      .Excluding(p => p.WorkerMeetingProgramData)
                                                      .Excluding(p => p.DawahMeetingProgramData)
                                                      .Excluding(p => p.StateLeaderMeetingProgramData)
                                                      .Excluding(p => p.StateOutingMeetingProgramData)
                                                      .Excluding(p => p.IftarMeetingProgramData)
                                                      .Excluding(p => p.LearningMeetingProgramData)
                                                      .Excluding(p => p.SocialDawahMeetingProgramData)
                                                      .Excluding(p => p.DawahGroupMeetingProgramData)
                                                      .Excluding(p => p.NextGMeetingProgramData)

                                                      .Excluding(p => p.CmsMeetingProgramData)
                                                      .Excluding(p => p.SmMeetingProgramData)
                                                      .Excluding(p => p.MemberMeetingProgramData)
                                                      .Excluding(p => p.TafsirMeetingProgramData)
                                                      .Excluding(p => p.UnitMeetingProgramData)
                                                      .Excluding(p => p.FamilyVisitMeetingProgramData)
                                                      .Excluding(p => p.EidReunionMeetingProgramData)
                                                      .Excluding(p => p.BbqMeetingProgramData)
                                                      .Excluding(p => p.GatheringMeetingProgramData)
                                                      .Excluding(p => p.OtherMeetingProgramData)

                                                      .Excluding(p => p.GroupStudyTeachingLearningProgramData)
                                                      .Excluding(p => p.StudyCircleTeachingLearningProgramData)
                                                      .Excluding(p => p.PracticeDarsTeachingLearningProgramData)
                                                      .Excluding(p => p.StateLearningCampTeachingLearningProgramData)
                                                      .Excluding(p => p.QuranStudyTeachingLearningProgramData)
                                                      .Excluding(p => p.QuranClassTeachingLearningProgramData)
                                                      .Excluding(p => p.MemorizingAyatTeachingLearningProgramData)
                                                      .Excluding(p => p.StateLearningSessionTeachingLearningProgramData)
                                                      .Excluding(p => p.StateQiyamulLailTeachingLearningProgramData)

                                                      .Excluding(p => p.StudyCircleForAssociateMemberTeachingLearningProgramData)
                                                      .Excluding(p => p.HadithTeachingLearningProgramData)
                                                      .Excluding(p => p.WeekendIslamicSchoolTeachingLearningProgramData)
                                                      .Excluding(p => p.MemorizingHadithTeachingLearningProgramData)
                                                      .Excluding(p => p.MemorizingDoaTeachingLearningProgramData)
                                                      .Excluding(p => p.OtherTeachingLearningProgramData)

                                                      .Excluding(p => p.BookSaleMaterialData)
                                                      .Excluding(p => p.BookDistributionMaterialData)
                                                      .Excluding(p => p.BookLibraryStockData)

                                                      .Excluding(p => p.OtherSaleMaterialData)
                                                      .Excluding(p => p.OtherDistributionMaterialData)
                                                      .Excluding(p => p.OtherLibraryStockData)

                                                      .Excluding(p => p.VhsSaleMaterialData)
                                                      .Excluding(p => p.VhsDistributionMaterialData)
                                                      .Excluding(p => p.VhsLibraryStockData)

                                                      .Excluding(p => p.EmailDistributionMaterialData)
                                                      .Excluding(p => p.IpdcLeafletDistributionMaterialData)

                                                      .Excluding(p => p.BaitulMalFinanceData)
                                                      .Excluding(p => p.ADayMasjidProjectFinanceData)
                                                      .Excluding(p => p.MasjidTableBankFinanceData)


                                                      .Excluding(p => p.QardeHasanaSocialWelfareData)
                                                      .Excluding(p => p.PatientVisitSocialWelfareData)
                                                      .Excluding(p => p.SocialVisitSocialWelfareData)
                                                      .Excluding(p => p.TransportSocialWelfareData)
                                                      .Excluding(p => p.ShiftingSocialWelfareData)
                                                      .Excluding(p => p.ShoppingSocialWelfareData)
                                                      .Excluding(p => p.FoodDistributionSocialWelfareData)
                                                      .Excluding(p => p.CleanUpAustraliaSocialWelfareData)
                                                      .Excluding(p => p.OtherSocialWelfareData)
                                                      .Excluding(p => p.Comment)
                                                      );

                ReportData reportData             = centralReport;
                ReportUpdateData reportUpdateData = reportData;
                reportUpdateData.Should().BeEquivalentTo(testParams.Cmd.ReportUpdateData);

                evt.Should().BeEquivalentTo(testParams.expectedEvt, e => e.Excluding(p => p.SerializedData));
                evt.SerializedData.Should().NotBe(null);
            });
        }
        public async Task Handle_SavesReportWhenNoPreviousReportSubmitted(ReportingFrequency reportingFrequency, bool overrideReportData)
        {
            var now = DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var username = DataProvider.Get <string>();

                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new OrganizationBuilder()
                                    .SetOrganizationType(OrganizationType.Central)
                                    .SetReportingFreQuency(reportingFrequency)
                                    .BuildAndPersist(s);
                var report = new CentralReportBuilder()
                             .SetOrganization(organization)
                             .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                             .Build();
                report.MarkStatusAsPlanPromoted();
                s.Save(report);

                var generatedData = GetCentralReportData();

                report.UpdateGeneratedData(generatedData);
                report.Update(generatedData);
                s.Save(report);

                EntityReference reportRef = report;
                var expectedEvt           = Test.CreateInstance <ICentralReportUpdated>(e =>
                {
                    e.Organization  = organization;
                    e.Username      = username;
                    e.CentralReport = reportRef;
                });

                return(new
                {
                    Cmd = new UpdateCentralReportGeneratedDataCommand(report.Id, overrideReportData),
                    Organization = organization,
                    Report = report,
                    centralReportData = generatedData,
                    overrideReportData,
                    username,
                    expectedEvt
                });
            });


            var context = await Endpoint.Act <UpdateCentralReportGeneratedDataCommandHandler>(AssemblySetupFixture.EndpointTestContainer,
                                                                                              (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <ICentralReportUpdated>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var report = s.Get <Report>(testParams.Cmd.ReportId);
                report.Should().NotBeNull();
                report.Description.Should().Be(testParams.Report.Description);
                report.ReportingPeriod.Year.Should().Be(testParams.Report.ReportingPeriod.Year);
                report.ReportingPeriod.ReportingFrequency.Should().Be(testParams.Organization.ReportingFrequency);
                report.ReportingPeriod.ReportingTerm.Should().Be(testParams.Report.ReportingPeriod.ReportingTerm);
                report.Organization.Should().Be(testParams.Report.Organization);
                report.ReportStatus.Should().Be(ReportStatus.PlanPromoted);
                report.Timestamp.Should().Be(now);
                report.IsDeleted.Should().Be(false);

                var centralReport = s.Get <CentralReport>(testParams.Cmd.ReportId);
                centralReport.Should().NotBeNull();
                centralReport.Description.Should().Be(testParams.Report.Description);
                centralReport.ReportingPeriod.Year.Should().Be(testParams.Report.ReportingPeriod.Year);
                centralReport.ReportingPeriod.ReportingFrequency.Should()
                .Be(testParams.Organization.ReportingFrequency);
                centralReport.ReportingPeriod.ReportingTerm.Should()
                .Be(testParams.Report.ReportingPeriod.ReportingTerm);
                centralReport.Organization.Should().Be(testParams.Report.Organization);
                //centralReport.AssociateMemberData.Should().Be(overrideReportData
                //    ? MemberData.Default()
                //    : testParams.centralReportData.AssociateMemberData);
                //centralReport.AssociateMemberGeneratedData.Should().Be(MemberData.Default());
                //centralReport.PreliminaryMemberData.Should().Be(overrideReportData
                //    ? MemberData.Default()
                //    : testParams.centralReportData.PreliminaryMemberData);
                //centralReport.PreliminaryMemberGeneratedData.Should().Be(MemberData.Default());
                //centralReport.WorkerMeetingProgramData.Should().Be(overrideReportData
                //    ? MeetingProgramData.Default()
                //    : testParams.centralReportData.WorkerMeetingProgramData);
                //centralReport.WorkerMeetingProgramGeneratedData.Should().Be(MeetingProgramData.Default());
                centralReport.Timestamp.Should().Be(now);
                centralReport.IsDeleted.Should().Be(false);

                evt.Should().BeEquivalentTo(testParams.expectedEvt, e => e.Excluding(p => p.SerializedData));
                evt.SerializedData.Should().NotBe(null);
            });
        }
        public async Task Handle_UnSubmitPromotedPlan(OrganizationType organizationType, ReportingFrequency reportingFrequency)
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var username      = DataProvider.Get <string>();
                var year          = 2019;
                var reportingTerm = ReportingTerm.One;
                var organization  = new OrganizationBuilder()
                                    .SetOrganizationType(organizationType)
                                    .SetReportingFreQuency(reportingFrequency)
                                    .BuildAndPersist(s);

                Report report = new ReportBuilder()
                                .SetOrganization(organization)
                                .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingTerm, year))
                                .Build();
                report.MarkStatusAsPlanPromoted();
                s.Save(report);

                EntityReference reportRef = report;
                var expectedEvt           = Test.CreateInstance <IReportUnSubmitted>(e =>
                {
                    e.Organization = organization;
                    e.Username     = username;
                    e.Report       = reportRef;
                });

                return(new
                {
                    Cmd = new UnSubmitReportCommand(report.Id),
                    Organization = organization,
                    Report = report,
                    username,
                    expectedEvt
                });
            });

            var context = await Endpoint.Act <UnSubmitReportCommandHandler>(AssemblySetupFixture.EndpointTestContainer,
                                                                            (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <IReportUnSubmitted>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var report = s.Get <Report>(testParams.Cmd.ReportId);
                report.Should().NotBeNull();
                report.Should().BeEquivalentTo(testParams.Report, e => e.Excluding(p => p.ReportStatus));
                report.ReportStatus.Should().Be(ReportStatus.Draft);

                evt.Should().BeEquivalentTo(testParams.expectedEvt, e => e.Excluding(p => p.SerializedData));
                evt.SerializedData.Should().NotBe(null);
            });
        }
Example #8
0
        public async Task Handle_SavesRecord(OrganizationType newOrganizationType, ReportingFrequency newReportingFrequency)
        {
            var now      = DateTimeDbTestExtensions.SetUtcNowToRandomDate();
            var username = DataProvider.Get <string>();


            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var org = new OrganizationBuilder().BuildAndPersist(s);

                EntityReference parent;
                switch (newOrganizationType)
                {
                case OrganizationType.State:
                    parent = new OrganizationBuilder().SetOrganizationType(OrganizationType.Central).BuildAndPersist(s);
                    break;

                case OrganizationType.Zone:
                case OrganizationType.Unit:
                    parent = new OrganizationBuilder().SetOrganizationType(OrganizationType.State).BuildAndPersist(s);
                    break;

                default:
                    parent = new OrganizationBuilder().SetOrganizationType(OrganizationType.Central).BuildAndPersist(s);
                    break;
                }

                var newDescription = DataProvider.Get <string>();
                var newDetails     = DataProvider.Get <string>();

                var expectedEvt = Test.CreateInstance <IOrganizationUpdated>(e =>
                {
                    e.Organization = new OrganizationReference(org.Id, newOrganizationType, newDescription, newDetails, newReportingFrequency);
                    e.Username     = username;
                });

                return(new
                {
                    username,
                    expectedEvt,
                    Cmd = new UpdateOrganizationCommand(org.Id, newDescription, newDetails, newOrganizationType, newReportingFrequency, parent)
                });
            });

            var context = await Endpoint.Act <UpdateOrganizationCommandHandler>(AssemblySetupFixture.EndpointTestContainer,
                                                                                (h, ctx) =>
            {
                ctx.SetUsernameOnHeader(testParams.username);
                return(h.Handle(testParams.Cmd, ctx));
            });

            var evt = context.ExpectPublish <IOrganizationUpdated>();

            Endpoint.AssertOnSqlSessionThat(AssemblySetupFixture.EndpointTestContainer,
                                            s =>
            {
                var organization = s.Query <Organization>().Single(x => x.Id == testParams.Cmd.OrganizationId);
                organization.Should().NotBeNull();
                organization.OrganizationType.Should().Be(testParams.Cmd.OrganizationType);
                organization.ReportingFrequency.Should().Be(testParams.Cmd.ReportingFrequency);
                organization.Description.Should().Be(testParams.Cmd.Description);
                organization.Details.Should().Be(testParams.Cmd.Details);
                organization.Parent.Should().Be(testParams.Cmd.Parent);
                organization.Timestamp.Should().Be(now);
                organization.IsDeleted.Should().Be(false);
            });

            evt.Should().BeEquivalentTo(testParams.expectedEvt, e => e.Excluding(p => p.SerializedData));
            evt.SerializedData.Should().NotBe(null);
        }
        public static Dictionary <string, Organization> SetupOrzanizations(ReportingFrequency centralReportingFrequency = ReportingFrequency.Yearly,
                                                                           ReportingFrequency stateReportingFrequency   = ReportingFrequency.Yearly,
                                                                           ReportingFrequency zoneReportingFrequency    = ReportingFrequency.Yearly,
                                                                           ReportingFrequency unitReportingFrequency    = ReportingFrequency.Quarterly)
        {
            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var central = new OrganizationBuilder()
                              .SetDescription(Central)
                              .SetOrganizationType(OrganizationType.Central)
                              .SetReportingFreQuency(centralReportingFrequency)
                              .SetParent(Organization.Root)
                              .BuildAndPersist(s);

                var victoriaState = new OrganizationBuilder()
                                    .SetDescription(VictoriaState)
                                    .SetOrganizationType(OrganizationType.State)
                                    .SetReportingFreQuency(stateReportingFrequency)
                                    .SetParent(central)
                                    .BuildAndPersist(s);

                var footscray = new OrganizationBuilder()
                                .SetDescription(Footscray)
                                .SetOrganizationType(OrganizationType.Unit)
                                .SetReportingFreQuency(unitReportingFrequency)
                                .SetParent(victoriaState)
                                .BuildAndPersist(s);

                var truganinaNorth = new OrganizationBuilder()
                                     .SetDescription(TruganinaNorth)
                                     .SetOrganizationType(OrganizationType.Unit)
                                     .SetReportingFreQuency(unitReportingFrequency)
                                     .SetParent(victoriaState)
                                     .BuildAndPersist(s);

                var nswState = new OrganizationBuilder()
                               .SetDescription(NswState)
                               .SetOrganizationType(OrganizationType.State)
                               .SetReportingFreQuency(stateReportingFrequency)
                               .SetParent(central)
                               .BuildAndPersist(s);

                var nswStateZone1 = new OrganizationBuilder()
                                    .SetDescription(NswZoneOne)
                                    .SetOrganizationType(OrganizationType.Zone)
                                    .SetReportingFreQuency(zoneReportingFrequency)
                                    .SetParent(nswState)
                                    .BuildAndPersist(s);

                var lakemba = new OrganizationBuilder()
                              .SetDescription(Lakemba)
                              .SetOrganizationType(OrganizationType.Unit)
                              .SetReportingFreQuency(unitReportingFrequency)
                              .SetParent(nswStateZone1)
                              .BuildAndPersist(s);

                var minto = new OrganizationBuilder()
                            .SetDescription(Minto)
                            .SetOrganizationType(OrganizationType.Unit)
                            .SetReportingFreQuency(unitReportingFrequency)
                            .SetParent(nswStateZone1)
                            .BuildAndPersist(s);

                var data = new Dictionary <string, Organization>
                {
                    { central.Description, central },
                    { victoriaState.Description, victoriaState },
                    { footscray.Description, footscray },
                    { truganinaNorth.Description, truganinaNorth },
                    { nswState.Description, nswState },
                    { nswStateZone1.Description, nswStateZone1 },
                    { lakemba.Description, lakemba },
                    { minto.Description, minto }
                };

                return(data);
            });

            return(testParams);
        }
        public void CreateNewPlan_For_State_Unit_SavesMemberDataCorrectly(
            bool thisPeriodSubmitted,
            bool lastPeriod1Submitted,
            bool lastPeriod2Submitted
            )
        {
            DateTimeDbTestExtensions.SetUtcNowToRandomDate();
            var reportingTerms = ReportingPeriod.GetReportingTerms(reportingFrequency);

            if (reportingTerms.All(o => o != reportingTerm))
            {
                return;
            }

            var testParams = Endpoint.ArrangeOnSqlSession(AssemblySetupFixture.EndpointTestContainer,
                                                          s =>
            {
                var organizations = IntegrationTestOrganizationHelper.SetupOrzanizations(
                    stateReportingFrequency: reportingFrequency,
                    zoneReportingFrequency: ReportingFrequency.Monthly);

                var nswState  = organizations.First(o => o.Key == IntegrationTestOrganizationHelper.NswState).Value;
                var laPerouse = new OrganizationBuilder()
                                .SetDescription("La perouse")
                                .SetOrganizationType(OrganizationType.Unit)
                                .SetReportingFreQuency(ReportingFrequency.Monthly)
                                .SetParent(nswState)
                                .BuildAndPersist(s);

                var lalorPark = new OrganizationBuilder()
                                .SetDescription("Lalor park")
                                .SetOrganizationType(OrganizationType.Unit)
                                .SetReportingFreQuency(ReportingFrequency.Monthly)
                                .SetParent(nswState)
                                .BuildAndPersist(s);

                var description = DataProvider.Get <string>();
                var year        = 2019;
                OrganizationReference organizationRef = nswState;

                var reportingPeriod = new ReportingPeriod(reportingFrequency, reportingTerm, year);
                var expected        = new StateReportBuilder()
                                      .SetDescription(description)
                                      .SetOrganization(organizationRef)
                                      .SetReportingPeriod(new ReportingPeriod(reportingFrequency, reportingPeriod.ReportingTerm,
                                                                              reportingPeriod.Year))
                                      .Build();


                var lastPeriod1 = reportingPeriod.GetReportingPeriodOfPreviousTerm();
                var lastPeriod2 = lastPeriod1.GetReportingPeriodOfPreviousTerm();

                var laPerouseThisPeriodUnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(thisPeriodSubmitted, laPerouse, reportingPeriod, s);
                var laPerouseLastPeriod1UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod1Submitted, laPerouse, lastPeriod1, s);
                var laPerouseLastPeriod2UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod2Submitted, laPerouse, lastPeriod2, s);

                var lalorParkThisPeriodUnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(thisPeriodSubmitted, lalorPark, reportingPeriod, s);
                var lalorParkLastPeriod1UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod1Submitted, lalorPark, lastPeriod1, s);
                var lalorParkLastPeriod2UnitReport =
                    IntegrationTestStateReportHelper.BuildAndPersistUnitReport(lastPeriod2Submitted, lalorPark, lastPeriod2, s);

                var laPerouseUnitReports = new[]
                {
                    laPerouseThisPeriodUnitReport,
                    laPerouseLastPeriod1UnitReport,
                    laPerouseLastPeriod2UnitReport,
                };

                var lalorParkeUnitReports = new[]
                {
                    lalorParkThisPeriodUnitReport,
                    lalorParkLastPeriod1UnitReport,
                    lalorParkLastPeriod2UnitReport,
                };

                var lastSubmittedLapeRouseReport = IntegrationTestStateReportHelper.GetLastSubmittedReport(laPerouseUnitReports, reportingPeriod);
                var lastSubmittedLalorParkReport = IntegrationTestStateReportHelper.GetLastSubmittedReport(lalorParkeUnitReports, reportingPeriod);

                var submittedReports = new[] { lastSubmittedLapeRouseReport, lastSubmittedLalorParkReport }.Where(o => o != null).ToArray();

                var expectedMemberMemberData               = IntegrationTestStateReportHelper.GetExpectedMemberData(submittedReports, nameof(StateReport.MemberMemberData));
                var expectedMemberMemberGeneratedData      = expectedMemberMemberData;
                var expectedAssociateMemberData            = IntegrationTestStateReportHelper.GetExpectedMemberData(submittedReports, nameof(StateReport.AssociateMemberData));
                var expectedAssociateMemberGeneratedData   = expectedAssociateMemberData;
                var expectedPreliminaryMemberData          = IntegrationTestStateReportHelper.GetExpectedMemberData(submittedReports, nameof(StateReport.PreliminaryMemberData));
                var expectedPreliminaryMemberGeneratedData = expectedPreliminaryMemberData;
                var expectedSupporterMemberData            = IntegrationTestStateReportHelper.GetExpectedMemberData(submittedReports, nameof(StateReport.SupporterMemberData));
                var expectedSupporterMemberGeneratedData   = expectedSupporterMemberData;

                return(new
                {
                    description,
                    reportingPeriod,
                    organizationRef,
                    expected,
                    expectedMemberMemberData,
                    expectedMemberMemberGeneratedData,
                    expectedAssociateMemberData,
                    expectedAssociateMemberGeneratedData,
                    expectedPreliminaryMemberData,
                    expectedPreliminaryMemberGeneratedData,
                    expectedSupporterMemberData,
                    expectedSupporterMemberGeneratedData,
                });
            });
            var result = Endpoint.Act(AssemblySetupFixture.EndpointTestContainer,
                                      c =>
            {
                var stateReport = c.GetInstance <IStateReportFactory>()
                                  .CreateNewStatePlan(testParams.description,
                                                      testParams.organizationRef,
                                                      testParams.reportingPeriod.ReportingTerm,
                                                      testParams.reportingPeriod.Year,
                                                      reportingFrequency);
                return(new
                {
                    stateReport
                });
            });

            result.stateReport.Should().NotBeNull();

            //no need to repeat this section for the other field types
            result.stateReport.Should().BeEquivalentTo(testParams.expected, e =>
                                                       e.Excluding(p => p.Id)
                                                       .Excluding(p => p.MemberMemberData)
                                                       .Excluding(p => p.MemberMemberGeneratedData)
                                                       .Excluding(p => p.AssociateMemberData)
                                                       .Excluding(p => p.AssociateMemberGeneratedData)
                                                       .Excluding(p => p.PreliminaryMemberData)
                                                       .Excluding(p => p.PreliminaryMemberGeneratedData)
                                                       .Excluding(p => p.SupporterMemberData)
                                                       .Excluding(p => p.SupporterMemberGeneratedData)

                                                       .Excluding(p => p.WorkerMeetingProgramData)
                                                       .Excluding(p => p.WorkerMeetingProgramGeneratedData)
                                                       .Excluding(p => p.DawahMeetingProgramData)
                                                       .Excluding(p => p.DawahMeetingProgramGeneratedData)
                                                       .Excluding(p => p.StateLeaderMeetingProgramData)
                                                       .Excluding(p => p.StateLeaderMeetingProgramGeneratedData)
                                                       .Excluding(p => p.StateOutingMeetingProgramData)
                                                       .Excluding(p => p.StateOutingMeetingProgramGeneratedData)
                                                       .Excluding(p => p.IftarMeetingProgramData)
                                                       .Excluding(p => p.IftarMeetingProgramGeneratedData)
                                                       .Excluding(p => p.LearningMeetingProgramData)
                                                       .Excluding(p => p.LearningMeetingProgramGeneratedData)
                                                       .Excluding(p => p.SocialDawahMeetingProgramData)
                                                       .Excluding(p => p.SocialDawahMeetingProgramGeneratedData)
                                                       .Excluding(p => p.DawahGroupMeetingProgramData)
                                                       .Excluding(p => p.DawahGroupMeetingProgramGeneratedData)
                                                       .Excluding(p => p.NextGMeetingProgramData)
                                                       .Excluding(p => p.NextGMeetingProgramGeneratedData)

                                                       .Excluding(p => p.CmsMeetingProgramData)
                                                       .Excluding(p => p.CmsMeetingProgramGeneratedData)
                                                       .Excluding(p => p.SmMeetingProgramData)
                                                       .Excluding(p => p.SmMeetingProgramGeneratedData)
                                                       .Excluding(p => p.MemberMeetingProgramData)
                                                       .Excluding(p => p.MemberMeetingProgramGeneratedData)
                                                       .Excluding(p => p.TafsirMeetingProgramData)
                                                       .Excluding(p => p.TafsirMeetingProgramGeneratedData)
                                                       .Excluding(p => p.UnitMeetingProgramData)
                                                       .Excluding(p => p.UnitMeetingProgramGeneratedData)
                                                       .Excluding(p => p.FamilyVisitMeetingProgramData)
                                                       .Excluding(p => p.FamilyVisitMeetingProgramGeneratedData)
                                                       .Excluding(p => p.EidReunionMeetingProgramData)
                                                       .Excluding(p => p.EidReunionMeetingProgramGeneratedData)
                                                       .Excluding(p => p.BbqMeetingProgramData)
                                                       .Excluding(p => p.BbqMeetingProgramGeneratedData)
                                                       .Excluding(p => p.GatheringMeetingProgramData)
                                                       .Excluding(p => p.GatheringMeetingProgramGeneratedData)
                                                       .Excluding(p => p.OtherMeetingProgramData)
                                                       .Excluding(p => p.OtherMeetingProgramGeneratedData)

                                                       .Excluding(p => p.GroupStudyTeachingLearningProgramData)
                                                       .Excluding(p => p.GroupStudyTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.StudyCircleTeachingLearningProgramData)
                                                       .Excluding(p => p.StudyCircleTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.PracticeDarsTeachingLearningProgramData)
                                                       .Excluding(p => p.PracticeDarsTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.StateLearningCampTeachingLearningProgramData)
                                                       .Excluding(p => p.StateLearningCampTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.QuranStudyTeachingLearningProgramData)
                                                       .Excluding(p => p.QuranStudyTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.QuranClassTeachingLearningProgramData)
                                                       .Excluding(p => p.QuranClassTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.MemorizingAyatTeachingLearningProgramData)
                                                       .Excluding(p => p.MemorizingAyatTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.StateLearningSessionTeachingLearningProgramData)
                                                       .Excluding(p => p.StateLearningSessionTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.StateQiyamulLailTeachingLearningProgramData)
                                                       .Excluding(p => p.StateQiyamulLailTeachingLearningProgramGeneratedData)

                                                       .Excluding(p => p.StudyCircleForAssociateMemberTeachingLearningProgramData)
                                                       .Excluding(p => p.StudyCircleForAssociateMemberTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.HadithTeachingLearningProgramData)
                                                       .Excluding(p => p.HadithTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.WeekendIslamicSchoolTeachingLearningProgramData)
                                                       .Excluding(p => p.WeekendIslamicSchoolTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.MemorizingHadithTeachingLearningProgramData)
                                                       .Excluding(p => p.MemorizingHadithTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.MemorizingDoaTeachingLearningProgramData)
                                                       .Excluding(p => p.MemorizingDoaTeachingLearningProgramGeneratedData)
                                                       .Excluding(p => p.OtherTeachingLearningProgramData)
                                                       .Excluding(p => p.OtherTeachingLearningProgramGeneratedData)

                                                       .Excluding(p => p.BookSaleMaterialData)
                                                       .Excluding(p => p.BookSaleMaterialGeneratedData)
                                                       .Excluding(p => p.BookDistributionMaterialData)
                                                       .Excluding(p => p.BookDistributionMaterialGeneratedData)
                                                       .Excluding(p => p.BookLibraryStockData)
                                                       .Excluding(p => p.BookLibraryStockGeneratedData)
                                                       .Excluding(p => p.OtherSaleMaterialData)
                                                       .Excluding(p => p.OtherSaleMaterialGeneratedData)
                                                       .Excluding(p => p.OtherDistributionMaterialData)
                                                       .Excluding(p => p.OtherDistributionMaterialGeneratedData)
                                                       .Excluding(p => p.OtherLibraryStockData)
                                                       .Excluding(p => p.OtherLibraryStockGeneratedData)
                                                       .Excluding(p => p.VhsSaleMaterialData)
                                                       .Excluding(p => p.VhsSaleMaterialGeneratedData)
                                                       .Excluding(p => p.VhsDistributionMaterialData)
                                                       .Excluding(p => p.VhsDistributionMaterialGeneratedData)
                                                       .Excluding(p => p.VhsLibraryStockData)
                                                       .Excluding(p => p.VhsLibraryStockGeneratedData)
                                                       .Excluding(p => p.EmailDistributionMaterialData)
                                                       .Excluding(p => p.EmailDistributionMaterialGeneratedData)
                                                       .Excluding(p => p.IpdcLeafletDistributionMaterialData)
                                                       .Excluding(p => p.IpdcLeafletDistributionMaterialGeneratedData)
                                                       .Excluding(p => p.BaitulMalFinanceData)
                                                       .Excluding(p => p.BaitulMalFinanceGeneratedData)
                                                       .Excluding(p => p.ADayMasjidProjectFinanceData)
                                                       .Excluding(p => p.ADayMasjidProjectFinanceGeneratedData)
                                                       .Excluding(p => p.MasjidTableBankFinanceData)
                                                       .Excluding(p => p.MasjidTableBankFinanceGeneratedData)


                                                       .Excluding(p => p.QardeHasanaSocialWelfareData)
                                                       .Excluding(p => p.QardeHasanaSocialWelfareGeneratedData)
                                                       .Excluding(p => p.PatientVisitSocialWelfareData)
                                                       .Excluding(p => p.PatientVisitSocialWelfareGeneratedData)
                                                       .Excluding(p => p.SocialVisitSocialWelfareData)
                                                       .Excluding(p => p.SocialVisitSocialWelfareGeneratedData)
                                                       .Excluding(p => p.TransportSocialWelfareData)
                                                       .Excluding(p => p.TransportSocialWelfareGeneratedData)
                                                       .Excluding(p => p.ShiftingSocialWelfareData)
                                                       .Excluding(p => p.ShiftingSocialWelfareGeneratedData)
                                                       .Excluding(p => p.ShoppingSocialWelfareData)
                                                       .Excluding(p => p.ShoppingSocialWelfareGeneratedData)
                                                       .Excluding(p => p.FoodDistributionSocialWelfareData)
                                                       .Excluding(p => p.FoodDistributionSocialWelfareGeneratedData)
                                                       .Excluding(p => p.CleanUpAustraliaSocialWelfareData)
                                                       .Excluding(p => p.CleanUpAustraliaSocialWelfareGeneratedData)
                                                       .Excluding(p => p.OtherSocialWelfareData)
                                                       .Excluding(p => p.OtherSocialWelfareGeneratedData)

                                                       );

            result.stateReport.MemberMemberData.Should().BeEquivalentTo(testParams.expectedMemberMemberData);
            result.stateReport.MemberMemberGeneratedData.Should().BeEquivalentTo(testParams.expectedMemberMemberGeneratedData);

            result.stateReport.AssociateMemberData.Should().BeEquivalentTo(testParams.expectedAssociateMemberData);
            result.stateReport.AssociateMemberGeneratedData.Should().BeEquivalentTo(testParams.expectedAssociateMemberGeneratedData);

            result.stateReport.PreliminaryMemberData.Should().BeEquivalentTo(testParams.expectedPreliminaryMemberData);
            result.stateReport.PreliminaryMemberGeneratedData.Should().BeEquivalentTo(testParams.expectedPreliminaryMemberGeneratedData);

            result.stateReport.SupporterMemberData.Should().BeEquivalentTo(testParams.expectedSupporterMemberData);
            result.stateReport.SupporterMemberGeneratedData.Should().BeEquivalentTo(testParams.expectedSupporterMemberGeneratedData);
        }