public async Task Command_must_specify_at_least_one_training()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "Wolne Miasto Gdańsk",
                    PreferredLecturingCities = new[] { "Wolne Miasto Gdańsk" },
                    PreferredTrainingIds     = Array.Empty <int>(),
                    GdprConsentGiven         = true
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsFailure);
                var error = Assert.IsType <Error.ValidationFailed>(result.Error);
                AssertHelpers.SingleError(nameof(command.PreferredTrainingIds), SubmitRecruitmentForm_ErrorMessages.PreferredTrainingsMustBeSpecified, error.Failures);
            }
        }
        public async Task Valid_command_emits_single_EmailSent_event_when_EmailService_sends_email()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "Wolne Miasto Gdańsk",
                    PreferredLecturingCities = new[] { "Wadowice" },
                    PreferredTrainingIds     = new[] { 1 },
                    GdprConsentGiven         = true
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsSuccess);
                var eventStore = scope.ServiceProvider.GetRequiredService <EventFlow.EventStores.IEventStore>();
                var events     = await eventStore.LoadAllEventsAsync(EventFlow.EventStores.GlobalPosition.Start, 2, System.Threading.CancellationToken.None);

                var domainEvent = Assert.Single(events.DomainEvents, ev => ev.EventType == typeof(EmailSent));
                var ev          = Assert.IsType <EmailSent>(domainEvent.GetAggregateEvent());
                Assert.Equal(SubmitRecruitmentFormHandler.MessageTitle, ev.Subject);
            }
        }
        public async Task Command_MustContain_SubmissionDate_FirstName_LastName_EmailAddress_PhoneNumber_AboutMe()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    PreferredTrainingIds = new[] { 1 }, GdprConsentGiven = true
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsFailure);
                var error = Assert.IsType <Error.ValidationFailed>(result.Error);
                Assert.Collection(error.Failures,
                                  error => AssertHelpers.SingleError(nameof(command.FirstName), SubmitRecruitmentForm_ErrorMessages.FirstNameIsRequired, error),
                                  error => AssertHelpers.SingleError(nameof(command.LastName), SubmitRecruitmentForm_ErrorMessages.LastNameIsRequired, error),
                                  error => AssertHelpers.SingleError(nameof(command.Email), SubmitRecruitmentForm_ErrorMessages.EmailIsRequired, error),
                                  error => AssertHelpers.SingleError(nameof(command.PhoneNumber), SubmitRecruitmentForm_ErrorMessages.PhoneNumberIsRequired, error),
                                  error => AssertHelpers.SingleError(nameof(command.AboutMe), SubmitRecruitmentForm_ErrorMessages.AboutMeIsRequired, error),
                                  error => AssertHelpers.SingleError(nameof(command.Region), SubmitRecruitmentForm_ErrorMessages.RegionIsRequired, error),
                                  error => AssertHelpers.SingleError(nameof(command.PreferredLecturingCities), SubmitRecruitmentForm_ErrorMessages.PreferredLecturingCities_must_be_specified, error)
                                  );
            }
        }
