diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs index b6bd30e8..35739bdd 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Browse/BrowseServiceGetUsersScheduleTests.cs @@ -1,4 +1,5 @@ -using TutorLizard.BusinessLogic.Models; + +using TutorLizard.BusinessLogic.Models; using TutorLizard.BusinessLogic.Models.DTOs; using TutorLizard.BusinessLogic.Models.DTOs.Requests; using TutorLizard.BusinessLogic.Services; diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceCreateScheduleItemTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceCreateScheduleItemTests.cs new file mode 100644 index 00000000..d2ef5a39 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceCreateScheduleItemTests.cs @@ -0,0 +1,86 @@ +using TutorLizard.BusinessLogic.Models.DTOs.Requests; +using TutorLizard.BusinessLogic.Models; +using Moq; + +namespace TutorLizard.BusinessLogic.Tests.Services.Tutor; + +public class TutorServiceCreateScheduleItemTests : TutorServiceTestsBase +{ + [Fact] + public async Task CreateScheduleItem_WhenUserIsOwner_ShouldReturnSuccess() + { + // Arrange + int usersAdCount = 20; + int usersScheduleItemRequestCount = 0; + var testUser = CreateTestUserAndAddToDb(usersAdCount, usersScheduleItemRequestCount); + var adId = testUser.Ads.First().Id; + var ad = new Ad { TutorId = testUser.Id }; + + MockAdRepository + .Setup(repo => repo.GetById(adId)).ReturnsAsync(ad); + + + var request = new CreateScheduleItemRequest() + { + UserId = testUser.Id, + AdId = adId, + DateTime = DateTime.Now + }; + // Act + var response = await TutorService.CreateScheduleItem(request); + // Assert + Assert.True(response.Success); + } + + [Fact] + public async Task CreateScheduleItem_WhenUserIsNotTheOwner_ShouldReturnFalse() + { + // Arrange + int usersAdCount = 20; + int usersScheduleItemRequestCount = 0; + var testUser = CreateTestUserAndAddToDb(usersAdCount, usersScheduleItemRequestCount); + var adId = testUser.Ads.First().Id; + var ad = new Ad { TutorId = -1 }; + + MockAdRepository + .Setup(repo => repo.GetById(adId)).ReturnsAsync(ad); + + + var request = new CreateScheduleItemRequest() + { + UserId = testUser.Id, + AdId = adId, + DateTime = DateTime.Now + }; + // Act + var response = await TutorService.CreateScheduleItem(request); + // Assert + Assert.False(response.Success); + } + + [Fact] + public async Task CreateScheduleItem_WhenAdIdIsIncorrect_ShouldReturnFalse() + { + // Arrange + int usersAdCount = 20; + int usersScheduleItemRequestCount = 0; + var testUser = CreateTestUserAndAddToDb(usersAdCount, usersScheduleItemRequestCount); + var adId = -1; + var ad = new Ad { TutorId = testUser.Id }; + + MockAdRepository + .Setup(repo => repo.GetById(adId)).ReturnsAsync(ad); + + + var request = new CreateScheduleItemRequest() + { + UserId = testUser.Id, + AdId = adId, + DateTime = DateTime.Now + }; + // Act + var response = await TutorService.CreateScheduleItem(request); + // Assert + Assert.False(response.Success); + } +} diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceGetTutorsScheduleForAdTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceGetTutorsScheduleForAdTests.cs new file mode 100644 index 00000000..ead5d040 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceGetTutorsScheduleForAdTests.cs @@ -0,0 +1,31 @@ +using TutorLizard.BusinessLogic.Models.DTOs.Requests; +using Moq; + +namespace TutorLizard.BusinessLogic.Tests.Services.Tutor; + +public class TutorServiceGetTutorsScheduleForAdTests : TutorServiceTestsBase +{ + [Fact] + public async Task GetTutorsScheduleForAd_WhenScheduleIsNotNull_ShouldNotReturnEmptyValue() + { + // Assign + var adId = 1; + int requestCount = 100; + var scheduleItems = CreateTestScheduleItems(requestCount); + + MockScheduleItemRepository + .Setup(repo => repo.GetAll()) + .ReturnsAsync(scheduleItems); + + var request = new TutorsScheduleForAdRequest + { + AdId = adId + }; + + // Act + var response = await TutorService.GetTutorsScheduleForAd(request); + + // Assert + Assert.Equal(scheduleItems.Count, response.ScheduleItems.Count); + } +} diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceIsUserTheAdOwnerTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceIsUserTheAdOwnerTests.cs new file mode 100644 index 00000000..e66c8fd9 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceIsUserTheAdOwnerTests.cs @@ -0,0 +1,60 @@ +using Moq; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.BusinessLogic.Models.DTOs.Requests; +using TutorLizard.BusinessLogic.Models.DTOs.Responses; +using TutorLizard.BusinessLogic.Services; + +namespace TutorLizard.BusinessLogic.Tests.Services.Tutor; + +public class TutorServiceIsUserTheAdOwnerTests : TutorServiceTestsBase +{ + [Fact] + public async Task IsUserTheAdOwner_UserIsOwner_ShouldReturnTrue() + { + // Arrange + int usersAdCount = 20; + int usersScheduleItemRequestCount = 0; + var testUser = CreateTestUserAndAddToDb(usersAdCount, usersScheduleItemRequestCount); + var adId = testUser.Ads.First().Id; + var ad = new Ad { TutorId = testUser.Id }; + + MockAdRepository + .Setup(repo => repo.GetById(adId)).ReturnsAsync(ad); + + var request = new IsUserTheAdOwnerRequest(adId,testUser.Id) + { + UserId = testUser.Id, + AdId = adId + }; + // Act + var response = await TutorService.IsUserTheAdOwner(request); + + // Assert + Assert.True(response.IsOwner); + } + + [Fact] + public async Task IsUserTheAdOwner_UserIsOwner_ShouldReturnFalse() + { + // Arrange + int usersAdCount = 20; + int usersScheduleItemRequestCount = 0; + var testUser = CreateTestUserAndAddToDb(usersAdCount, usersScheduleItemRequestCount); + var adId = testUser.Ads.First().Id; + var ad = new Ad { TutorId = -1 }; + + MockAdRepository + .Setup(repo => repo.GetById(adId)).ReturnsAsync(ad); + + var request = new IsUserTheAdOwnerRequest(adId,testUser.Id) + { + UserId = testUser.Id, + AdId = adId + }; + // Act + var response = await TutorService.IsUserTheAdOwner(request); + + // Assert + Assert.False(response.IsOwner); + } +} diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceTestsBase.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceTestsBase.cs new file mode 100644 index 00000000..bc70a776 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceTestsBase.cs @@ -0,0 +1,199 @@ +using AutoFixture; +using Moq; +using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.BusinessLogic.Services; + +namespace TutorLizard.BusinessLogic.Tests.Services.Tutor; + +public class TutorServiceTestsBase : TestsWithInMemoryDbBase +{ + protected TutorService TutorService; + protected Fixture Fixture = new(); + protected Mock> MockScheduleItemRepository = new(); + protected Mock> MockScheduleItemRequestRepository = new(); + protected Mock> MockAdRepository = new(); + protected Mock> MockAdRequestRepository = new(); + + protected TutorServiceTestsBase() : base() + { + TutorService = new(MockScheduleItemRepository.Object, + MockScheduleItemRequestRepository.Object, + MockAdRequestRepository.Object, + MockAdRepository.Object); + } + + protected void SetupMockGetAllScheduleItems(List scheduleItems) + { + var scheduleItemsInDb = AddEntitiesToInMemoryDb(scheduleItems); + + MockScheduleItemRepository + .Setup(x => x.GetAll()) + .Returns(scheduleItemsInDb); + } + protected void SetupMockGetScheduleItemById(ScheduleItem? scheduleItem) + { + MockScheduleItemRepository + .Setup(x => x.GetById(It.IsAny())) + .Returns(Task.FromResult(scheduleItem)); + } + protected void SetupMockGetAllScheduleItemRequests(List scheduleItemRequests) + { + var scheduleItemRequestsInDb = AddEntitiesToInMemoryDb(scheduleItemRequests); + + MockScheduleItemRequestRepository + .Setup(x => x.GetAll()) + .Returns(scheduleItemRequestsInDb); + } + protected void SetupMockGetScheduleItemRequestById(ScheduleItemRequest? scheduleItemRequest) + { + MockScheduleItemRequestRepository + .Setup(x => x.GetById(It.IsAny())) + .Returns(Task.FromResult(scheduleItemRequest)); + } + protected void SetupMockGetAllAds(List ads) + { + var adsInDb = AddEntitiesToInMemoryDb(ads); + + MockAdRepository + .Setup(x => x.GetAll()) + .Returns(adsInDb); + } + protected void SetupMockGetAdById(Ad? ad) + { + MockAdRepository + .Setup(x => x.GetById(It.IsAny())) + .Returns(Task.FromResult(ad)); + } + protected void SetupMockGetAllAdRequests(List adRequests) + { + var adRequestsInDb = AddEntitiesToInMemoryDb (adRequests); + + MockAdRequestRepository + .Setup(x => x.GetAll()) + .Returns(adRequestsInDb); + } + protected void SetupMockGetAdRequestById(AdRequest? adRequest) + { + MockAdRequestRepository + .Setup(x => x.GetById(It.IsAny())) + .Returns(Task.FromResult(adRequest)); + } + protected IQueryable AddEntitiesToInMemoryDb(List entities) + where TEntity : class + { + DbContext + .Set() + .AddRange(entities); + DbContext.SaveChanges(); + + return DbContext + .Set() + .AsQueryable(); + } + + protected User CreateTestUserAndAddToDb(int usersAdCount = 0, int usersScheduleItemRequestCount = 0) + { + User user = CreateTestUser(); + user.Ads = CreateTestAds(usersAdCount); + user.ScheduleItemRequests = CreateTestScheduleItemRequests(usersScheduleItemRequestCount); + AddEntitiesToInMemoryDb([user]); + return user; + } + + protected List CreateTestAds(int adCount) + { + List ads = Fixture + .Build() + .Without(ad => ad.Id) + .Without(ad => ad.AdRequests) + .Without(ad => ad.ScheduleItems) + .With(ad => ad.User, CreateTestUser()) + .With(ad => ad.Category, CreateTestCategory()) + .With(ad => ad.Price, Math.Abs(Fixture.Create())) + .CreateMany(adCount) + .ToList(); + + return ads; + } + + protected List CreateTestAdRequests(int adRequestCount) + { + List adreqs = Fixture + .Build() + .Without(adreq => adreq.Id) + .Without(adreq => adreq.User) + .Without(adreq => adreq.Ad) + .With(adreq=> adreq.User, CreateTestUser()) + .With(adreq => adreq.Message, Fixture.Create()) + .With(adreq => adreq.IsRemote, Fixture.Create()) + .With(adreq => adreq.IsRemote, Fixture.Create()) + .CreateMany(adRequestCount) + .ToList(); + + return adreqs; + } + + protected User CreateTestUser() + { + User user = Fixture + .Build() + .Without(user => user.Ads) + .Without(user => user.AdRequests) + .Without(user => user.ScheduleItemRequests) + .Create(); + + return user; + } + + protected Category CreateTestCategory() + { + Category category = Fixture + .Build() + .Without(category => category.Ads) + .Create(); + + return category; + } + protected List CreateTestScheduleItemRequests(int requestCount) + { + List requests = Fixture + .Build() + .Without(request => request.Id) + .Without(request => request.ScheduleItem) + .With(request => request.User, CreateTestUser()) + .CreateMany(requestCount) + .ToList(); + + return requests; + } + + protected List CreateTestScheduleItems(int scheduleItemCount) + { + var ads = CreateTestAds(scheduleItemCount); + + List scheduleItems = Fixture + .Build() + .Without(item => item.Id) + .Without(item => item.Ad) + .Without(item => item.ScheduleItemRequests) + .CreateMany(scheduleItemCount) + .ToList(); + + return scheduleItems; + } + protected List CreateTestScheduleItemsAsQuerable(int scheduleItemCount) + { + var ads = CreateTestAds(scheduleItemCount); + + List scheduleItems = Fixture + .Build() + .Without(item => item.Id) + .Without(item => item.Ad) + .Without(item => item.ScheduleItemRequests) + .CreateMany(scheduleItemCount) + .ToList(); + + return scheduleItems; + } +}