Example #1
0
        public void Training_passed_to_command_must_have_the_same_ID_as_preferred_training_or_command_throws()
        {
            // Arrange
            var training = BuildTraining(new NodaTime.LocalDateTime(2019, 09, 01, 10, 00), new NodaTime.LocalDateTime(2019, 09, 01, 12, 00), 1);
            var id       = EnrollmentAggregate.EnrollmentId.New;
            var event1   = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act & Assert
            var ex = Assert.Throws <InvalidOperationException>(() => enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 2,
                AdditionalNotes = "brak notatek",
                TrainingResult  = RecordTrainingResults.TrainingResult.PresentAndAcceptedAsLecturer
            },
                                                                                                      recordingCoordinator,
                                                                                                      new[] { training },
                                                                                                      training,
                                                                                                      NodaTime.SystemClock.Instance.GetCurrentInstant()));
        }
Example #2
0
        public void Candidate_must_be_registered_to_record_their_training_attendance()
        {
            // Arrange
            var id                   = EnrollmentAggregate.EnrollmentId.New;
            var enrollment           = new EnrollmentAggregate(id);
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                AdditionalNotes = "brak notatek"
            },
                                                          recordingCoordinator,
                                                          Array.Empty <Training>(),
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.False(result.IsSuccess);
            var error = Assert.IsType <Error.ResourceNotFound>(result.Error);

            Assert.Equal(CommonErrorMessages.CandidateNotFound, error.Message);
        }
Example #3
0
        public void Cannot_record_training_attendance_before_trainings_end()
        {
            // Arrange
            var training = new Training(
                "Papieska 21/37", "Wadowice",
                new NodaTime.LocalDateTime(2019, 09, 01, 10, 00).InMainTimezone().ToOffsetDateTime(),
                new NodaTime.LocalDateTime(2019, 09, 01, 12, 00).InMainTimezone().ToOffsetDateTime(),
                Guid.NewGuid()
                );

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

            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var event2 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateAcceptedTrainingInvitation>(
                new CandidateAcceptedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, 1, string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 2
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1, event2 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                TrainingResult  = RecordTrainingResults.TrainingResult.Absent,
                AdditionalNotes = "notatka testowa"
            },
                                                          recordingCoordinator,
                                                          new[] { training },
                                                          training,
                                                          new NodaTime.LocalDateTime(2019, 09, 01, 11, 00).InMainTimezone().ToInstant()
                                                          );

            // Assert
            Assert.False(result.IsSuccess);
            var error = Assert.IsType <Error.DomainError>(result.Error);

            Assert.Equal(RecordTrainingResults_Messages.CannotRecordTrainingAttendanceBeforeTrainingEnd, error.Message);
        }
Example #4
0
        public void If_candidate_was_absent_from_the_training_aggregate_contains_CandidateWasAbsentFromTraining_event()
        {
            // Arrange
            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var event2 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateAcceptedTrainingInvitation>(
                new CandidateAcceptedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, 1, string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 2
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1, event2 });

            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                TrainingResult  = RecordTrainingResults.TrainingResult.Absent,
                AdditionalNotes = "notatka testowa"
            },
                                                          recordingCoordinator,
                                                          new[] { BuildDefaultTraining() },
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.True(result.IsSuccess);
            var uncommittedEvent = Assert.Single(enrollment.UncommittedEvents);
            var @event           = Assert.IsType <CandidateWasAbsentFromTraining>(uncommittedEvent.AggregateEvent);

            Assert.Equal(recordingCoordinator.Id, @event.RecordingCoordinatorID);
            Assert.Equal(1, @event.TrainingID);
            Assert.Equal("notatka testowa", @event.AdditionalNotes);
        }
Example #5
0
        public void If_candidate_accepted_and_then_refused_training_invitation_then_he_cannot_be_recorded_as_absent_on_that_training()
        {
            // Arrange
            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var event2 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateAcceptedTrainingInvitation>(
                new CandidateAcceptedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, 1, string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 2
                );
            var event3 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateRefusedTrainingInvitation>(
                new CandidateRefusedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, "kandydat nie ma czasu", string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 3
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1, event2, event3 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                TrainingResult  = RecordTrainingResults.TrainingResult.Absent,
                AdditionalNotes = "notatka testowa"
            },
                                                          recordingCoordinator,
                                                          new[] { BuildDefaultTraining() },
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.False(result.IsSuccess);
            var error = Assert.IsType <Error.DomainError>(result.Error);

            Assert.Equal(RecordTrainingResults_Messages.CannotRecordCandidateAsAbsentIfTheyDidNotAcceptTrainingInvitation, error.Message);
        }
