test(request-limits): Fixed unit tests

This commit is contained in:
tidusjar 2021-10-11 10:21:03 +01:00
commit 46e2fafc46
4 changed files with 43 additions and 33 deletions

View file

@ -370,7 +370,7 @@ namespace Ombi.Core.Tests.Engine
var repoMock = _mocker.GetMock<IRepository<RequestLog>>(); var repoMock = _mocker.GetMock<IRepository<RequestLog>>();
repoMock.Setup(x => x.GetAll()).Returns(log.AsQueryable().BuildMock().Object); repoMock.Setup(x => x.GetAll()).Returns(log.AsQueryable().BuildMock().Object);
var result = await _subject.GetRemainingMovieRequests(user); var result = await _subject.GetRemainingMovieRequests(user, today);
Assert.That(result, Is.InstanceOf<RequestQuotaCountModel>() Assert.That(result, Is.InstanceOf<RequestQuotaCountModel>()
.With.Property(nameof(RequestQuotaCountModel.HasLimit)).EqualTo(true) .With.Property(nameof(RequestQuotaCountModel.HasLimit)).EqualTo(true)
@ -409,7 +409,7 @@ namespace Ombi.Core.Tests.Engine
var repoMock = _mocker.GetMock<IRepository<RequestLog>>(); var repoMock = _mocker.GetMock<IRepository<RequestLog>>();
repoMock.Setup(x => x.GetAll()).Returns(log.AsQueryable().BuildMock().Object); repoMock.Setup(x => x.GetAll()).Returns(log.AsQueryable().BuildMock().Object);
var result = await _subject.GetRemainingMovieRequests(user); var result = await _subject.GetRemainingMovieRequests(user, today);
Assert.That(result, Is.InstanceOf<RequestQuotaCountModel>() Assert.That(result, Is.InstanceOf<RequestQuotaCountModel>()
.With.Property(nameof(RequestQuotaCountModel.HasLimit)).EqualTo(true) .With.Property(nameof(RequestQuotaCountModel.HasLimit)).EqualTo(true)

View file

@ -370,7 +370,7 @@ namespace Ombi.Core.Tests.Engine
var repoMock = _mocker.GetMock<IRepository<RequestLog>>(); var repoMock = _mocker.GetMock<IRepository<RequestLog>>();
repoMock.Setup(x => x.GetAll()).Returns(log.AsQueryable().BuildMock().Object); repoMock.Setup(x => x.GetAll()).Returns(log.AsQueryable().BuildMock().Object);
var result = await _subject.GetRemainingMusicRequests(user); var result = await _subject.GetRemainingMusicRequests(user, today);
Assert.That(result, Is.InstanceOf<RequestQuotaCountModel>() Assert.That(result, Is.InstanceOf<RequestQuotaCountModel>()
.With.Property(nameof(RequestQuotaCountModel.HasLimit)).EqualTo(true) .With.Property(nameof(RequestQuotaCountModel.HasLimit)).EqualTo(true)

View file

@ -32,7 +32,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task MovieRule_No_Limit() public async Task MovieRule_No_Limit()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingMovieRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingMovieRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = false HasLimit = false
}); });
@ -49,7 +49,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task MovieRule_Limit_NotReached() public async Task MovieRule_Limit_NotReached()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingMovieRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingMovieRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 2, Limit = 2,
@ -69,7 +69,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task MovieRule_Limit_Reached() public async Task MovieRule_Limit_Reached()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingMovieRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingMovieRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 1, Limit = 1,
@ -87,7 +87,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task MusicRule_No_Limit() public async Task MusicRule_No_Limit()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingMusicRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingMusicRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = false HasLimit = false
}); });
@ -104,7 +104,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task MusicRule_Limit_NotReached() public async Task MusicRule_Limit_NotReached()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingMusicRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingMusicRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 2, Limit = 2,
@ -124,7 +124,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task MusicRule_Limit_Reached() public async Task MusicRule_Limit_Reached()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingMusicRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingMusicRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 1, Limit = 1,
@ -143,7 +143,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task TvRule_No_Limit() public async Task TvRule_No_Limit()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = false HasLimit = false
}); });
@ -160,7 +160,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task TvRule_Limit_NotReached() public async Task TvRule_Limit_NotReached()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 2, Limit = 2,
@ -190,7 +190,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task TvRule_Limit_Reached() public async Task TvRule_Limit_Reached()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 1, Limit = 1,
@ -219,7 +219,7 @@ namespace Ombi.Core.Tests.Rule.Request
public async Task TvRule_Limit_Reached_ManyEpisodes() public async Task TvRule_Limit_Reached_ManyEpisodes()
{ {
var limitService = _mocker.GetMock<IRequestLimitService>(); var limitService = _mocker.GetMock<IRequestLimitService>();
limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>())).ReturnsAsync(new Models.RequestQuotaCountModel limitService.Setup(x => x.GetRemainingTvRequests(It.IsAny<OmbiUser>(), It.IsAny<DateTime>())).ReturnsAsync(new Models.RequestQuotaCountModel
{ {
HasLimit = true, HasLimit = true,
Limit = 1, Limit = 1,

View file

@ -14,9 +14,9 @@ namespace Ombi.Core.Services
{ {
public interface IRequestLimitService public interface IRequestLimitService
{ {
Task<RequestQuotaCountModel> GetRemainingMovieRequests(OmbiUser user = default); Task<RequestQuotaCountModel> GetRemainingMovieRequests(OmbiUser user = default, DateTime now = default);
Task<RequestQuotaCountModel> GetRemainingTvRequests(OmbiUser user = default); Task<RequestQuotaCountModel> GetRemainingTvRequests(OmbiUser user = default, DateTime now = default);
Task<RequestQuotaCountModel> GetRemainingMusicRequests(OmbiUser user = default); Task<RequestQuotaCountModel> GetRemainingMusicRequests(OmbiUser user = default, DateTime now = default);
} }
public class RequestLimitService : IRequestLimitService public class RequestLimitService : IRequestLimitService
{ {
@ -31,8 +31,12 @@ namespace Ombi.Core.Services
_requestLog = rl; _requestLog = rl;
} }
public async Task<RequestQuotaCountModel> GetRemainingMovieRequests(OmbiUser user) public async Task<RequestQuotaCountModel> GetRemainingMovieRequests(OmbiUser user, DateTime now = default)
{ {
if (now == default)
{
now = DateTime.UtcNow;
}
if (user == null) if (user == null)
{ {
user = await GetUser(); user = await GetUser();
@ -78,11 +82,15 @@ namespace Ombi.Core.Services
} }
return await CalculateBasicRemaingRequests(user, limit, user.MovieRequestLimitType ?? RequestLimitType.Day, log); return await CalculateBasicRemaingRequests(user, limit, user.MovieRequestLimitType ?? RequestLimitType.Day, log, now);
} }
public async Task<RequestQuotaCountModel> GetRemainingMusicRequests(OmbiUser user) public async Task<RequestQuotaCountModel> GetRemainingMusicRequests(OmbiUser user, DateTime now = default)
{ {
if (now == default)
{
now = DateTime.UtcNow;
}
if (user == null) if (user == null)
{ {
user = await GetUser(); user = await GetUser();
@ -128,7 +136,7 @@ namespace Ombi.Core.Services
}; };
} }
return await CalculateBasicRemaingRequests(user, limit, user.MusicRequestLimitType ?? RequestLimitType.Day, log); return await CalculateBasicRemaingRequests(user, limit, user.MusicRequestLimitType ?? RequestLimitType.Day, log, now);
} }
private async Task<OmbiUser> GetUser() private async Task<OmbiUser> GetUser()
@ -137,7 +145,7 @@ namespace Ombi.Core.Services
return await _userManager.Users.FirstOrDefaultAsync(x => x.NormalizedUserName == username); return await _userManager.Users.FirstOrDefaultAsync(x => x.NormalizedUserName == username);
} }
private static async Task<RequestQuotaCountModel> CalculateBasicRemaingRequests(OmbiUser user, int limit, RequestLimitType type, IQueryable<RequestLog> log) private static async Task<RequestQuotaCountModel> CalculateBasicRemaingRequests(OmbiUser user, int limit, RequestLimitType type, IQueryable<RequestLog> log, DateTime now)
{ {
int count = 0; int count = 0;
DateTime oldestRequestedAt = DateTime.Now; DateTime oldestRequestedAt = DateTime.Now;
@ -145,15 +153,15 @@ namespace Ombi.Core.Services
switch (type) switch (type)
{ {
case RequestLimitType.Day: case RequestLimitType.Day:
count = limit - await log.CountAsync(x => x.RequestDate >= DateTime.UtcNow.Date); count = limit - await log.CountAsync(x => x.RequestDate >= now.Date);
oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.Date) oldestRequestedAt = await log.Where(x => x.RequestDate >= now.Date)
.OrderBy(x => x.RequestDate) .OrderBy(x => x.RequestDate)
.Select(x => x.RequestDate) .Select(x => x.RequestDate)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
nextRequest = oldestRequestedAt.AddDays(1).Date; nextRequest = oldestRequestedAt.AddDays(1).Date;
break; break;
case RequestLimitType.Week: case RequestLimitType.Week:
var fdow = DateTime.UtcNow.FirstDateInWeek().Date; var fdow = now.FirstDateInWeek().Date;
count = limit - await log.CountAsync(x => x.RequestDate >= fdow); count = limit - await log.CountAsync(x => x.RequestDate >= fdow);
oldestRequestedAt = await log.Where(x => x.RequestDate >= fdow) oldestRequestedAt = await log.Where(x => x.RequestDate >= fdow)
.OrderBy(x => x.RequestDate) .OrderBy(x => x.RequestDate)
@ -162,7 +170,6 @@ namespace Ombi.Core.Services
nextRequest = fdow.AddDays(7).Date; nextRequest = fdow.AddDays(7).Date;
break; break;
case RequestLimitType.Month: case RequestLimitType.Month:
var now = DateTime.UtcNow;
var firstDayOfMonth = new DateTime(now.Year, now.Month, 1); var firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
count = limit - await log.CountAsync(x => x.RequestDate >= firstDayOfMonth); count = limit - await log.CountAsync(x => x.RequestDate >= firstDayOfMonth);
oldestRequestedAt = await log.Where(x => x.RequestDate >= firstDayOfMonth) oldestRequestedAt = await log.Where(x => x.RequestDate >= firstDayOfMonth)
@ -182,8 +189,12 @@ namespace Ombi.Core.Services
}; };
} }
public async Task<RequestQuotaCountModel> GetRemainingTvRequests(OmbiUser user) public async Task<RequestQuotaCountModel> GetRemainingTvRequests(OmbiUser user, DateTime now = default)
{ {
if (now == default)
{
now = DateTime.UtcNow;
}
if (user == null) if (user == null)
{ {
user = await GetUser(); user = await GetUser();
@ -230,7 +241,7 @@ namespace Ombi.Core.Services
count = limit - (zeroEpisodeCount + episodeCount); count = limit - (zeroEpisodeCount + episodeCount);
oldestRequestedAt = await log oldestRequestedAt = await log
.Where(x => x.RequestDate >= DateTime.UtcNow.AddDays(-7)) .Where(x => x.RequestDate >= now.AddDays(-7))
.OrderBy(x => x.RequestDate) .OrderBy(x => x.RequestDate)
.Select(x => x.RequestDate) .Select(x => x.RequestDate)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
@ -244,7 +255,6 @@ namespace Ombi.Core.Services
}; };
} }
var now = DateTime.UtcNow;
switch (user.EpisodeRequestLimitType) switch (user.EpisodeRequestLimitType)
{ {
case RequestLimitType.Day: case RequestLimitType.Day:
@ -255,7 +265,7 @@ namespace Ombi.Core.Services
episodeCount = await filteredLog.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync(); episodeCount = await filteredLog.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync();
count = limit - (zeroEpisodeCount + episodeCount); count = limit - (zeroEpisodeCount + episodeCount);
oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.Date) oldestRequestedAt = await log.Where(x => x.RequestDate >= now.Date)
.OrderBy(x => x.RequestDate) .OrderBy(x => x.RequestDate)
.Select(x => x.RequestDate) .Select(x => x.RequestDate)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
@ -263,13 +273,13 @@ namespace Ombi.Core.Services
break; break;
case RequestLimitType.Week: case RequestLimitType.Week:
var fdow = now.FirstDateInWeek().Date; var fdow = now.FirstDateInWeek().Date;
filteredLog = log.Where(x => x.RequestDate >= DateTime.UtcNow.Date.AddDays(-7)); filteredLog = log.Where(x => x.RequestDate >= now.Date.AddDays(-7));
// Needed, due to a bug which would cause all episode counts to be 0 // Needed, due to a bug which would cause all episode counts to be 0
zeroEpisodeCount = await filteredLog.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync(); zeroEpisodeCount = await filteredLog.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync();
episodeCount = await filteredLog.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync(); episodeCount = await filteredLog.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync();
count = limit - (zeroEpisodeCount + episodeCount); count = limit - (zeroEpisodeCount + episodeCount);
oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.Date.AddDays(-7)) oldestRequestedAt = await log.Where(x => x.RequestDate >= now.Date.AddDays(-7))
.OrderBy(x => x.RequestDate) .OrderBy(x => x.RequestDate)
.Select(x => x.RequestDate) .Select(x => x.RequestDate)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
@ -277,13 +287,13 @@ namespace Ombi.Core.Services
break; break;
case RequestLimitType.Month: case RequestLimitType.Month:
var firstDayOfMonth = new DateTime(now.Year, now.Month, 1); var firstDayOfMonth = new DateTime(now.Year, now.Month, 1);
filteredLog = log.Where(x => x.RequestDate >= DateTime.UtcNow.Date.AddMonths(-1)); filteredLog = log.Where(x => x.RequestDate >= now.Date.AddMonths(-1));
// Needed, due to a bug which would cause all episode counts to be 0 // Needed, due to a bug which would cause all episode counts to be 0
zeroEpisodeCount = await filteredLog.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync(); zeroEpisodeCount = await filteredLog.Where(x => x.EpisodeCount == 0).Select(x => x.EpisodeCount).CountAsync();
episodeCount = await filteredLog.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync(); episodeCount = await filteredLog.Where(x => x.EpisodeCount != 0).Select(x => x.EpisodeCount).SumAsync();
count = limit - (zeroEpisodeCount + episodeCount); count = limit - (zeroEpisodeCount + episodeCount);
oldestRequestedAt = await log.Where(x => x.RequestDate >= DateTime.UtcNow.Date.AddMonths(-1)) oldestRequestedAt = await log.Where(x => x.RequestDate >= now.Date.AddMonths(-1))
.OrderBy(x => x.RequestDate) .OrderBy(x => x.RequestDate)
.Select(x => x.RequestDate) .Select(x => x.RequestDate)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();