Include some unit tests for the new K+ Completed check
This commit is contained in:
parent
b40b25a4e7
commit
c1471db264
3 changed files with 193 additions and 3 deletions
|
|
@ -15,6 +15,7 @@ using API.Entities.Person;
|
||||||
using API.Helpers.Builders;
|
using API.Helpers.Builders;
|
||||||
using API.Services.Plus;
|
using API.Services.Plus;
|
||||||
using API.Services.Tasks.Metadata;
|
using API.Services.Tasks.Metadata;
|
||||||
|
using API.Services.Tasks.Scanner.Parser;
|
||||||
using API.SignalR;
|
using API.SignalR;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
@ -881,6 +882,181 @@ public class ExternalMetadataServiceTests : AbstractDbTest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_ExactMatch()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Exact Match";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(5)
|
||||||
|
.WithTotalCount(5)
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>();
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 5, Volumes = 0 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, Parser.DefaultChapterNumber);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_Volumes_IncludeSpecialsCheck()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Volume Complete";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(2)
|
||||||
|
.WithTotalCount(3)
|
||||||
|
.Build())
|
||||||
|
.WithVolume(new VolumeBuilder("1").WithNumber(1).Build())
|
||||||
|
.WithVolume(new VolumeBuilder("2").WithNumber(2).Build())
|
||||||
|
.WithVolume(new VolumeBuilder("2.5").WithNumber(2.5f).Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>();
|
||||||
|
// External metadata includes special (2.5)
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 0, Volumes = 3 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, 2);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
Assert.Equal(3, series.Metadata.MaxCount);
|
||||||
|
Assert.Equal(3, series.Metadata.TotalCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_Volumes_TooManySpecials()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Volume Complete";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(2)
|
||||||
|
.WithTotalCount(3)
|
||||||
|
.Build())
|
||||||
|
.WithVolume(new VolumeBuilder("1").WithNumber(1).Build())
|
||||||
|
.WithVolume(new VolumeBuilder("2").WithNumber(2).Build())
|
||||||
|
.WithVolume(new VolumeBuilder("2.1").WithNumber(2.1f).Build())
|
||||||
|
.WithVolume(new VolumeBuilder("2.2").WithNumber(2.2f).Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>();
|
||||||
|
// External metadata includes no special. There are 3 volumes. And we're missing volume 3
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 0, Volumes = 3 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, 2);
|
||||||
|
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_NoVolumes_GEQChapterCheck()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Chapter MaxCount, no volumes";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(10)
|
||||||
|
.WithTotalCount(8)
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>();
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 10, Volumes = 0 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, Parser.DefaultChapterNumber);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
Assert.Equal(10, series.Metadata.TotalCount);
|
||||||
|
Assert.Equal(10, series.Metadata.MaxCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_NoVolumes_IncludeAllChaptersCheck()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Chapter Count";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(8)
|
||||||
|
.WithTotalCount(5)
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>
|
||||||
|
{
|
||||||
|
new ChapterBuilder("0").Build(),
|
||||||
|
new ChapterBuilder("2").Build(),
|
||||||
|
new ChapterBuilder("3").Build(),
|
||||||
|
new ChapterBuilder("4").Build(),
|
||||||
|
new ChapterBuilder("5").Build(),
|
||||||
|
new ChapterBuilder("6").Build(),
|
||||||
|
new ChapterBuilder("7").Build(),
|
||||||
|
new ChapterBuilder("7.1").Build(),
|
||||||
|
new ChapterBuilder("7.2").Build(),
|
||||||
|
new ChapterBuilder("7.3").Build()
|
||||||
|
};
|
||||||
|
// External metadata includes prologues (0) and extra's (7.X)
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 10, Volumes = 0 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, Parser.DefaultChapterNumber);
|
||||||
|
|
||||||
|
Assert.True(result);
|
||||||
|
Assert.Equal(10, series.Metadata.TotalCount);
|
||||||
|
Assert.Equal(10, series.Metadata.MaxCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_NotEnoughVolumes()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Incomplete Volume";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(2)
|
||||||
|
.WithTotalCount(5)
|
||||||
|
.Build())
|
||||||
|
.WithVolume(new VolumeBuilder("1").WithNumber(1).Build())
|
||||||
|
.WithVolume(new VolumeBuilder("2").WithNumber(2).Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>();
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 0, Volumes = 5 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, 2);
|
||||||
|
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsSeriesCompleted_NoVolumes_NotEnoughChapters()
|
||||||
|
{
|
||||||
|
const string seriesName = "Test - Incomplete Chapter";
|
||||||
|
var series = new SeriesBuilder(seriesName)
|
||||||
|
.WithLibraryId(1)
|
||||||
|
.WithMetadata(new SeriesMetadataBuilder()
|
||||||
|
.WithMaxCount(5)
|
||||||
|
.WithTotalCount(8)
|
||||||
|
.Build())
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
var chapters = new List<Chapter>
|
||||||
|
{
|
||||||
|
new ChapterBuilder("1").Build(),
|
||||||
|
new ChapterBuilder("2").Build(),
|
||||||
|
new ChapterBuilder("3").Build()
|
||||||
|
};
|
||||||
|
var externalMetadata = new ExternalSeriesDetailDto { Chapters = 10, Volumes = 0 };
|
||||||
|
|
||||||
|
var result = ExternalMetadataService.IsSeriesCompleted(series, chapters, externalMetadata, Parser.DefaultChapterNumber);
|
||||||
|
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -115,4 +115,16 @@ public class SeriesMetadataBuilder : IEntityBuilder<SeriesMetadata>
|
||||||
_seriesMetadata.TagsLocked = lockStatus;
|
_seriesMetadata.TagsLocked = lockStatus;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SeriesMetadataBuilder WithMaxCount(int count)
|
||||||
|
{
|
||||||
|
_seriesMetadata.MaxCount = count;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SeriesMetadataBuilder WithTotalCount(int count)
|
||||||
|
{
|
||||||
|
_seriesMetadata.TotalCount = count;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1612,7 +1612,7 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
{
|
{
|
||||||
status = PublicationStatus.Ended;
|
status = PublicationStatus.Ended;
|
||||||
|
|
||||||
if (IsSeriesCompleted(series, chapters, externalMetadata, maxVolume, maxChapter))
|
if (IsSeriesCompleted(series, chapters, externalMetadata, maxVolume))
|
||||||
{
|
{
|
||||||
status = PublicationStatus.Completed;
|
status = PublicationStatus.Completed;
|
||||||
}
|
}
|
||||||
|
|
@ -1636,10 +1636,9 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
/// <param name="chapters"></param>
|
/// <param name="chapters"></param>
|
||||||
/// <param name="externalMetadata"></param>
|
/// <param name="externalMetadata"></param>
|
||||||
/// <param name="maxVolumes"></param>
|
/// <param name="maxVolumes"></param>
|
||||||
/// <param name="maxChapters"></param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/// <remarks>Updates MaxCount and TotalCount if a loosy check is used to set as completed</remarks>
|
/// <remarks>Updates MaxCount and TotalCount if a loosy check is used to set as completed</remarks>
|
||||||
private static bool IsSeriesCompleted(Series series, List<Chapter> chapters, ExternalSeriesDetailDto externalMetadata, int maxVolumes, int maxChapters)
|
public static bool IsSeriesCompleted(Series series, List<Chapter> chapters, ExternalSeriesDetailDto externalMetadata, int maxVolumes)
|
||||||
{
|
{
|
||||||
// A series is completed if exactly the amount is found
|
// A series is completed if exactly the amount is found
|
||||||
if (series.Metadata.MaxCount == series.Metadata.TotalCount && series.Metadata.TotalCount > 0)
|
if (series.Metadata.MaxCount == series.Metadata.TotalCount && series.Metadata.TotalCount > 0)
|
||||||
|
|
@ -1651,6 +1650,9 @@ public class ExternalMetadataService : IExternalMetadataService
|
||||||
//
|
//
|
||||||
// TODO BUG: If the series has specials, that are not included in the external count. But you do own them
|
// TODO BUG: If the series has specials, that are not included in the external count. But you do own them
|
||||||
// This may mark the series as completed pre-maturely
|
// This may mark the series as completed pre-maturely
|
||||||
|
// Note: I've currently opted to keep this an equals to prevent the above bug from happening
|
||||||
|
// We *could* change this to >= in the future in case this is reported by users
|
||||||
|
// If we do; test IsSeriesCompleted_Volumes_TooManySpecials needs to be updated
|
||||||
if (maxVolumes != Parser.DefaultChapterNumber && series.Volumes.Count == externalMetadata.Volumes)
|
if (maxVolumes != Parser.DefaultChapterNumber && series.Volumes.Count == externalMetadata.Volumes)
|
||||||
{
|
{
|
||||||
series.Metadata.MaxCount = series.Volumes.Count;
|
series.Metadata.MaxCount = series.Volumes.Count;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue