Skip to content

Commit

Permalink
Merge pull request #1 from hassanhabib/master
Browse files Browse the repository at this point in the history
Merge from Original Repo
  • Loading branch information
syedib committed Aug 13, 2020
2 parents d1f5fa1 + e7d5156 commit eeefbeb
Show file tree
Hide file tree
Showing 82 changed files with 1,903 additions and 119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,14 @@ public async Task ShouldPutSemesterCourseAsync()
// when
await this.otripleSApiBroker.PutSemesterCourseAsync(modifiedSemesterCourse);

SemesterCourse expectedSemesterCourse =
CreateExpectedSemesterCourse(modifiedSemesterCourse);

SemesterCourse actualSemesterCourse =
await this.otripleSApiBroker.GetSemesterCourseByIdAsync(randomSemesterCourse.Id);

// then
actualSemesterCourse.Should().BeEquivalentTo(modifiedSemesterCourse);
actualSemesterCourse.Should().BeEquivalentTo(expectedSemesterCourse);

await this.otripleSApiBroker.DeleteSemesterCourseByIdAsync(actualSemesterCourse.Id);
}
Expand All @@ -60,8 +63,8 @@ public async Task ShouldPutSemesterCourseAsync()
public async Task ShouldGetAllSemesterCoursesAsync()
{
// given
IEnumerable<SemesterCourse> randomSemesterCourses = GetRandomSemesterCourses();
IEnumerable<SemesterCourse> inputSemesterCourses = randomSemesterCourses;
IEnumerable<SemesterCourse> randomSemesterCourses = CreateRandomSemesterCourses();
List<SemesterCourse> inputSemesterCourses = randomSemesterCourses.ToList();

foreach (SemesterCourse semesterCourse in inputSemesterCourses)
{
Expand All @@ -81,7 +84,8 @@ public async Task ShouldGetAllSemesterCoursesAsync()
actualSemesterCourses.Single(semesterCourse =>
semesterCourse.Id == expectedSemesterCourse.Id);

actualSemesterCourse.Should().BeEquivalentTo(expectedSemesterCourse);
SemesterCourse expectedReturnedCourse = CreateExpectedSemesterCourse(expectedSemesterCourse);
actualSemesterCourse.Should().BeEquivalentTo(expectedReturnedCourse);
await this.otripleSApiBroker.DeleteSemesterCourseByIdAsync(actualSemesterCourse.Id);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

using System;
using System.Collections.Generic;
using System.Linq;
using Force.DeepCloner;
using OtripleS.Web.Api.Models.Classrooms;
using OtripleS.Web.Api.Models.Courses;
Expand All @@ -26,8 +27,9 @@ public partial class SemesterCoursesApiTests

private static int GetRandomNumber() => new IntRange(min: 2, max: 10).GetValue();

private IEnumerable<SemesterCourse> GetRandomSemesterCourses() =>
CreateRandomSemesterCourseFiller().Create(GetRandomNumber());
private IEnumerable<SemesterCourse> CreateRandomSemesterCourses() =>
Enumerable.Range(start: 0, count: GetRandomNumber())
.Select(item => CreateRandomSemesterCourse());

private SemesterCourse CreateExpectedSemesterCourse(SemesterCourse semesterCourse)
{
Expand Down Expand Up @@ -62,6 +64,7 @@ private Filler<SemesterCourse> CreateRandomSemesterCourseFiller()
.OnProperty(semesterCourse => semesterCourse.TeacherId).Use(randomTeacher.Id)
.OnProperty(semesterCourse => semesterCourse.ClassroomId).Use(randomClassroom.Id)
.OnProperty(semesterCourse => semesterCourse.CourseId).Use(randomCourse.Id)
.OnProperty(semesterCourse => semesterCourse.StudentSemesterCourses).IgnoreIt()
.OnType<DateTimeOffset>().Use(GetRandomDateTime());

return filler;
Expand All @@ -78,9 +81,13 @@ private SemesterCourse UpdateSemesterCourseRandom(SemesterCourse semesterCourse)
.OnProperty(semesterCourse => semesterCourse.UpdatedBy).Use(semesterCourse.UpdatedBy)
.OnProperty(semesterCourse => semesterCourse.CreatedDate).Use(semesterCourse.CreatedDate)
.OnProperty(semesterCourse => semesterCourse.UpdatedDate).Use(now)
.OnProperty(semesterCourse => semesterCourse.TeacherId).Use(semesterCourse.Id)
.OnProperty(semesterCourse => semesterCourse.ClassroomId).Use(semesterCourse.Id)
.OnProperty(semesterCourse => semesterCourse.CourseId).Use(semesterCourse.Id)
.OnProperty(semesterCourse => semesterCourse.TeacherId).Use(semesterCourse.TeacherId)
.OnProperty(semesterCourse => semesterCourse.ClassroomId).Use(semesterCourse.ClassroomId)
.OnProperty(semesterCourse => semesterCourse.CourseId).Use(semesterCourse.CourseId)
.OnProperty(semesterCourse => semesterCourse.Teacher).Use(semesterCourse.Teacher)
.OnProperty(semesterCourse => semesterCourse.Classroom).Use(semesterCourse.Classroom)
.OnProperty(semesterCourse => semesterCourse.Course).Use(semesterCourse.Course)
.OnProperty(semesterCourse => semesterCourse.StudentSemesterCourses).IgnoreIt()
.OnType<DateTimeOffset>().Use(GetRandomDateTime());

return filler.Create();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ private Filler<Student> CreateRandomStudentFiller()
.OnProperty(student => student.UpdatedBy).Use(posterId)
.OnProperty(student => student.CreatedDate).Use(now)
.OnProperty(student => student.UpdatedDate).Use(now)
.OnProperty(student => student.StudentSemesterCourses).IgnoreIt()
.OnType<DateTimeOffset>().Use(GetRandomDateTime());

return filler;
Expand All @@ -59,6 +60,7 @@ private Student UpdateStudentRandom(Student student)
.OnProperty(student => student.UpdatedBy).Use(student.UpdatedBy)
.OnProperty(student => student.CreatedDate).Use(student.CreatedDate)
.OnProperty(student => student.UpdatedDate).Use(now)
.OnProperty(student => student.StudentSemesterCourses).IgnoreIt()
.OnType<DateTimeOffset>().Use(GetRandomDateTime());

return filler.Create();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
//---------------------------------------------------------------
// Copyright (c) Coalition of the Good-Hearted Engineers
// FREE TO USE AS LONG AS SOFTWARE FUNDS ARE DONATED TO THE POOR
//----------------------------------------------------------------

using Microsoft.EntityFrameworkCore;
using Moq;
using OtripleS.Web.Api.Models.StudentSemesterCourses;
using OtripleS.Web.Api.Models.StudentSemesterCourses.Exceptions;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace OtripleS.Web.Api.Tests.Unit.Services.StudentSemesterCourseServiceTests
{
public partial class StudentSemesterCourseServiceTests
{
[Fact]
public async Task ShouldThrowDependencyExceptionOnCreateWhenSqlExceptionOccursAndLogItAsync()
{
// given
DateTimeOffset dateTime = GetRandomDateTime();
StudentSemesterCourse randomStudentSemesterCourse = CreateRandomStudentSemesterCourse(dateTime);
StudentSemesterCourse inputStudentSemesterCourse = randomStudentSemesterCourse;
inputStudentSemesterCourse.UpdatedBy = inputStudentSemesterCourse.CreatedBy;
inputStudentSemesterCourse.UpdatedDate = inputStudentSemesterCourse.CreatedDate;
var sqlException = GetSqlException();

var expectedStudentSemesterCourseDependencyException =
new StudentSemesterCourseDependencyException(sqlException);

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

this.storageBrokerMock.Setup(broker =>
broker.InsertStudentSemesterCourseAsync(inputStudentSemesterCourse))
.ThrowsAsync(sqlException);

// when
ValueTask<StudentSemesterCourse> createStudentSemesterCourseTask =
this.studentSemesterCourseService.CreateStudentSemesterCourseAsync(inputStudentSemesterCourse);

// then
await Assert.ThrowsAsync<StudentSemesterCourseDependencyException>(() =>
createStudentSemesterCourseTask.AsTask());

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

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

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

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

[Fact]
public async Task ShouldThrowDependencyExceptionOnCreateWhenDbExceptionOccursAndLogItAsync()
{
// given
DateTimeOffset dateTime = GetRandomDateTime();
StudentSemesterCourse randomStudentSemesterCourse = CreateRandomStudentSemesterCourse(dateTime);
StudentSemesterCourse inputStudentSemesterCourse = randomStudentSemesterCourse;
inputStudentSemesterCourse.UpdatedBy = inputStudentSemesterCourse.CreatedBy;
inputStudentSemesterCourse.UpdatedDate = inputStudentSemesterCourse.CreatedDate;
var databaseUpdateException = new DbUpdateException();

var expectedStudentSemesterCourseDependencyException =
new StudentSemesterCourseDependencyException(databaseUpdateException);

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

this.storageBrokerMock.Setup(broker =>
broker.InsertStudentSemesterCourseAsync(inputStudentSemesterCourse))
.ThrowsAsync(databaseUpdateException);

// when
ValueTask<StudentSemesterCourse> createStudentSemesterCourseTask =
this.studentSemesterCourseService.CreateStudentSemesterCourseAsync(inputStudentSemesterCourse);

// then
await Assert.ThrowsAsync<StudentSemesterCourseDependencyException>(() =>
createStudentSemesterCourseTask.AsTask());

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

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

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

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

[Fact]
public async Task ShouldThrowServiceExceptionOnCreateWhenExceptionOccursAndLogItAsync()
{
// given
DateTimeOffset dateTime = GetRandomDateTime();
StudentSemesterCourse randomStudentSemesterCourse = CreateRandomStudentSemesterCourse(dateTime);
StudentSemesterCourse inputStudentSemesterCourse = randomStudentSemesterCourse;
inputStudentSemesterCourse.UpdatedBy = inputStudentSemesterCourse.CreatedBy;
inputStudentSemesterCourse.UpdatedDate = inputStudentSemesterCourse.CreatedDate;
var exception = new Exception();

var expectedStudentSemesterCourseServiceException =
new StudentSemesterCourseServiceException(exception);

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

this.storageBrokerMock.Setup(broker =>
broker.InsertStudentSemesterCourseAsync(inputStudentSemesterCourse))
.ThrowsAsync(exception);

// when
ValueTask<StudentSemesterCourse> createStudentSemesterCourseTask =
this.studentSemesterCourseService.CreateStudentSemesterCourseAsync(inputStudentSemesterCourse);

// then
await Assert.ThrowsAsync<StudentSemesterCourseServiceException>(() =>
createStudentSemesterCourseTask.AsTask());

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

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

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

this.dateTimeBrokerMock.VerifyNoOtherCalls();
this.loggingBrokerMock.VerifyNoOtherCalls();
this.storageBrokerMock.VerifyNoOtherCalls();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//---------------------------------------------------------------
// Copyright (c) Coalition of the Good-Hearted Engineers
// FREE TO USE AS LONG AS SOFTWARE FUNDS ARE DONATED TO THE POOR
//----------------------------------------------------------------

using FluentAssertions;
using Moq;
using OtripleS.Web.Api.Models.StudentSemesterCourses;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace OtripleS.Web.Api.Tests.Unit.Services.StudentSemesterCourseServiceTests
{
public partial class StudentSemesterCourseServiceTests
{
[Fact]
public async Task ShouldCreateStudentSemesterCourseAsync()
{
// given
DateTimeOffset randomDateTime = GetRandomDateTime();
DateTimeOffset dateTime = randomDateTime;
StudentSemesterCourse randomSemesterCourse = CreateRandomStudentSemesterCourse(randomDateTime);
randomSemesterCourse.UpdatedBy = randomSemesterCourse.CreatedBy;
randomSemesterCourse.UpdatedDate = randomSemesterCourse.CreatedDate;
StudentSemesterCourse inputStudentSemesterCourse = randomSemesterCourse;
StudentSemesterCourse storageStudentSemesterCourse = randomSemesterCourse;
StudentSemesterCourse expectedStudentSemesterCourse = storageStudentSemesterCourse;

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

this.storageBrokerMock.Setup(broker =>
broker.InsertStudentSemesterCourseAsync(inputStudentSemesterCourse))
.ReturnsAsync(storageStudentSemesterCourse);

// when
StudentSemesterCourse actualSemesterCourse =
await this.studentSemesterCourseService.CreateStudentSemesterCourseAsync(inputStudentSemesterCourse);

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

// This is called within validation code
this.dateTimeBrokerMock.Verify(broker =>
broker.GetCurrentDateTime(),
Times.Once);

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

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

0 comments on commit eeefbeb

Please sign in to comment.