Example #6
0
        public void If_candidate_was_present_but_was_not_accepted_as_lecturer_then_command_must_contain_additional_notes()
        {
            // Arrange
            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var event2 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateAcceptedTrainingInvitation>(
                new CandidateAcceptedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, 1, string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 2
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1, event2 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                TrainingResult  = RecordTrainingResults.TrainingResult.PresentButNotAcceptedAsLecturer,
                AdditionalNotes = null
            },
                                                          recordingCoordinator,
                                                          new[] { BuildDefaultTraining() },
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.False(result.IsSuccess);
            var error   = Assert.IsType <Error.ValidationFailed>(result.Error);
            var failure = Assert.Single(error.Failures);

            AssertHelpers.SingleError(
                nameof(RecordTrainingResults.Command.AdditionalNotes),
                RecordTrainingResults_Messages.IfCandidateWasNotAccepted_CommandMustContainExplanation,
                failure);
        }
Example #7
0
        public void Candidate_can_be_recorded_as_present_on_the_training_if_his_last_answer_to_invitation_was_negative(RecordTrainingResults.TrainingResult trainingResult)
        {
            // Arrange
            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var event2 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateRefusedTrainingInvitation>(
                new CandidateRefusedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, "kandydat nie ma czasu", string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 2
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1, event2 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                TrainingResult  = trainingResult,
                AdditionalNotes = "notatka testowa"
            },
                                                          recordingCoordinator,
                                                          new[] { BuildDefaultTraining() },
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.True(result.IsSuccess);
            enrollment.UncommittedEvents.Should().Contain(x => x.AggregateEvent.GetType() == typeof(CandidateAttendedTraining));
        }
Example #8
0
        public void If_candidate_was_present_but_was_not_accepted_as_lecturer_then_he_has_no_permission_to_conduct_classes()
        {
            // Arrange
            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var event2 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, CandidateAcceptedTrainingInvitation>(
                new CandidateAcceptedTrainingInvitation(Guid.NewGuid(), CommunicationChannel.OutgoingEmail, 1, string.Empty),
                new Metadata(), DateTimeOffset.Now, id, 2
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1, event2 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                TrainingResult  = RecordTrainingResults.TrainingResult.PresentButNotAcceptedAsLecturer,
                AdditionalNotes = "kandydat nie spełnia wymagań"
            },
                                                          recordingCoordinator,
                                                          new[] { BuildDefaultTraining() },
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.True(result.IsSuccess);
            Assert.False(enrollment.HasLecturerRights);
        }
Example #9
0
        public void Candidate_must_have_been_invited_to_training_invitation_to_be_recorded_as_absent()
        {
            // Arrange
            var id     = EnrollmentAggregate.EnrollmentId.New;
            var event1 = new DomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId, RecruitmentFormSubmitted>(
                new RecruitmentFormSubmitted(
                    NodaTime.SystemClock.Instance.GetCurrentInstant(),
                    "Andrzej", "Strzelba",
                    EmailAddress.Parse("*****@*****.**"), Consts.FakePhoneNumber,
                    "ala ma kota", 1, "Wolne Miasto Gdańsk", new[] { "Wadowice" }, new[] { 1 }, true),
                new Metadata(), DateTimeOffset.Now, id, 1
                );
            var enrollment = new EnrollmentAggregate(id);

            enrollment.ApplyEvents(new IDomainEvent[] { event1 });
            var recordingCoordinator = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };

            // Act
            var result = enrollment.RecordTrainingResults(new RecordTrainingResults.Command()
            {
                EnrollmentId    = id.GetGuid(),
                TrainingId      = 1,
                AdditionalNotes = "brak notatek",
                TrainingResult  = RecordTrainingResults.TrainingResult.Absent
            },
                                                          recordingCoordinator,
                                                          new[] { BuildDefaultTraining() },
                                                          BuildDefaultTraining(),
                                                          NodaTime.SystemClock.Instance.GetCurrentInstant());

            // Assert
            Assert.False(result.IsSuccess);
            var error = Assert.IsType <Error.DomainError>(result.Error);

            Assert.Equal(RecordTrainingResults_Messages.CannotRecordCandidateAsAbsentIfTheyDidNotAcceptTrainingInvitation, error.Message);
        }