Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/ja 116 tutorservice tests #110

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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

Check failure on line 16 in Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceGetTutorsScheduleForAdTests.cs

View workflow job for this annotation

GitHub Actions / build

'ISetup<IDbRepository<ScheduleItem>, IQueryable<ScheduleItem>>' does not contain a definition for 'ReturnsAsync' and the best extension method overload 'SequenceExtensions.ReturnsAsync<List<ScheduleItem>>(ISetupSequentialResult<Task<List<ScheduleItem>>>, List<ScheduleItem>)' requires a receiver of type 'Moq.Language.ISetupSequentialResult<System.Threading.Tasks.Task<System.Collections.Generic.List<TutorLizard.BusinessLogic.Models.ScheduleItem>>>'

Check failure on line 16 in Tests/TutorLizard.BusinessLogic.Tests/Services/Tutor/TutorServiceGetTutorsScheduleForAdTests.cs

View workflow job for this annotation

GitHub Actions / build

'ISetup<IDbRepository<ScheduleItem>, IQueryable<ScheduleItem>>' does not contain a definition for 'ReturnsAsync' and the best extension method overload 'SequenceExtensions.ReturnsAsync<List<ScheduleItem>>(ISetupSequentialResult<Task<List<ScheduleItem>>>, List<ScheduleItem>)' requires a receiver of type 'Moq.Language.ISetupSequentialResult<System.Threading.Tasks.Task<System.Collections.Generic.List<TutorLizard.BusinessLogic.Models.ScheduleItem>>>'
.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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<IDbRepository<ScheduleItem>> MockScheduleItemRepository = new();
protected Mock<IDbRepository<ScheduleItemRequest>> MockScheduleItemRequestRepository = new();
protected Mock<IDbRepository<Ad>> MockAdRepository = new();
protected Mock<IDbRepository<AdRequest>> MockAdRequestRepository = new();

protected TutorServiceTestsBase() : base()
{
TutorService = new(MockScheduleItemRepository.Object,
MockScheduleItemRequestRepository.Object,
MockAdRequestRepository.Object,
MockAdRepository.Object);
}

protected void SetupMockGetAllScheduleItems(List<ScheduleItem> scheduleItems)
{
var scheduleItemsInDb = AddEntitiesToInMemoryDb(scheduleItems);

MockScheduleItemRepository
.Setup(x => x.GetAll())
.Returns(scheduleItemsInDb);
}
protected void SetupMockGetScheduleItemById(ScheduleItem? scheduleItem)
{
MockScheduleItemRepository
.Setup(x => x.GetById(It.IsAny<int>()))
.Returns(Task.FromResult(scheduleItem));
}
protected void SetupMockGetAllScheduleItemRequests(List<ScheduleItemRequest> scheduleItemRequests)
{
var scheduleItemRequestsInDb = AddEntitiesToInMemoryDb(scheduleItemRequests);

MockScheduleItemRequestRepository
.Setup(x => x.GetAll())
.Returns(scheduleItemRequestsInDb);
}
protected void SetupMockGetScheduleItemRequestById(ScheduleItemRequest? scheduleItemRequest)
{
MockScheduleItemRequestRepository
.Setup(x => x.GetById(It.IsAny<int>()))
.Returns(Task.FromResult(scheduleItemRequest));
}
protected void SetupMockGetAllAds(List<Ad> ads)
{
var adsInDb = AddEntitiesToInMemoryDb(ads);

MockAdRepository
.Setup(x => x.GetAll())
.Returns(adsInDb);
}
protected void SetupMockGetAdById(Ad? ad)
{
MockAdRepository
.Setup(x => x.GetById(It.IsAny<int>()))
.Returns(Task.FromResult(ad));
}
protected void SetupMockGetAllAdRequests(List<AdRequest> adRequests)
{
var adRequestsInDb = AddEntitiesToInMemoryDb (adRequests);

MockAdRequestRepository
.Setup(x => x.GetAll())
.Returns(adRequestsInDb);
}
protected void SetupMockGetAdRequestById(AdRequest? adRequest)
{
MockAdRequestRepository
.Setup(x => x.GetById(It.IsAny<int>()))
.Returns(Task.FromResult(adRequest));
}
protected IQueryable<TEntity> AddEntitiesToInMemoryDb<TEntity>(List<TEntity> entities)
where TEntity : class
{
DbContext
.Set<TEntity>()
.AddRange(entities);
DbContext.SaveChanges();

return DbContext
.Set<TEntity>()
.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<Ad> CreateTestAds(int adCount)
{
List<Ad> ads = Fixture
.Build<Ad>()
.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<decimal>()))
.CreateMany(adCount)
.ToList();

return ads;
}

protected List<AdRequest> CreateTestAdRequests(int adRequestCount)
{
List<AdRequest> adreqs = Fixture
.Build<AdRequest>()
.Without(adreq => adreq.Id)
.Without(adreq => adreq.User)
.Without(adreq => adreq.Ad)
.With(adreq=> adreq.User, CreateTestUser())
.With(adreq => adreq.Message, Fixture.Create<string>())
.With(adreq => adreq.IsRemote, Fixture.Create<bool>())
.With(adreq => adreq.IsRemote, Fixture.Create<bool>())
.CreateMany(adRequestCount)
.ToList();

return adreqs;
}

protected User CreateTestUser()
{
User user = Fixture
.Build<User>()
.Without(user => user.Ads)
.Without(user => user.AdRequests)
.Without(user => user.ScheduleItemRequests)
.Create();

return user;
}

protected Category CreateTestCategory()
{
Category category = Fixture
.Build<Category>()
.Without(category => category.Ads)
.Create();

return category;
}
protected List<ScheduleItemRequest> CreateTestScheduleItemRequests(int requestCount)
{
List<ScheduleItemRequest> requests = Fixture
.Build<ScheduleItemRequest>()
.Without(request => request.Id)
.Without(request => request.ScheduleItem)
.With(request => request.User, CreateTestUser())
.CreateMany(requestCount)
.ToList();

return requests;
}

protected List<ScheduleItem> CreateTestScheduleItems(int scheduleItemCount)
{
var ads = CreateTestAds(scheduleItemCount);

List<ScheduleItem> scheduleItems = Fixture
.Build<ScheduleItem>()
.Without(item => item.Id)
.Without(item => item.Ad)
.Without(item => item.ScheduleItemRequests)
.CreateMany(scheduleItemCount)
.ToList();

return scheduleItems;
}
protected List<ScheduleItem> CreateTestScheduleItemsAsQuerable(int scheduleItemCount)
{
var ads = CreateTestAds(scheduleItemCount);

List<ScheduleItem> scheduleItems = Fixture
.Build<ScheduleItem>()
.Without(item => item.Id)
.Without(item => item.Ad)
.Without(item => item.ScheduleItemRequests)
.CreateMany(scheduleItemCount)
.ToList();

return scheduleItems;
}
}
Loading