Some more unit tests, add access token errors to scrobble errors table to stop try-loop

This commit is contained in:
Amelia 2025-06-16 00:05:05 +02:00
parent 7bca05269f
commit 6642f96d8f
2 changed files with 32 additions and 3 deletions

View file

@ -1,6 +1,7 @@
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using API.Data.Repositories;
using API.DTOs.Scrobbling; using API.DTOs.Scrobbling;
using API.Entities; using API.Entities;
using API.Entities.Enums; using API.Entities.Enums;
@ -100,6 +101,18 @@ public class ScrobblingServiceTests : AbstractDbTest
.WithPages(ChapterPages) .WithPages(ChapterPages)
.Build()]) .Build()])
.Build()) .Build())
.WithVolume(new VolumeBuilder("Volume 2")
.WithChapters([
new ChapterBuilder("4")
.WithPages(ChapterPages)
.Build(),
new ChapterBuilder("5")
.WithPages(ChapterPages)
.Build(),
new ChapterBuilder("6")
.WithPages(ChapterPages)
.Build()])
.Build())
.Build(); .Build();
var library = new LibraryBuilder("Test Library", LibraryType.Manga) var library = new LibraryBuilder("Test Library", LibraryType.Manga)
@ -231,21 +244,28 @@ public class ScrobblingServiceTests : AbstractDbTest
UnitOfWork.UserRepository.Update(user); UnitOfWork.UserRepository.Update(user);
await UnitOfWork.CommitAsync(); await UnitOfWork.CommitAsync();
var chapter = await UnitOfWork.ChapterRepository.GetChapterAsync(1); var chapter = await UnitOfWork.ChapterRepository.GetChapterAsync(4);
Assert.NotNull(chapter); Assert.NotNull(chapter);
var volume = await UnitOfWork.VolumeRepository.GetVolumeAsync(1, VolumeIncludes.Chapters);
Assert.NotNull(volume);
await _service.ScrobbleReadingUpdate(1, 1); await _service.ScrobbleReadingUpdate(1, 1);
var events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1); var events = await UnitOfWork.ScrobbleRepository.GetAllEventsForSeries(1);
Assert.Single(events); Assert.Single(events);
// Give it some read progress // Give it some (more) read progress
await _readerService.MarkChaptersAsRead(user, 1, volume.Chapters);
await _readerService.MarkChaptersAsRead(user, 1, [chapter]); await _readerService.MarkChaptersAsRead(user, 1, [chapter]);
await UnitOfWork.CommitAsync(); await UnitOfWork.CommitAsync();
await _service.ProcessUpdatesSinceLastSync(); await _service.ProcessUpdatesSinceLastSync();
await _kavitaPlusApiService.Received(1).PostScrobbleUpdate( await _kavitaPlusApiService.Received(1).PostScrobbleUpdate(
Arg.Is<ScrobbleDto>(data => data.ChapterNumber == (int)chapter.MaxNumber), Arg.Is<ScrobbleDto>(data =>
data.ChapterNumber == (int)chapter.MaxNumber &&
data.VolumeNumber == (int)volume.MaxNumber
),
Arg.Any<string>()); Arg.Any<string>());
} }

View file

@ -1065,6 +1065,15 @@ public class ScrobblingService : IScrobblingService
_logger.LogCritical(ex, "Access Token for AppUserId: {AppUserId} needs to be regenerated/renewed to continue scrobbling", evt.AppUser.Id); _logger.LogCritical(ex, "Access Token for AppUserId: {AppUserId} needs to be regenerated/renewed to continue scrobbling", evt.AppUser.Id);
evt.SetErrorMessage(AccessTokenErrorMessage); evt.SetErrorMessage(AccessTokenErrorMessage);
_unitOfWork.ScrobbleRepository.Update(evt); _unitOfWork.ScrobbleRepository.Update(evt);
// Ensure series with this error do not get re-processed next sync
_unitOfWork.ScrobbleRepository.Attach(new ScrobbleError
{
Comment = AccessTokenErrorMessage,
Details = $"{evt.AppUser.UserName} has an invalid access token (K+ Error)",
LibraryId = evt.LibraryId,
SeriesId = evt.SeriesId,
});
} }
} }
catch (Exception ex) catch (Exception ex)