Example #4
0
        public async Task Trainings_happening_at_the_moment_of_query_have_Timing_flag_set_to_HappeningNow()
        {
            var clock = NodaTime.Testing.FakeClock.FromUtc(2019, 08, 01);

            var sp = new ServiceProviderBuilder().BuildServiceProvider(services =>
            {
                ConfigureServices(services);
                services.Remove <NodaTime.IClock>();
                services.AddSingleton <NodaTime.IClock>(clock);
            });

            using (var scope = sp.CreateScope())
            {
                var dbSessionProvider = scope.ServiceProvider.GetRequiredService <DbSessionProvider>();
                var campaign          = new Campaign(
                    startDateTime: new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    endDateTime: new NodaTime.LocalDateTime(2019, 09, 30, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    editionId: 1, name: "campaign");
                campaign.ScheduleTraining(new Training(
                                              "Papieska 1", "Wadowice",
                                              new NodaTime.LocalDateTime(2019, 10, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));
                campaign.ScheduleTraining(new Training(
                                              "Papieska 2", "Sosnowiec",
                                              new NodaTime.LocalDateTime(2019, 11, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 11, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));

                var session = dbSessionProvider.CreateSession();
                await session.SaveAsync(campaign);

                Assert.Equal(1, campaign.Id);
            }

            clock.Reset(NodaTime.Instant.FromDateTimeUtc(new DateTime(2019, 10, 01, 14, 00, 00, DateTimeKind.Utc)));

            using (var scope = sp.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

                var results = await mediator.Send(new Recruitment.Trainings.Index.Query());

                var singleResult = Assert.Single(results, x => x.Timing == Recruitment.Trainings.TrainingTiming.Future);
                Assert.Equal("Sosnowiec", singleResult.City);
            }
        }
        public async Task After_executing_command_enrollments_contain_that_submission()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "Wolne Miasto Gdańsk",
                    PreferredLecturingCities = new[] { "Wadowice" },
                    PreferredTrainingIds     = new[] { 1 },
                    GdprConsentGiven         = true
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsSuccess);
            }

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var results = await engine.Query(new GetSubmissions.Query());

                var readModel = Assert.Single(results);
                var id        = EnrollmentAggregate.EnrollmentId.With(readModel.Id);
                Assert.Equal("Andrzej", readModel.FirstName);
                Assert.Equal("Strzelba", readModel.LastName);
                Assert.Equal(EmailAddress.Parse("*****@*****.**"), readModel.Email);
                Assert.Equal(Consts.FakePhoneNumber, readModel.PhoneNumber);
                Assert.Equal("ala ma kota", readModel.AboutMe);
                Assert.Equal(1, readModel.Campaign.ID);
                Assert.Equal("Wolne Miasto Gdańsk", readModel.Region);
                var preferredTraining = Assert.Single(readModel.PreferredTrainings);
                Assert.Equal(1, preferredTraining.ID);
                Assert.Single(readModel.PreferredLecturingCities, "Wadowice");
            }
        }
