Scrobbling Polish and Some Scanner fixes (#3638)
Co-authored-by: Fesaa <77553571+Fesaa@users.noreply.github.com>
This commit is contained in:
parent
82e8f7fade
commit
f281a63934
19 changed files with 658 additions and 102 deletions
|
@ -1,11 +1,208 @@
|
|||
using API.Services.Plus;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using API.DTOs.Scrobbling;
|
||||
using API.Entities.Enums;
|
||||
using API.Helpers.Builders;
|
||||
using API.Services;
|
||||
using API.Services.Plus;
|
||||
using API.SignalR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using NSubstitute;
|
||||
using Xunit;
|
||||
|
||||
namespace API.Tests.Services;
|
||||
#nullable enable
|
||||
|
||||
public class ScrobblingServiceTests
|
||||
public class ScrobblingServiceTests : AbstractDbTest
|
||||
{
|
||||
private readonly ScrobblingService _service;
|
||||
private readonly ILicenseService _licenseService;
|
||||
private readonly ILocalizationService _localizationService;
|
||||
private readonly ILogger<ScrobblingService> _logger;
|
||||
private readonly IEmailService _emailService;
|
||||
|
||||
public ScrobblingServiceTests()
|
||||
{
|
||||
_licenseService = Substitute.For<ILicenseService>();
|
||||
_localizationService = Substitute.For<ILocalizationService>();
|
||||
_logger = Substitute.For<ILogger<ScrobblingService>>();
|
||||
_emailService = Substitute.For<IEmailService>();
|
||||
|
||||
_service = new ScrobblingService(_unitOfWork, Substitute.For<IEventHub>(), _logger, _licenseService, _localizationService, _emailService);
|
||||
}
|
||||
|
||||
protected override async Task ResetDb()
|
||||
{
|
||||
_context.ScrobbleEvent.RemoveRange(_context.ScrobbleEvent.ToList());
|
||||
_context.Series.RemoveRange(_context.Series.ToList());
|
||||
_context.Library.RemoveRange(_context.Library.ToList());
|
||||
_context.AppUser.RemoveRange(_context.AppUser.ToList());
|
||||
|
||||
await _unitOfWork.CommitAsync();
|
||||
}
|
||||
|
||||
private async Task SeedData()
|
||||
{
|
||||
var series = new SeriesBuilder("Test Series")
|
||||
.WithFormat(MangaFormat.Archive)
|
||||
.WithMetadata(new SeriesMetadataBuilder().Build())
|
||||
.Build();
|
||||
|
||||
var library = new LibraryBuilder("Test Library", LibraryType.Manga)
|
||||
.WithAllowScrobbling(true)
|
||||
.WithSeries(series)
|
||||
.Build();
|
||||
|
||||
|
||||
_context.Library.Add(library);
|
||||
|
||||
var user = new AppUserBuilder("testuser", "testuser")
|
||||
//.WithPreferences(new UserPreferencesBuilder().WithAniListScrobblingEnabled(true).Build())
|
||||
.Build();
|
||||
|
||||
user.UserPreferences.AniListScrobblingEnabled = true;
|
||||
|
||||
_unitOfWork.UserRepository.Add(user);
|
||||
|
||||
await _unitOfWork.CommitAsync();
|
||||
}
|
||||
|
||||
#region ScrobbleWantToReadUpdate Tests
|
||||
|
||||
[Fact]
|
||||
public async Task ScrobbleWantToReadUpdate_NoExistingEvents_WantToRead_ShouldCreateNewEvent()
|
||||
{
|
||||
// Arrange
|
||||
await SeedData();
|
||||
_licenseService.HasActiveLicense().Returns(Task.FromResult(true));
|
||||
|
||||
const int userId = 1;
|
||||
const int seriesId = 1;
|
||||
|
||||
// Act
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, true);
|
||||
|
||||
// Assert
|
||||
var events = await _unitOfWork.ScrobbleRepository.GetAllEventsForSeries(seriesId);
|
||||
Assert.Single(events);
|
||||
Assert.Equal(ScrobbleEventType.AddWantToRead, events[0].ScrobbleEventType);
|
||||
Assert.Equal(userId, events[0].AppUserId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ScrobbleWantToReadUpdate_NoExistingEvents_RemoveWantToRead_ShouldCreateNewEvent()
|
||||
{
|
||||
// Arrange
|
||||
await SeedData();
|
||||
_licenseService.HasActiveLicense().Returns(Task.FromResult(true));
|
||||
|
||||
const int userId = 1;
|
||||
const int seriesId = 1;
|
||||
|
||||
// Act
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, false);
|
||||
|
||||
// Assert
|
||||
var events = await _unitOfWork.ScrobbleRepository.GetAllEventsForSeries(seriesId);
|
||||
Assert.Single(events);
|
||||
Assert.Equal(ScrobbleEventType.RemoveWantToRead, events[0].ScrobbleEventType);
|
||||
Assert.Equal(userId, events[0].AppUserId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ScrobbleWantToReadUpdate_ExistingWantToReadEvent_WantToRead_ShouldNotCreateNewEvent()
|
||||
{
|
||||
// Arrange
|
||||
await SeedData();
|
||||
_licenseService.HasActiveLicense().Returns(Task.FromResult(true));
|
||||
|
||||
const int userId = 1;
|
||||
const int seriesId = 1;
|
||||
|
||||
// First, let's create an event through the service
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, true);
|
||||
|
||||
// Act - Try to create the same event again
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, true);
|
||||
|
||||
// Assert
|
||||
var events = await _unitOfWork.ScrobbleRepository.GetAllEventsForSeries(seriesId);
|
||||
|
||||
Assert.Single(events);
|
||||
Assert.All(events, e => Assert.Equal(ScrobbleEventType.AddWantToRead, e.ScrobbleEventType));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ScrobbleWantToReadUpdate_ExistingWantToReadEvent_RemoveWantToRead_ShouldAddRemoveEvent()
|
||||
{
|
||||
// Arrange
|
||||
await SeedData();
|
||||
_licenseService.HasActiveLicense().Returns(Task.FromResult(true));
|
||||
|
||||
const int userId = 1;
|
||||
const int seriesId = 1;
|
||||
|
||||
// First, let's create a want-to-read event through the service
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, true);
|
||||
|
||||
// Act - Now remove from want-to-read
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, false);
|
||||
|
||||
// Assert
|
||||
var events = await _unitOfWork.ScrobbleRepository.GetAllEventsForSeries(seriesId);
|
||||
|
||||
Assert.Single(events);
|
||||
Assert.Contains(events, e => e.ScrobbleEventType == ScrobbleEventType.RemoveWantToRead);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ScrobbleWantToReadUpdate_ExistingRemoveWantToReadEvent_RemoveWantToRead_ShouldNotCreateNewEvent()
|
||||
{
|
||||
// Arrange
|
||||
await SeedData();
|
||||
_licenseService.HasActiveLicense().Returns(Task.FromResult(true));
|
||||
|
||||
const int userId = 1;
|
||||
const int seriesId = 1;
|
||||
|
||||
// First, let's create a remove-from-want-to-read event through the service
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, false);
|
||||
|
||||
// Act - Try to create the same event again
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, false);
|
||||
|
||||
// Assert
|
||||
var events = await _unitOfWork.ScrobbleRepository.GetAllEventsForSeries(seriesId);
|
||||
|
||||
Assert.Single(events);
|
||||
Assert.All(events, e => Assert.Equal(ScrobbleEventType.RemoveWantToRead, e.ScrobbleEventType));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ScrobbleWantToReadUpdate_ExistingRemoveWantToReadEvent_WantToRead_ShouldAddWantToReadEvent()
|
||||
{
|
||||
// Arrange
|
||||
await SeedData();
|
||||
_licenseService.HasActiveLicense().Returns(Task.FromResult(true));
|
||||
|
||||
const int userId = 1;
|
||||
const int seriesId = 1;
|
||||
|
||||
// First, let's create a remove-from-want-to-read event through the service
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, false);
|
||||
|
||||
// Act - Now add to want-to-read
|
||||
await _service.ScrobbleWantToReadUpdate(userId, seriesId, true);
|
||||
|
||||
// Assert
|
||||
var events = await _unitOfWork.ScrobbleRepository.GetAllEventsForSeries(seriesId);
|
||||
|
||||
Assert.Single(events);
|
||||
Assert.Contains(events, e => e.ScrobbleEventType == ScrobbleEventType.AddWantToRead);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
[Theory]
|
||||
[InlineData("https://anilist.co/manga/35851/Byeontaega-Doeja/", 35851)]
|
||||
[InlineData("https://anilist.co/manga/30105", 30105)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue