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())); }
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); }
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); }
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); }
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); }
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); }
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)); }
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); }
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); }