From 4a72055bc275cf3537e6f09eb502f67e7dd49e56 Mon Sep 17 00:00:00 2001
From: Amelia <77553571+Fesaa@users.noreply.github.com>
Date: Sun, 15 Jun 2025 23:20:37 +0200
Subject: [PATCH] Few more tests
---
API.Tests/Services/ScrobblingServiceTests.cs | 120 ++++++++++++++++++-
1 file changed, 119 insertions(+), 1 deletion(-)
diff --git a/API.Tests/Services/ScrobblingServiceTests.cs b/API.Tests/Services/ScrobblingServiceTests.cs
index a9b2e1e3d..470db0d92 100644
--- a/API.Tests/Services/ScrobblingServiceTests.cs
+++ b/API.Tests/Services/ScrobblingServiceTests.cs
@@ -21,13 +21,31 @@ public class ScrobblingServiceTests : AbstractDbTest
{
private const int ChapterPages = 100;
+ ///
+ /// {
+ /// "Issuer": "Issuer",
+ /// "Issued At": "2025-06-15T21:01:57.615Z",
+ /// "Expiration": "2200-06-15T21:01:57.615Z"
+ /// }
+ ///
+ /// Our UnitTests will fail in 2200 :(
+ private const string ValidJwtToken =
+ "eyJhbGciOiJIUzI1NiJ9.eyJJc3N1ZXIiOiJJc3N1ZXIiLCJleHAiOjcyNzI0NTAxMTcsImlhdCI6MTc1MDAyMTMxN30.zADmcGq_BfxbcV8vy4xw5Cbzn4COkmVINxgqpuL17Ng";
+
private readonly ScrobblingService _service;
private readonly ILicenseService _licenseService;
private readonly ILocalizationService _localizationService;
private readonly ILogger _logger;
private readonly IEmailService _emailService;
private readonly IKavitaPlusApiService _kavitaPlusApiService;
+ ///
+ /// IReaderService, without the ScrobblingService injected
+ ///
private readonly IReaderService _readerService;
+ ///
+ /// IReaderService, with the _service injected
+ ///
+ private readonly IReaderService _hookedUpReaderService;
public ScrobblingServiceTests()
{
@@ -46,6 +64,13 @@ public class ScrobblingServiceTests : AbstractDbTest
Substitute.For(),
Substitute.For(),
Substitute.For()); // Do not use the actual one
+
+ _readerService = new ReaderService(UnitOfWork,
+ Substitute.For>(),
+ Substitute.For(),
+ Substitute.For(),
+ Substitute.For(),
+ _service);
}
protected override async Task ResetDb()
@@ -185,6 +210,47 @@ public class ScrobblingServiceTests : AbstractDbTest
#endregion
+ #region K+ API Request data tests
+
+ [Fact]
+ public async Task ProcessReadEvents_UpdateVolumeAndChapterData()
+ {
+ await ResetDb();
+ await SeedData();
+
+ // Set Returns
+ _licenseService.HasActiveLicense().Returns(Task.FromResult(true));
+ _kavitaPlusApiService.GetRateLimit(Arg.Any(), Arg.Any())
+ .Returns(100);
+
+ var user = await UnitOfWork.UserRepository.GetUserByIdAsync(1);
+ Assert.NotNull(user);
+
+ // Ensure CanProcessScrobbleEvent returns true
+ user.AniListAccessToken = ValidJwtToken;
+ UnitOfWork.UserRepository.Update(user);
+ await UnitOfWork.CommitAsync();
+
+ var chapter = await UnitOfWork.ChapterRepository.GetChapterAsync(1);
+ Assert.NotNull(chapter);
+
+ await _service.ScrobbleReadingUpdate(1, 1);
+ var events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
+ Assert.Single(events);
+
+ // Give it some read progress
+ await _readerService.MarkChaptersAsRead(user, 1, [chapter]);
+ await UnitOfWork.CommitAsync();
+
+ await _service.ProcessUpdatesSinceLastSync();
+
+ await _kavitaPlusApiService.Received(1).PostScrobbleUpdate(
+ Arg.Is(data => data.ChapterNumber == (int)chapter.MaxNumber),
+ Arg.Any());
+ }
+
+ #endregion
+
#region Scrobble Reading Update Tests
[Fact]
@@ -265,7 +331,6 @@ public class ScrobblingServiceTests : AbstractDbTest
#endregion
-
#region ScrobbleWantToReadUpdate Tests
[Fact]
@@ -402,6 +467,59 @@ public class ScrobblingServiceTests : AbstractDbTest
#endregion
+ #region Scrobble Rating Update Test
+
+ [Fact]
+ public async Task ScrobbleRatingUpdate_IgnoreNoLicense()
+ {
+ await ResetDb();
+ await SeedData();
+
+ _licenseService.HasActiveLicense().Returns(false);
+
+ await _service.ScrobbleRatingUpdate(1, 1, 1);
+ var events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
+ Assert.Empty(events);
+ }
+
+ [Fact]
+ public async Task ScrobbleRatingUpdate_UpdateExistingNotIsProcessed()
+ {
+ await ResetDb();
+ await SeedData();
+
+ _licenseService.HasActiveLicense().Returns(true);
+
+ var user = await UnitOfWork.UserRepository.GetUserByIdAsync(1);
+ Assert.NotNull(user);
+
+ var series = await UnitOfWork.SeriesRepository.GetSeriesByIdAsync(1);
+ Assert.NotNull(series);
+
+ await _service.ScrobbleRatingUpdate(user.Id, series.Id, 1);
+ var events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
+ Assert.Single(events);
+ Assert.Equal(1, events.First().Rating);
+
+ // Mark as processed
+ events.First().IsProcessed = true;
+ await UnitOfWork.CommitAsync();
+
+ await _service.ScrobbleRatingUpdate(user.Id, series.Id, 5);
+ events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
+ Assert.Equal(2, events.Count);
+ Assert.Single(events, evt => evt.IsProcessed);
+ Assert.Single(events, evt => !evt.IsProcessed);
+
+ await _service.ScrobbleRatingUpdate(user.Id, series.Id, 5);
+ events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
+ Assert.Single(events, evt => !evt.IsProcessed);
+ Assert.Equal(5, events.First(evt => !evt.IsProcessed).Rating);
+
+ }
+
+ #endregion
+
[Theory]
[InlineData("https://anilist.co/manga/35851/Byeontaega-Doeja/", 35851)]
[InlineData("https://anilist.co/manga/30105", 30105)]