private Impl.Entities.Training BuildPastTraining(Guid trainerId, int id)
        {
            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Minus(aWeek), now.Minus(aWeek).Plus(anHour), trainerId);

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, id);
            return(training);
        }
        private Training BuildScheduledTraining(int id, OffsetDateTime startDateTime, OffsetDateTime endDateTime)
        {
            var training = new Impl.Entities.Training(
                address: "Papieska 21/37",
                city: "Wadowice",
                startDateTime: startDateTime,
                endDateTime: endDateTime,
                coordinatorId: Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, id);
            return(training);
        }
        public async Task When_recruitment_form_is_submitted_repo_contains_its_readmodel()
        {
            // Arrange
            var repo     = new EnrollmentRepository();
            var campaign = new Impl.Entities.Campaign(now.Minus(aWeek), now.Plus(aWeek), editionId: 1);

            campaign.GetType().GetProperty(nameof(campaign.Id)).SetValue(campaign, 1);

            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Plus(2 * aWeek), now.Plus(2 * aWeek + anHour), Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            campaign.ScheduleTraining(training);

            var campaignRepo = Mock.Of <ICampaignRepository>(mock => mock.GetById(1) == Task.FromResult(campaign), MockBehavior.Strict);
            var trainingRepo = Mock.Of <ITrainingRepository>(MockBehavior.Strict);

            var readStoreManager = new ReadStoreManager(repo, campaignRepo, trainingRepo);


            // Act
            var @event = new RecruitmentFormSubmitted(
                now.ToInstant(), "Andrzej", "Strzelba",
                EmailAddress.Parse("*****@*****.**"), PhoneNumber.Parse("505551888"),
                "no elo",
                campaignID: 1, region: "Wolne Miasto Gdańsk", preferredLecturingCities: new[] { "Rumia", "Reda", "Wejherowo" }, preferredTrainingIds: new[] { 1 },
                gdprConsentGiven: true);
            var domainEvent = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(@event, new Metadata(), DateTimeOffset.Now, EnrollmentAggregate.EnrollmentId.New, 1);

            await readStoreManager.UpdateReadStoresAsync(new[] { domainEvent }, CancellationToken.None);

            // Assert
            var enrollment = Assert.Single(repo.Query());

            Assert.Equal("Andrzej Strzelba", enrollment.FullName);
            Assert.Equal(EmailAddress.Parse("*****@*****.**"), enrollment.Email);
            Assert.Equal(PhoneNumber.Parse("505551888"), enrollment.PhoneNumber);
            Assert.Equal("no elo", enrollment.AboutMe);
            Assert.Equal("Wolne Miasto Gdańsk", enrollment.Region);
            Assert.Equal(1, enrollment.Campaign.Id);
            Assert.Null(enrollment.ResumeDate);
            Assert.Collection(enrollment.PreferredLecturingCities,
                              first => Assert.Equal("Rumia", first),
                              second => Assert.Equal("Reda", second),
                              third => Assert.Equal("Wejherowo", third));
            var preferredTraining = Assert.Single(enrollment.PreferredTrainings);

            Assert.Equal("Wadowice", preferredTraining.City);
        }
        public async Task When_training_invitation_is_refused__readmodel_does_not_contain_training_ID()
        {
            // Arrange
            var id   = EnrollmentAggregate.EnrollmentId.New;
            var repo = new EnrollmentRepository();

            var campaign = new Impl.Entities.Campaign(now.Minus(3 * aWeek), now.Minus(2 * aWeek), editionId: 1);

            campaign.GetType().GetProperty(nameof(campaign.Id)).SetValue(campaign, 1);
            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Minus(2 * aWeek + anHour), now.Minus(2 * aWeek), Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            campaign.ScheduleTraining(training);
            var campaignRepo = Mock.Of <ICampaignRepository>(mock => mock.GetById(1) == Task.FromResult(campaign), MockBehavior.Strict);
            var trainingRepo = Mock.Of <ITrainingRepository>(mock => mock.GetById(1) == Task.FromResult(Maybe <Training> .From(training)), MockBehavior.Strict);

            await repo.Insert(new EnrollmentReadModel()
            {
                Id = id, SelectedTraining = new EnrollmentReadModel.TrainingSummary()
                {
                    ID = 1
                }
            });

            var readStoreManager = new ReadStoreManager(repo, campaignRepo, trainingRepo);

            // Act
            await readStoreManager.UpdateReadStoresAsync(new[] {
                new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateRefusedTrainingInvitation>(
                    new CandidateRefusedTrainingInvitation(
                        Guid.NewGuid(),
                        Recruitment.Enrollments.CommunicationChannel.IncomingPhone,
                        string.Empty, string.Empty),
                    new Metadata(), DateTimeOffset.Now, id, 1),
            },
                                                         CancellationToken.None);

            // Assert
            var enrollment = Assert.Single(repo.Query());

            Assert.Equal(id, enrollment.Id);
            Assert.Null(enrollment.SelectedTraining);
        }
        public async Task When_queried_with_flag_HasResigned_set_to_false__results_contains_enrollments_with_temporary_resignations_with_past_ResumeDate()
        {
            // Arrange
            var newCampaign = new Impl.Entities.Campaign(now.Minus(aWeek), now.Plus(aWeek), editionId: 1);

            newCampaign.GetType().GetProperty(nameof(newCampaign.Id)).SetValue(newCampaign, 1);

            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Plus(2 * aWeek), now.Plus(2 * aWeek + anHour), Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            newCampaign.ScheduleTraining(training);
            var campaignRepo = Mock.Of <ICampaignRepository>(mock =>
                                                             mock.GetById(1) == Task.FromResult(newCampaign) &&
                                                             mock.GetAll() == Task.FromResult(new[] { newCampaign } as IReadOnlyCollection <Impl.Entities.Campaign>), MockBehavior.Strict);

            var repo = new EnrollmentRepository();
            await repo.Insert(new EnrollmentReadModel()
            {
                Id       = EnrollmentAggregate.EnrollmentId.New,
                Campaign = new EnrollmentReadModel.CampaignSummary()
                {
                    Id = 1
                },
                PreferredTrainings       = Array.Empty <EnrollmentReadModel.TrainingSummary>(),
                PreferredLecturingCities = Array.Empty <string>(),
                HasResignedTemporarily   = true,
                ResumeDate = now.Minus(aDay).Date
            });

            var queryHandler = new GetSubmissionsQueryHandler(repo, campaignRepo, clock);

            // Act
            var results = await queryHandler.Handle(new Recruitment.Enrollments.GetSubmissions.Query()
            {
                HasResigned = false
            }, CancellationToken.None);

            // Assert
            var summary = Assert.Single(results);

            Assert.False(summary.HasResignedTemporarily);
            Assert.Null(summary.ResumeDate);
        }
        public async Task When_recruitment_form_from_past_recruitment_campaign_is_submitted__its_summary_has_flag_IsNewSubmission_set_to_true()
        {
            // Arrange
            var oldCampaign = new Impl.Entities.Campaign(now.Minus(Duration.FromDays(30)), now.Minus(Duration.FromDays(25)), editionId: 1);

            oldCampaign.GetType().GetProperty(nameof(oldCampaign.Id)).SetValue(oldCampaign, 1);

            var newCampaign = new Impl.Entities.Campaign(now.Minus(aWeek), now.Plus(aWeek), editionId: 1);

            newCampaign.GetType().GetProperty(nameof(newCampaign.Id)).SetValue(newCampaign, 2);

            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Plus(2 * aWeek), now.Plus(2 * aWeek + anHour), Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            newCampaign.ScheduleTraining(training);
            var campaignRepo = Mock.Of <ICampaignRepository>(mock =>
                                                             mock.GetById(1) == Task.FromResult(oldCampaign) &&
                                                             mock.GetById(2) == Task.FromResult(newCampaign) &&
                                                             mock.GetAll() == Task.FromResult(new[] { oldCampaign, newCampaign } as IReadOnlyCollection <Impl.Entities.Campaign>), MockBehavior.Strict);

            var repo = new EnrollmentRepository();
            await repo.Insert(new EnrollmentReadModel()
            {
                Id       = EnrollmentAggregate.EnrollmentId.New,
                Campaign = new EnrollmentReadModel.CampaignSummary()
                {
                    Id = 1
                },
                PreferredTrainings       = Array.Empty <EnrollmentReadModel.TrainingSummary>(),
                PreferredLecturingCities = Array.Empty <string>()
            });

            var queryHandler = new GetSubmissionsQueryHandler(repo, campaignRepo, clock);

            // Act
            var result = await queryHandler.Handle(new Recruitment.Enrollments.GetSubmissions.Query(), CancellationToken.None);

            // Assert
            var summary = Assert.Single(result);

            Assert.True(summary.Campaign.ID == 1);
            Assert.True(summary.IsOldSubmission);
        }
        public async Task When_temporary_resignation_is_recorded_without_providing_end_date__readmodel_has_no_suspension_end_date()
        {
            // Arrange
            var id   = EnrollmentAggregate.EnrollmentId.New;
            var repo = new EnrollmentRepository();

            var campaign = new Impl.Entities.Campaign(now.Minus(3 * aWeek), now.Minus(2 * aWeek), editionId: 1);

            campaign.GetType().GetProperty(nameof(campaign.Id)).SetValue(campaign, 1);
            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Minus(2 * aWeek + anHour), now.Minus(2 * aWeek), Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            campaign.ScheduleTraining(training);
            var campaignRepo = Mock.Of <ICampaignRepository>(mock => mock.GetById(1) == Task.FromResult(campaign), MockBehavior.Strict);
            var trainingRepo = Mock.Of <ITrainingRepository>(MockBehavior.Strict);

            await repo.Insert(new EnrollmentReadModel()
            {
                Id = id
            });

            var readStoreManager = new ReadStoreManager(repo, campaignRepo, trainingRepo);

            // Act
            await readStoreManager.UpdateReadStoresAsync(new[] {
                new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateResignedTemporarily>(
                    new CandidateResignedTemporarily(
                        Guid.NewGuid(),
                        Recruitment.Enrollments.CommunicationChannel.IncomingPhone,
                        string.Empty, string.Empty,
                        resumeDate: null),
                    new Metadata(), DateTimeOffset.Now, id, 1),
            },
                                                         CancellationToken.None);

            // Assert
            var enrollment = Assert.Single(repo.Query());

            Assert.Equal(id, enrollment.Id);
            Assert.True(enrollment.HasResignedTemporarily);
            Assert.Null(enrollment.ResumeDate);
        }
        public async Task When_candidate_obtains_lecturer_rights_Readmodel_has_flag_HasLecturerRigths_set_to_true()
        {
            // Arrange
            var id   = EnrollmentAggregate.EnrollmentId.New;
            var repo = new EnrollmentRepository();

            var campaign = new Impl.Entities.Campaign(now.Minus(3 * aWeek), now.Minus(2 * aWeek), editionId: 1);

            campaign.GetType().GetProperty(nameof(campaign.Id)).SetValue(campaign, 1);
            var training = new Impl.Entities.Training("Papieska 21/37", "Wadowice", now.Minus(2 * aWeek + anHour), now.Minus(2 * aWeek), Guid.NewGuid());

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            campaign.ScheduleTraining(training);
            var campaignRepo = Mock.Of <ICampaignRepository>(mock => mock.GetById(1) == Task.FromResult(campaign), MockBehavior.Strict);
            var trainingRepo = Mock.Of <ITrainingRepository>(MockBehavior.Strict);

            await repo.Insert(new EnrollmentReadModel()
            {
                Id = id
            });

            var readStoreManager = new ReadStoreManager(repo, campaignRepo, trainingRepo);

            // Act
            await readStoreManager.UpdateReadStoresAsync(new[] {
                new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateObtainedLecturerRights>(
                    new CandidateObtainedLecturerRights(Guid.NewGuid(), "zdobył uprawnienia"),
                    new Metadata(), DateTimeOffset.Now, id, 1),
            },
                                                         CancellationToken.None);

            // Assert
            var enrollment = Assert.Single(repo.Query());

            Assert.Equal(id, enrollment.Id);
            Assert.True(enrollment.HasLecturerRights);
        }
        private void ConfigureServices(IServiceCollection services)
        {
            var trainerProvider = new MockTrainerProvider(new[] { new TrainerDetails()
                                                                  {
                                                                      Guid = trainerID, Name = "Jan Paweł II"
                                                                  } });

            var campaign = new Impl.Entities.Campaign(CreateOffsetDateTime(-7), CreateOffsetDateTime(+7), 1, "kampania testowa");

            campaign.GetType().GetProperty(nameof(campaign.Id)).SetValue(campaign, 1);
            var training = new Impl.Entities.Training(
                address: "Papieska 21/37",
                city: "Wadowice",
                startDateTime: CreateOffsetDateTime(14),
                endDateTime: CreateOffsetDateTime(15),
                coordinatorId: trainerID);

            training.GetType().GetProperty(nameof(training.ID)).SetValue(training, 1);
            campaign.ScheduleTraining(training);

            var training2 = new Impl.Entities.Training(
                address: "Papieska 21/37",
                city: "Wadowice",
                startDateTime: CreateOffsetDateTime(45),
                endDateTime: CreateOffsetDateTime(46),
                coordinatorId: trainerID);

            training2.GetType().GetProperty(nameof(training.ID)).SetValue(training2, 2);
            campaign.ScheduleTraining(training2);

            var campaignRepoMock = new Mock <Impl.Repositories.ICampaignRepository>();

            campaignRepoMock.Setup(repo => repo.GetById(1)).ReturnsAsync(campaign);
            campaignRepoMock.Setup(repo => repo.GetAll()).ReturnsAsync(new[] { campaign });

            var trainingRepoMock = new Mock <Impl.Repositories.ITrainingRepository>();

            trainingRepoMock
            .Setup(repo => repo.GetByIds(It.IsAny <IReadOnlyCollection <int> >()))
            .ReturnsAsync(
                (IReadOnlyCollection <int> query) => new[] { training, training2 }.Where(y => query.Contains(y.ID)).ToArray()
                );

            var userAccessor = Mock.Of <IUserAccessor>(ua => ua.GetUser() == Task.FromResult(new ApplicationUser()
            {
            }));
            var authService = Mock.Of <IAuthorizationService>(service =>
                                                              service.AuthorizeAsync(It.IsAny <System.Security.Claims.ClaimsPrincipal>(), It.IsAny <object>(), It.IsAny <IEnumerable <IAuthorizationRequirement> >())
                                                              == Task.FromResult(AuthorizationResult.Success()));

            var userStore = Mock.Of <IUserStore <ApplicationUser> >(
                um => um.FindByIdAsync(It.IsAny <string>(), It.IsAny <CancellationToken>()) == Task.FromResult(new ApplicationUser()), MockBehavior.Strict);

            services.Remove <Impl.Repositories.ICampaignRepository>();
            services.Remove <Impl.Repositories.ITrainingRepository>();
            services.Remove <ITrainerProvider>();
            services.AddSingleton <Impl.Repositories.ICampaignRepository>(campaignRepoMock.Object);
            services.AddSingleton <Impl.Repositories.ITrainingRepository>(sp => trainingRepoMock.Object);
            services.AddSingleton <ITrainerProvider>(trainerProvider);
            services.AddSingleton(userAccessor);
            services.AddSingleton(authService);
            services.AddSingleton(new UserManager <ApplicationUser>(userStore, null, null, null, null, null, null, null, null));
        }