Example #6
0
        public async Task Query_with_specified_coordinator_returns_trainings_conducted_by_that_coordinator()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var dbSessionProvider = scope.ServiceProvider.GetRequiredService <DbSessionProvider>();
                var campaign          = new Campaign(
                    startDateTime: new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    endDateTime: new NodaTime.LocalDateTime(2019, 09, 30, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    editionId: 1, name: "campaign");
                campaign.ScheduleTraining(new Training(
                                              "Papieska 1", "Wadowice",
                                              new NodaTime.LocalDateTime(2019, 10, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));
                campaign.ScheduleTraining(new Training(
                                              "Papieska 2", "Sosnowiec",
                                              new NodaTime.LocalDateTime(2019, 10, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              Guid.NewGuid()));

                var session = dbSessionProvider.CreateSession();
                await session.SaveAsync(campaign);

                Assert.Equal(1, campaign.Id);
            }

            using (var scope = sp.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

                var results = await mediator.Send(new Recruitment.Trainings.Index.Query()
                {
                    CoordinatorId = trainerID
                });

                var singleResult = Assert.Single(results);
                Assert.Equal("Wadowice", singleResult.City);
                Assert.Equal(trainerID, singleResult.CoordinatorID);
            }
        }
Example #7
0
        public async Task Query_with_specified_From_returns_trainings_beginning_after_that_instant()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var dbSessionProvider = scope.ServiceProvider.GetRequiredService <DbSessionProvider>();
                var campaign          = new Campaign(
                    startDateTime: new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    endDateTime: new NodaTime.LocalDateTime(2019, 09, 30, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    editionId: 1, name: "campaign");
                campaign.ScheduleTraining(new Training(
                                              "Papieska 1", "Wadowice",
                                              new NodaTime.LocalDateTime(2019, 10, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));
                campaign.ScheduleTraining(new Training(
                                              "Papieska 2", "Wadowice",
                                              new NodaTime.LocalDateTime(2019, 10, 15, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 15, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));

                var session = dbSessionProvider.CreateSession();
                await session.SaveAsync(campaign);

                Assert.Equal(1, campaign.Id);
            }

            using (var scope = sp.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

                var results = await mediator.Send(new Recruitment.Trainings.Index.Query()
                {
                    From = new NodaTime.LocalDateTime(2019, 10, 01, 13, 00).InMainTimezone().ToOffsetDateTime().ToInstant()
                });

                var singleResult = Assert.Single(results);
                Assert.Equal("Papieska 2", singleResult.Address);
            }
        }
Example #8
0
        public async Task Empty_repository_returns_no_trainings()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var dbSession = scope.ServiceProvider.GetRequiredService <DbSessionProvider>();
                var campaign  = new Campaign(
                    startDateTime: new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    endDateTime: new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    editionId: 1, name: "test");
            }

            using (var scope = sp.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

                var results = await mediator.Send(new Recruitment.Trainings.Index.Query());

                Assert.Empty(results);
            }
        }
        public async Task Querying_for_existing_enrollment_returns_that_enrollment_events()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "Wolne Miasto Gdańsk",
                    PreferredLecturingCities = new[] { "Wadowice" },
                    PreferredTrainingIds     = new[] { 1 },
                    GdprConsentGiven         = true
                };
                var result = await engine.Execute(command);

                Assert.True(result.IsSuccess);
            }

            using (var scope = sp.CreateScope())
            {
                var engine      = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var enrollments = await engine.Query(new GetSubmissions.Query());

                var result = await engine.Query(new GetEnrollmentDetails.QueryByEnrollmentId()
                {
                    EnrollmentID = enrollments.Single().Id
                });

                Assert.True(result.IsSuccess);
                var enrollment = result.Value;
                Assert.Contains(enrollment.Events, evt => evt.GetType() == typeof(GetEnrollmentDetails.RecruitmentFormSubmittedEventData));
            }
        }
        public async Task If_no_campaign_is_currently_open__handler_returns_Maybe_None()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var dbSession = scope.ServiceProvider.GetRequiredService <DbSessionProvider>();
                await dbSession.CreateSession().SaveAsync(new Campaign(
                                                              startDateTime: NodaTime.SystemClock.Instance.GetOffsetDateTime().Plus(NodaTime.Duration.FromDays(7)),
                                                              endDateTime: NodaTime.SystemClock.Instance.GetOffsetDateTime().Plus(NodaTime.Duration.FromDays(14)),
                                                              editionId: 1, name: "test"));
            }

            using (var scope = sp.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

                var query  = new GetCurrentCampaign.Query();
                var result = await mediator.Send(query);

                Assert.True(result.HasNoValue);
            }
        }
        public async Task CampaignsCannotOverlap()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = sp.GetRequiredService <SharedKernel.ISzlemEngine>();
                var command = new Create.Command()
                {
                    Name          = "test",
                    StartDateTime = new NodaTime.LocalDateTime(2019, 09, 01, 12, 00, 00).InMainTimezone().ToOffsetDateTime(),
                    EndDateTime   = new NodaTime.LocalDateTime(2019, 10, 01, 12, 00, 00).InMainTimezone().ToOffsetDateTime(),
                    EditionID     = 1
                };

                var result = await engine.Execute(command);
            }

            using (var scope = sp.CreateScope())
            {
                var engine  = sp.GetRequiredService <SharedKernel.ISzlemEngine>();
                var command = new Create.Command()
                {
                    Name          = "test",
                    StartDateTime = new NodaTime.LocalDateTime(2019, 09, 01, 12, 00, 00).InMainTimezone().ToOffsetDateTime(),
                    EndDateTime   = new NodaTime.LocalDateTime(2019, 10, 01, 12, 00, 00).InMainTimezone().ToOffsetDateTime(),
                    EditionID     = 1
                };

                var result = await engine.Execute(command);

                Assert.False(result.IsSuccess);
                var error = Assert.IsType <Error.DomainError>(result.Error);
                Assert.Equal(Create.ErrorMessages.CampaignsCannotOverlap, error.Message);
            }
        }
        public async Task Querying_for_nonexistent_enrollment_returns_not_found_failure()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var result = await engine.Query(new GetEnrollmentDetails.QueryByEnrollmentId()
                {
                    EnrollmentID = Guid.Empty
                });

                Assert.False(result.IsSuccess);
                var error = Assert.IsType <Szlem.Domain.Error.ResourceNotFound>(result.Error);
            }
        }
        public async Task Valid_command_emits_single_EmailSendingFailed_event_when_EmailService_fails_to_send_email()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(services =>
            {
                ConfigureServices(services);

                var failingEmailMock = new Mock <IEmailService>();
                failingEmailMock
                .Setup(x => x.CreateMessage(It.IsAny <EmailAddress>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <IEnumerable <EmailAttachment> >()))
                .Returns((EmailAddress email, string subject, string body, bool isHtml, IEnumerable <EmailAttachment> attachments) => new SucceedingEmailService().CreateMessage(email, subject, body, isHtml, attachments));
                failingEmailMock.Setup(x => x.Send(It.IsAny <EmailMessage>(), CancellationToken.None)).Returns(Task.FromResult(Result.Failure("error")));

                services.Remove <IEmailService>();
                services.AddSingleton(failingEmailMock.Object);
            });

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "woj. małopolskie",
                    PreferredLecturingCities = new[] { "Wadowice" },
                    PreferredTrainingIds     = new[] { 1 },
                    GdprConsentGiven         = true
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsSuccess);
                var eventStore = scope.ServiceProvider.GetRequiredService <EventFlow.EventStores.IEventStore>();
                var events     = await eventStore.LoadAllEventsAsync(EventFlow.EventStores.GlobalPosition.Start, 2, CancellationToken.None);

                var domainEvent = Assert.Single(events.DomainEvents, ev => ev.EventType == typeof(EmailSendingFailed));
                var ev          = Assert.IsType <EmailSendingFailed>(domainEvent.GetAggregateEvent());
                Assert.Equal(SubmitRecruitmentFormHandler.MessageTitle, ev.Subject);
            }
        }
        public async Task Valid_command_emits_single_RecruitmentFormSubmitted_event()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "małopolskie",
                    PreferredLecturingCities = new[] { "Wadowice" },
                    PreferredTrainingIds     = new[] { 1 },
                    GdprConsentGiven         = true
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsSuccess);
                var eventStore = scope.ServiceProvider.GetRequiredService <EventFlow.EventStores.IEventStore>();
                var events     = await eventStore.LoadAllEventsAsync(EventFlow.EventStores.GlobalPosition.Start, 2, System.Threading.CancellationToken.None);

                var domainEvent = Assert.Single(events.DomainEvents, ev => ev.EventType == typeof(RecruitmentFormSubmitted));
                var e           = Assert.IsType <RecruitmentFormSubmitted>(domainEvent.GetAggregateEvent());
                Assert.Equal("Andrzej", e.FirstName);
                Assert.Equal("Strzelba", e.LastName);
                Assert.Equal("*****@*****.**", e.Email.ToString());
                Assert.Equal(Consts.FakePhoneNumber, e.PhoneNumber);
                Assert.Equal("ala ma kota", e.AboutMe);
                Assert.Equal("małopolskie", e.Region);
                Assert.Single(e.PreferredLecturingCities, "Wadowice");
                Assert.Single(e.PreferredTrainingIds, 1);
                Assert.True(e.GdprConsentGiven);
            }
        }
        public async Task TrainingCannotBeAddedAfterCampaignStart()
        {
            var clock = NodaTime.Testing.FakeClock.FromUtc(2019, 08, 30);
            var sp    = new ServiceProviderBuilder().BuildServiceProvider(services =>
            {
                ConfigureServices(services);
                //services.Remove<NodaTime.IClock>();
                services.AddSingleton <NodaTime.IClock>(clock);
            });

            await CreateCampaign(sp, new Create.Command()
            {
                Name          = "test",
                EditionID     = 1,
                StartDateTime = new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                EndDateTime   = new NodaTime.LocalDateTime(2019, 09, 30, 12, 00).InMainTimezone().ToOffsetDateTime()
            });

            using (var scope = sp.CreateScope())
            {
                clock.AdvanceDays(3);
                var engine  = scope.ServiceProvider.GetRequiredService <Szlem.SharedKernel.ISzlemEngine>();
                var command = new ScheduleTraining.Command
                {
                    City          = "Watykan",
                    Address       = "Papieska 21/37",
                    StartDateTime = new NodaTime.LocalDateTime(2019, 09, 15, 10, 00),
                    EndDateTime   = new NodaTime.LocalDateTime(2019, 09, 15, 15, 00),
                    CampaignID    = 1
                };

                var result = await engine.Execute(command);

                Assert.True(result.IsFailure);
                var error = Assert.IsType <Error.DomainError>(result.Error);
                Assert.Equal(ErrorMessages.CannotScheduleTrainingAfterCampaignStart, error.Message);
            }
        }
