Move all data fetching to BookInfo

This commit is contained in:
BookInfo
2021-12-24 15:13:08 +00:00
parent 2dff18490e
commit f6ff53ca31
28 changed files with 578 additions and 928 deletions
@@ -0,0 +1,126 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Books;
using NzbDrone.Core.Exceptions;
using NzbDrone.Core.MetadataSource.BookInfo;
using NzbDrone.Core.Profiles.Metadata;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
{
[TestFixture]
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
{
private MetadataProfile _metadataProfile;
[SetUp]
public void Setup()
{
UseRealHttp();
_metadataProfile = new MetadataProfile();
Mocker.GetMock<IMetadataProfileService>()
.Setup(s => s.Get(It.IsAny<int>()))
.Returns(_metadataProfile);
Mocker.GetMock<IMetadataProfileService>()
.Setup(s => s.Exists(It.IsAny<int>()))
.Returns(true);
}
[TestCase("1654", "Terry Pratchett")]
[TestCase("575", "Robert Harris")]
public void should_be_able_to_get_author_detail(string mbId, string name)
{
var details = Subject.GetAuthorInfo(mbId);
ValidateAuthor(details);
details.Name.Should().Be(name);
}
[TestCase("1128601", "Guards! Guards!")]
[TestCase("3293141", "Ιλιάς")]
public void should_be_able_to_get_book_detail(string mbId, string name)
{
var details = Subject.GetBookInfo(mbId);
ValidateBooks(new List<Book> { details.Item2 });
details.Item2.Title.Should().Be(name);
}
[TestCase("14190696", "The Book of Dust", "1")]
[TestCase("48427681", "October Daye Chronological Order", "7.1")]
public void should_parse_series_from_title(string id, string series, string position)
{
var result = Subject.GetBookInfo(id);
var link = result.Item2.SeriesLinks.Value.OrderBy(x => x.SeriesPosition).First();
link.Series.Value.Title.Should().Be(series);
link.Position.Should().Be(position);
}
[Test]
public void getting_details_of_invalid_author()
{
Assert.Throws<AuthorNotFoundException>(() => Subject.GetAuthorInfo("1"));
}
[Test]
public void getting_details_of_invalid_book()
{
Assert.Throws<BookNotFoundException>(() => Subject.GetBookInfo("99999999"));
}
private void ValidateAuthor(Author author)
{
author.Should().NotBeNull();
author.Name.Should().NotBeNullOrWhiteSpace();
author.CleanName.Should().Be(Parser.Parser.CleanAuthorName(author.Name));
author.Metadata.Value.TitleSlug.Should().NotBeNullOrWhiteSpace();
author.Metadata.Value.Overview.Should().NotBeNullOrWhiteSpace();
author.Metadata.Value.Images.Should().NotBeEmpty();
author.ForeignAuthorId.Should().NotBeNullOrWhiteSpace();
}
private void ValidateBooks(List<Book> books, bool idOnly = false)
{
books.Should().NotBeEmpty();
foreach (var book in books)
{
book.ForeignBookId.Should().NotBeNullOrWhiteSpace();
if (!idOnly)
{
ValidateBook(book);
}
}
//if atleast one book has title it means parse it working.
if (!idOnly)
{
books.Should().Contain(c => !string.IsNullOrWhiteSpace(c.Title));
}
}
private void ValidateBook(Book book)
{
book.Should().NotBeNull();
book.Title.Should().NotBeNullOrWhiteSpace();
book.Should().NotBeNull();
if (book.ReleaseDate.HasValue)
{
book.ReleaseDate.Value.Kind.Should().Be(DateTimeKind.Utc);
}
}
}
}
@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Http;
using NzbDrone.Core.Books;
using NzbDrone.Core.Http;
using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.MetadataSource.BookInfo;
using NzbDrone.Core.MetadataSource.Goodreads;
using NzbDrone.Core.Profiles.Metadata;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
{
[TestFixture]
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
{
[SetUp]
public void Setup()
{
UseRealHttp();
Mocker.SetConstant<IGoodreadsSearchProxy>(Mocker.Resolve<GoodreadsSearchProxy>());
var httpClient = Mocker.Resolve<IHttpClient>();
Mocker.GetMock<ICachedHttpResponseService>()
.Setup(x => x.Get<List<SearchJsonResource>>(It.IsAny<HttpRequest>(), It.IsAny<bool>(), It.IsAny<TimeSpan>()))
.Returns((HttpRequest request, bool useCache, TimeSpan ttl) => httpClient.Get<List<SearchJsonResource>>(request));
var metadataProfile = new MetadataProfile();
Mocker.GetMock<IMetadataProfileService>()
.Setup(s => s.All())
.Returns(new List<MetadataProfile> { metadataProfile });
Mocker.GetMock<IMetadataProfileService>()
.Setup(s => s.Get(It.IsAny<int>()))
.Returns(metadataProfile);
}
[TestCase("Robert Harris", "Robert Harris")]
[TestCase("James Patterson", "James Patterson")]
[TestCase("Antoine de Saint-Exupéry", "Antoine de Saint-Exupéry")]
public void successful_author_search(string title, string expected)
{
var result = Subject.SearchForNewAuthor(title);
result.Should().NotBeEmpty();
result[0].Name.Should().Be(expected);
ExceptionVerification.IgnoreWarns();
}
[TestCase("Harry Potter and the sorcerer's stone", null, "Harry Potter and the Sorcerer's Stone")]
[TestCase("edition:3", null, "Harry Potter and the Sorcerer's Stone")]
[TestCase("edition: 3", null, "Harry Potter and the Sorcerer's Stone")]
[TestCase("asin:B0192CTMYG", null, "Harry Potter and the Sorcerer's Stone")]
[TestCase("isbn:9780439554930", null, "Harry Potter and the Sorcerer's Stone")]
public void successful_book_search(string title, string author, string expected)
{
var result = Subject.SearchForNewBook(title, author);
result.Should().NotBeEmpty();
result[0].Editions.Value[0].Title.Should().Be(expected);
ExceptionVerification.IgnoreWarns();
}
[TestCase("edition:")]
[TestCase("edition: 99999999999999999999")]
[TestCase("edition: 0")]
[TestCase("edition: -12")]
[TestCase("edition: aaaa")]
[TestCase("adjalkwdjkalwdjklawjdlKAJD")]
public void no_author_search_result(string term)
{
var result = Subject.SearchForNewAuthor(term);
result.Should().BeEmpty();
ExceptionVerification.IgnoreWarns();
}
[TestCase("Philip Pullman", 0, typeof(Author), "Philip Pullman")]
[TestCase("Philip Pullman", 1, typeof(Book), "Northern Lights")]
public void successful_combined_search(string query, int position, Type resultType, string expected)
{
var result = Subject.SearchForNewEntity(query);
result.Should().NotBeEmpty();
result[position].GetType().Should().Be(resultType);
if (resultType == typeof(Author))
{
var cast = result[position] as Author;
cast.Should().NotBeNull();
cast.Name.Should().Be(expected);
}
else
{
var cast = result[position] as Book;
cast.Should().NotBeNull();
cast.Title.Should().Be(expected);
}
}
}
}