Example #1
0
        public async Task ShouldThrowValidationExceptionOnModifyIfStorageCreatedDateNotSameAsCreateDateAndLogItAsync()
        {
            // given
            int                   randomNumber  = GetRandomNumber();
            int                   randomMinutes = randomNumber;
            DateTimeOffset        randomDate    = GetRandomDateTime();
            StudentSemesterCourse randomStudentSemesterCourse  = CreateRandomStudentSemesterCourse(randomDate);
            StudentSemesterCourse invalidStudentSemesterCourse = randomStudentSemesterCourse;

            invalidStudentSemesterCourse.UpdatedDate = randomDate;
            StudentSemesterCourse storageStudentSemesterCourse = randomStudentSemesterCourse.DeepClone();
            Guid studentId        = invalidStudentSemesterCourse.StudentId;
            Guid semesterCourseId = invalidStudentSemesterCourse.SemesterCourseId;

            invalidStudentSemesterCourse.CreatedDate = storageStudentSemesterCourse.CreatedDate.AddMinutes(randomNumber);

            var invalidStudentSemesterCourseInputException = new InvalidStudentSemesterCourseInputException(
                parameterName: nameof(StudentSemesterCourse.CreatedDate),
                parameterValue: invalidStudentSemesterCourse.CreatedDate);

            var expectedStudentSemesterCourseValidationException =
                new StudentSemesterCourseValidationException(invalidStudentSemesterCourseInputException);

            this.storageBrokerMock.Setup(broker =>
                                         broker.SelectStudentSemesterCourseByIdAsync(studentId, semesterCourseId))
            .ReturnsAsync(storageStudentSemesterCourse);

            this.dateTimeBrokerMock.Setup(broker =>
                                          broker.GetCurrentDateTime())
            .Returns(randomDate);

            // when
            ValueTask <StudentSemesterCourse> modifyStudentSemesterCourseTask =
                this.studentSemesterCourseService.ModifyStudentSemesterCourseAsync(invalidStudentSemesterCourse);

            // then
            await Assert.ThrowsAsync <StudentSemesterCourseValidationException>(() =>
                                                                                modifyStudentSemesterCourseTask.AsTask());

            this.dateTimeBrokerMock.Verify(broker =>
                                           broker.GetCurrentDateTime(),
                                           Times.Once);

            this.storageBrokerMock.Verify(broker =>
                                          broker.SelectStudentSemesterCourseByIdAsync(
                                              invalidStudentSemesterCourse.StudentId,
                                              invalidStudentSemesterCourse.SemesterCourseId),
                                          Times.Once);

            this.loggingBrokerMock.Verify(broker =>
                                          broker.LogError(It.Is(SameExceptionAs(
                                                                    expectedStudentSemesterCourseValidationException))),
                                          Times.Once);

            this.loggingBrokerMock.VerifyNoOtherCalls();
            this.storageBrokerMock.VerifyNoOtherCalls();
            this.dateTimeBrokerMock.VerifyNoOtherCalls();
        }
        public async Task ShouldModifyStudentSemesterCourseAsync()
        {
            // given
            int                   randomNumber                             = GetRandomNumber();
            int                   randomDays                               = randomNumber;
            DateTimeOffset        randomDate                               = GetRandomDateTime();
            DateTimeOffset        randomInputDate                          = GetRandomDateTime();
            StudentSemesterCourse randomStudentSemesterCourse              = CreateRandomStudentSemesterCourse(randomInputDate);
            StudentSemesterCourse inputStudentSemesterCourse               = randomStudentSemesterCourse;
            StudentSemesterCourse afterUpdateStorageStudentSemesterCourse  = inputStudentSemesterCourse;
            StudentSemesterCourse expectedStudentSemesterCourse            = afterUpdateStorageStudentSemesterCourse;
            StudentSemesterCourse beforeUpdateStorageStudentSemesterCourse = randomStudentSemesterCourse.DeepClone();

            inputStudentSemesterCourse.UpdatedDate = randomDate;
            Guid studentId        = inputStudentSemesterCourse.StudentId;
            Guid semesterCourseId = inputStudentSemesterCourse.SemesterCourseId;

            this.dateTimeBrokerMock.Setup(broker =>
                                          broker.GetCurrentDateTime())
            .Returns(randomDate);

            this.storageBrokerMock.Setup(broker =>
                                         broker.SelectStudentSemesterCourseByIdAsync(studentId, semesterCourseId))
            .ReturnsAsync(beforeUpdateStorageStudentSemesterCourse);

            this.storageBrokerMock.Setup(broker =>
                                         broker.UpdateStudentSemesterCourseAsync(inputStudentSemesterCourse))
            .ReturnsAsync(afterUpdateStorageStudentSemesterCourse);

            // when
            StudentSemesterCourse actualStudentSemesterCourse =
                await this.studentSemesterCourseService.ModifyStudentSemesterCourseAsync(inputStudentSemesterCourse);

            // then
            actualStudentSemesterCourse.Should().BeEquivalentTo(expectedStudentSemesterCourse);

            this.dateTimeBrokerMock.Verify(broker =>
                                           broker.GetCurrentDateTime(),
                                           Times.Once);

            this.storageBrokerMock.Verify(broker =>
                                          broker.SelectStudentSemesterCourseByIdAsync(studentId, semesterCourseId),
                                          Times.Once);

            this.storageBrokerMock.Verify(broker =>
                                          broker.UpdateStudentSemesterCourseAsync(inputStudentSemesterCourse),
                                          Times.Once);

            this.storageBrokerMock.VerifyNoOtherCalls();
            this.loggingBrokerMock.VerifyNoOtherCalls();
            this.dateTimeBrokerMock.VerifyNoOtherCalls();
        }