Пример #1
0
        protected void Apply(RecruitmentFormSubmitted e)
        {
            ResetResignationData();

            SubmissionDateTime = e.SubmissionDate;
            FirstName          = e.FirstName;
            LastName           = e.LastName;
            Email       = e.Email;
            PhoneNumber = e.PhoneNumber;
            Region      = e.Region;
            PreferredLecturingCities = e.PreferredLecturingCities;
            PreferredTrainingIds     = e.PreferredTrainingIds;
            CampaignId = e.CampaignID;
        }
        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);
        }
Пример #3
0
        public Result <Nothing, Error> SubmitRecruitmentForm(SubmitRecruitmentForm.Command command, IReadOnlyCollection <Training> preferredTrainings, Instant now)
        {
            Guard.Against.Null(command, nameof(command));
            Guard.Against.Null(preferredTrainings, nameof(preferredTrainings));
            Guard.Against.Default(now, nameof(now));

            return
                (Validate(new SubmitRecruitmentForm.Validator(), command)
                 .Ensure(
                     _ => preferredTrainings.Select(x => x.ID).OrderBy(x => x).SequenceEqual(command.PreferredTrainingIds.OrderBy(x => x)),
                     new Error.ResourceNotFound(SubmitRecruitmentForm_ErrorMessages.SomeTrainingsWereNotFound))
                 .Ensure(
                     _ => preferredTrainings.Select(x => x.Campaign).Distinct().Count() == 1,
                     new Error.DomainError(SubmitRecruitmentForm_ErrorMessages.PreferredTrainingsMustBelongToTheSameCampaign))
                 .Ensure(
                     _ => preferredTrainings.First().Campaign.Interval.Contains(now),
                     new Error.DomainError(SubmitRecruitmentForm_ErrorMessages.SubmissionMustOccurDuringCampaign))
                 .Ensure(
                     _ => preferredTrainings.All(x => x.StartDateTime.ToInstant() > now),
                     new Error.DomainError(SubmitRecruitmentForm_ErrorMessages.PreferredTrainingsMustOccurInTheFuture))
                 .Tap(() => Emit(RecruitmentFormSubmitted.From(command, now, preferredTrainings.First().Campaign.Id))));
        }