Example #16
0
        public async Task Query_with_specified_CampaignId_returns_trainings_from_that_campaign()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var dbSessionProvider = scope.ServiceProvider.GetRequiredService <DbSessionProvider>();
                var campaign          = new Campaign(
                    startDateTime: new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    endDateTime: new NodaTime.LocalDateTime(2019, 09, 30, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    editionId: 1, name: "campaign");
                campaign.ScheduleTraining(new Training(
                                              "Papieska 1", "Wadowice",
                                              new NodaTime.LocalDateTime(2019, 10, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));
                campaign.ScheduleTraining(new Training(
                                              "Papieska 11", "Wadowice",
                                              new NodaTime.LocalDateTime(2019, 10, 02, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                              new NodaTime.LocalDateTime(2019, 10, 02, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                              trainerID));

                var campaign2 = new Campaign(
                    startDateTime: new NodaTime.LocalDateTime(2019, 10, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    endDateTime: new NodaTime.LocalDateTime(2019, 10, 30, 12, 00).InMainTimezone().ToOffsetDateTime(),
                    editionId: 1, name: "campaign2");
                campaign2.ScheduleTraining(new Training(
                                               "Papieska 2", "Wadowice",
                                               new NodaTime.LocalDateTime(2019, 11, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                               new NodaTime.LocalDateTime(2019, 11, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                               trainerID));
                campaign2.ScheduleTraining(new Training(
                                               "Papieska 22", "Wadowice",
                                               new NodaTime.LocalDateTime(2019, 11, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                                               new NodaTime.LocalDateTime(2019, 11, 01, 16, 00).InMainTimezone().ToOffsetDateTime(),
                                               trainerID));

                var session = dbSessionProvider.CreateSession();
                await session.SaveAsync(campaign);

                Assert.Equal(1, campaign.Id);
                await session.SaveAsync(campaign2);

                Assert.Equal(2, campaign2.Id);
            }

            using (var scope = sp.CreateScope())
            {
                var mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

                var results = await mediator.Send(new Recruitment.Trainings.Index.Query()
                {
                    CampaignIds = new[] { 1 }
                });

                Assert.Equal(2, results.Count);
                Assert.Collection(results,
                                  first => Assert.Equal("Papieska 1", first.Address),
                                  second => Assert.Equal("Papieska 11", second.Address)
                                  );
            }
        }
        public async Task Querying_for_existing_enrollment_returns_that_enrollment_summary()
        {
            var sp = new ServiceProviderBuilder().BuildServiceProvider(ConfigureServices);

            using (var scope = sp.CreateScope())
            {
                var engine  = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var command = new SubmitRecruitmentForm.Command()
                {
                    FirstName   = "Andrzej",
                    LastName    = "Strzelba",
                    Email       = EmailAddress.Parse("*****@*****.**"),
                    PhoneNumber = Consts.FakePhoneNumber,
                    AboutMe     = "ala ma kota",
                    Region      = "Wolne Miasto Gdańsk",
                    PreferredLecturingCities = new[] { "Wadowice" },
                    PreferredTrainingIds     = new[] { 1, 2 },
                    GdprConsentGiven         = true
                };
                var result = await engine.Execute(command);

                Assert.True(result.IsSuccess);
            }

            using (var scope = sp.CreateScope())
            {
                var engine      = scope.ServiceProvider.GetRequiredService <ISzlemEngine>();
                var enrollments = await engine.Query(new GetSubmissions.Query());

                var result = await engine.Query(new GetEnrollmentDetails.QueryByEnrollmentId()
                {
                    EnrollmentID = enrollments.Single().Id
                });

                Assert.True(result.IsSuccess);
                var enrollment = result.Value;
                Assert.Equal(enrollments.Single().Id, enrollment.ID);
                Assert.Equal("Andrzej", enrollment.FirstName);
                Assert.Equal("Strzelba", enrollment.LastName);
                Assert.Equal(EmailAddress.Parse("*****@*****.**"), enrollment.Email);
                Assert.Equal(Consts.FakePhoneNumber, enrollment.PhoneNumber);
                Assert.Single(enrollment.PreferredLecturingCities, "Wadowice");

                Assert.Collection(enrollment.PreferredTrainings,
                                  first => {
                    Assert.Equal(1, first.ID);
                    Assert.Equal(trainerID, first.CoordinatorID);
                    Assert.Equal("Jan Paweł II", first.CoordinatorName);
                    Assert.Equal("Wadowice", first.City);
                },
                                  second => {
                    Assert.Equal(2, second.ID);
                    Assert.Equal(trainerID, second.CoordinatorID);
                    Assert.Equal("Jan Paweł II", second.CoordinatorName);
                    Assert.Equal("Wadowice", second.City);
                });

                enrollment.IsCurrentSubmission.Should().BeTrue();
                enrollment.IsOldSubmission.Should().BeFalse();
                enrollment.CanRecordTrainingResults.Should().BeFalse();
            }
        }