Skip to content

Commit

Permalink
Add search navigation tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ImoutoChan committed Jan 29, 2025
1 parent 7a2c7f6 commit 82103b7
Show file tree
Hide file tree
Showing 11 changed files with 152 additions and 41 deletions.
20 changes: 19 additions & 1 deletion Imouto.BooruParser.Tests/Loaders/DanbooruLoaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,25 @@ public async Task ShouldFind()
var searchResult = await loader.SearchAsync("1girl");
searchResult.Results.Should().NotBeEmpty();
}


[Fact]
public async Task ShouldNavigateSearch()
{
var loader = _loaderFixture.GetLoaderWithoutAuth();

var searchResult = await loader.SearchAsync("1girl");
searchResult.Results.Should().NotBeEmpty();
searchResult.PageNumber.Should().Be(1);

var searchResultNext = await loader.GetNextPageAsync(searchResult);
searchResultNext.Results.Should().NotBeEmpty();
searchResultNext.PageNumber.Should().Be(2);

var searchResultPrev = await loader.GetPreviousPageAsync(searchResultNext);
searchResultPrev.Results.Should().NotBeEmpty();
searchResultPrev.PageNumber.Should().Be(1);
}

[Fact]
public async Task ShouldFindMd5OfBannedPost()
{
Expand Down
18 changes: 18 additions & 0 deletions Imouto.BooruParser.Tests/Loaders/GelbooruLoaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,24 @@ public async Task SearchAsyncShouldFind()
post.Tags.Select(x => x.Name).Should().Contain("no bra");
}
}

[Fact]
public async Task ShouldNavigateSearch()
{
var loader = _loaderFixture.GetLoader();

var searchResult = await loader.SearchAsync("no_bra");
searchResult.Results.Should().NotBeEmpty();
searchResult.PageNumber.Should().Be(0);

var searchResultNext = await loader.GetNextPageAsync(searchResult);
searchResultNext.Results.Should().NotBeEmpty();
searchResultNext.PageNumber.Should().Be(1);

var searchResultPrev = await loader.GetPreviousPageAsync(searchResultNext);
searchResultPrev.Results.Should().NotBeEmpty();
searchResultPrev.PageNumber.Should().Be(0);
}
}

public class GetPostMetadataMethod : GelbooruLoaderTests
Expand Down
18 changes: 18 additions & 0 deletions Imouto.BooruParser.Tests/Loaders/Rule34LoaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,24 @@ public async Task SearchAsyncShouldFind()
post.Tags.Select(x => x.Name).Should().Contain("no bra");
}
}

[Fact]
public async Task ShouldNavigateSearch()
{
var loader = _loaderFixture.GetLoader();

var searchResult = await loader.SearchAsync("no_bra");
searchResult.Results.Should().NotBeEmpty();
searchResult.PageNumber.Should().Be(0);

var searchResultNext = await loader.GetNextPageAsync(searchResult);
searchResultNext.Results.Should().NotBeEmpty();
searchResultNext.PageNumber.Should().Be(1);

var searchResultPrev = await loader.GetPreviousPageAsync(searchResultNext);
searchResultPrev.Results.Should().NotBeEmpty();
searchResultPrev.PageNumber.Should().Be(0);
}
}

public class GetPostMetadataMethod : Rule34LoaderTests
Expand Down
18 changes: 18 additions & 0 deletions Imouto.BooruParser.Tests/Loaders/SankakuLoaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,24 @@ public async Task ShouldFindWithMultipleTags()
result.Results.Should().NotBeEmpty();
result.Results.Should().HaveCountGreaterThan(1);
}

[Fact]
public async Task ShouldNavigateSearch()
{
var loader = _loaderFixture.GetLoaderWithoutAuth();

var searchResult = await loader.SearchAsync("1girl");
searchResult.Results.Should().NotBeEmpty();
searchResult.PageNumber.Should().Be(1);

var searchResultNext = await loader.GetNextPageAsync(searchResult);
searchResultNext.Results.Should().NotBeEmpty();
searchResultNext.PageNumber.Should().Be(2);

var searchResultPrev = await loader.GetPreviousPageAsync(searchResultNext);
searchResultPrev.Results.Should().NotBeEmpty();
searchResultPrev.PageNumber.Should().Be(1);
}
}

public class LoadNotesHistoryAsyncMethod : SankakuLoaderTests
Expand Down
18 changes: 18 additions & 0 deletions Imouto.BooruParser.Tests/Loaders/YandereLoaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,24 @@ public async Task ShouldFind()
post.Tags.Select(x => x.Name).Should().Contain("no bra");
}
}

[Fact]
public async Task ShouldNavigateSearch()
{
var loader = _loaderFixture.GetLoader();

var searchResult = await loader.SearchAsync("no_bra");
searchResult.Results.Should().NotBeEmpty();
searchResult.PageNumber.Should().Be(1);

var searchResultNext = await loader.GetNextPageAsync(searchResult);
searchResultNext.Results.Should().NotBeEmpty();
searchResultNext.PageNumber.Should().Be(2);

var searchResultPrev = await loader.GetPreviousPageAsync(searchResultNext);
searchResultPrev.Results.Should().NotBeEmpty();
searchResultPrev.PageNumber.Should().Be(1);
}
}

public class LoadNotesHistoryAsyncMethod : YandereLoaderTests
Expand Down
4 changes: 3 additions & 1 deletion Imouto.BooruParser/Api.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ public static int GetIntId(this PostIdentity postIdentity)
public interface IBooruApiLoader
{
Task<Post> GetPostAsync(string postId);

Task<Post?> GetPostByMd5Async(string md5);

Task<SearchResult> SearchAsync(string tags);

Task<SearchResult> GetNextPageAsync(SearchResult results);

Task<SearchResult> GetPreviousPageAsync(SearchResult results);

Task<SearchResult> GetPopularPostsAsync(PopularType type);
Expand Down
13 changes: 9 additions & 4 deletions Imouto.BooruParser/Implementations/Danbooru/DanbooruApiLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,35 +92,40 @@ public async Task<SearchResult> SearchAsync(string tags)
.Select(x => new PostPreview(x.Id.ToString(), x.Md5, x.TagString, x.IsBanned, x.IsDeleted))
.ToList(),tags, 1);
}

public async Task<SearchResult> GetNextPageAsync(SearchResult results)
{
var nextPage = results.PageNumber + 1;

var posts = await _flurlClient.Request("posts.json")
.SetQueryParam("tags", results.SearchTags)
.SetQueryParam("page", results.PageNumber + 1)
.SetQueryParam("page", nextPage)
.SetQueryParam("only", "id,md5,tag_string,is_banned,is_deleted")
.WithUserAgent(_botUserAgent)
.GetJsonAsync<IReadOnlyCollection<DanbooruPostPreview>>();

return new SearchResult(posts
.Select(x => new PostPreview(x.Id.ToString(), x.Md5, x.TagString, x.IsBanned, x.IsDeleted))
.ToList(), results.SearchTags, results.PageNumber + 1);
.ToList(), results.SearchTags, nextPage);
}

public async Task<SearchResult> GetPreviousPageAsync(SearchResult results)
{
if (results.PageNumber <= 1)
throw new ArgumentOutOfRangeException("PageNumber", results.PageNumber, null);

var nextPage = results.PageNumber - 1;

var posts = await _flurlClient.Request("posts.json")
.SetQueryParam("tags", results.SearchTags)
.SetQueryParam("page", results.PageNumber - 1)
.SetQueryParam("page", nextPage)
.SetQueryParam("only", "id,md5,tag_string,is_banned,is_deleted")
.WithUserAgent(_botUserAgent)
.GetJsonAsync<IReadOnlyCollection<DanbooruPostPreview>>();

return new SearchResult(posts
.Select(x => new PostPreview(x.Id.ToString(), x.Md5, x.TagString, x.IsBanned, x.IsDeleted))
.ToList(), results.SearchTags, results.PageNumber + 1);
.ToList(), results.SearchTags, nextPage);
}

public async Task<SearchResult> GetPopularPostsAsync(PopularType type)
Expand Down
28 changes: 16 additions & 12 deletions Imouto.BooruParser/Implementations/Gelbooru/GelbooruApiLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,19 +93,21 @@ public async Task<SearchResult> SearchAsync(string tags)

return new SearchResult(postJson.Posts?
.Select(x => new PostPreview(x.Id.ToString(), x.Md5, x.Tags, false, false))
.ToArray() ?? Array.Empty<PostPreview>(), tags, 0);
.ToArray() ?? [], tags, 0);
}

public async Task<SearchResult> GetNextPageAsync(SearchResult results)
{
var nextPage = results.PageNumber + 1;

var postJson = await _flurlClient.Request("index.php")
.SetQueryParam("page", "dapi")
.SetQueryParam("s", "post")
.SetQueryParam("q", "index")
.SetQueryParam("json", 1)
.SetQueryParam("limit", 20)
.SetQueryParam("tags", results.SearchTags)
.SetQueryParam("pid", results.PageNumber + 1)
.SetQueryParam("pid", nextPage)
.GetJsonAsync<GelbooruPostPage>();

return new SearchResult(postJson.Posts?
Expand All @@ -115,22 +117,24 @@ public async Task<SearchResult> GetNextPageAsync(SearchResult results)
x.Tags,
false,
false))
.ToArray() ?? Array.Empty<PostPreview>(), results.SearchTags, results.PageNumber + 1);
.ToArray() ?? [], results.SearchTags, nextPage);
}

public async Task<SearchResult> GetPreviousPageAsync(SearchResult results)
{
if (results.PageNumber <= 0)
throw new ArgumentOutOfRangeException("PageNumber", results.PageNumber, null);

var nextPage = results.PageNumber - 1;

var postJson = await _flurlClient.Request("index.php")
.SetQueryParam("page", "dapi")
.SetQueryParam("s", "post")
.SetQueryParam("q", "index")
.SetQueryParam("json", 1)
.SetQueryParam("limit", 20)
.SetQueryParam("tags", results.SearchTags)
.SetQueryParam("pid", results.PageNumber - 1)
.SetQueryParam("pid", nextPage)
.GetJsonAsync<GelbooruPostPage>();

return new SearchResult(postJson.Posts?
Expand All @@ -140,7 +144,7 @@ public async Task<SearchResult> GetPreviousPageAsync(SearchResult results)
x.Tags,
false,
false))
.ToArray() ?? Array.Empty<PostPreview>(), results.SearchTags, results.PageNumber - 1);
.ToArray() ?? [], results.SearchTags, nextPage);
}

public Task<SearchResult> GetPopularPostsAsync(PopularType type)
Expand All @@ -167,12 +171,12 @@ public Task<HistorySearchResult<NoteHistoryEntry>> GetNoteHistoryPageAsync(
/// <remarks>
/// Haven't found any post with them
/// </remarks>
private static IReadOnlyCollection<PostIdentity> GetChildren() => Array.Empty<PostIdentity>();
private static IReadOnlyCollection<PostIdentity> GetChildren() => [];

private static IReadOnlyCollection<Note> GetNotes(GelbooruPost? post, HtmlDocument postHtml)
{
if (post?.HasNotes == "false")
return Array.Empty<Note>();
return [];

var notes = postHtml.DocumentNode
.SelectNodes(@"//*[@id='notes']/article")
Expand All @@ -190,7 +194,7 @@ private static IReadOnlyCollection<Note> GetNotes(GelbooruPost? post, HtmlDocume
var text = note.InnerText;

return new Note(id.ToString(), text, point, size);
}) ?? Enumerable.Empty<Note>();
}) ?? [];

return notes.ToList();

Expand Down Expand Up @@ -269,10 +273,10 @@ private static Post CreatePost(GelbooruPost post, HtmlDocument postHtml)
-1,
GetRating(post.Rating),
GetRatingSafeLevel(post.Rating),
Array.Empty<int>(),
[],
GetParent(post),
GetChildren(),
Array.Empty<Pool>(),
[],
GetTags(postHtml),
GetNotes(post, postHtml));

Expand Down Expand Up @@ -314,10 +318,10 @@ private static Post CreatePost(GelbooruPost post, HtmlDocument postHtml)
-1,
GetRating(rating),
GetRatingSafeLevel(rating),
Array.Empty<int>(),
[],
null,
GetChildren(),
Array.Empty<Pool>(),
[],
GetTags(postHtml),
GetNotes(null, postHtml));
}
Expand Down
15 changes: 10 additions & 5 deletions Imouto.BooruParser/Implementations/Rule34/Rule34ApiLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,19 +119,21 @@ public async Task<SearchResult> SearchAsync(string tags)

return new SearchResult(postJson?
.Select(x => new PostPreview(x.Id.ToString(), x.Hash, x.Tags, false, false))
.ToArray() ?? Array.Empty<PostPreview>(), tags, 0);
.ToArray() ?? [], tags, 0);
}

public async Task<SearchResult> GetNextPageAsync(SearchResult results)
{
var nextPage = results.PageNumber + 1;

var postJson = await _flurlJsonClient.Request("index.php")
.SetQueryParam("page", "dapi")
.SetQueryParam("s", "post")
.SetQueryParam("q", "index")
.SetQueryParam("json", 1)
.SetQueryParam("limit", 20)
.SetQueryParam("tags", results.SearchTags)
.SetQueryParam("pid", results.PageNumber + 1)
.SetQueryParam("pid", nextPage)
.GetJsonAsync<Rule34Post[]>();

return new SearchResult(postJson?
Expand All @@ -141,22 +143,24 @@ public async Task<SearchResult> GetNextPageAsync(SearchResult results)
x.Tags,
false,
false))
.ToArray() ?? Array.Empty<PostPreview>(), results.SearchTags, results.PageNumber + 1);
.ToArray() ?? [], results.SearchTags, nextPage);
}

public async Task<SearchResult> GetPreviousPageAsync(SearchResult results)
{
if (results.PageNumber <= 0)
throw new ArgumentOutOfRangeException("PageNumber", results.PageNumber, null);

var nextPage = results.PageNumber - 1;

var postJson = await _flurlJsonClient.Request("index.php")
.SetQueryParam("page", "dapi")
.SetQueryParam("s", "post")
.SetQueryParam("q", "index")
.SetQueryParam("json", 1)
.SetQueryParam("limit", 20)
.SetQueryParam("tags", results.SearchTags)
.SetQueryParam("pid", results.PageNumber - 1)
.SetQueryParam("pid", nextPage)
.GetJsonAsync<Rule34Post[]>();

return new SearchResult(postJson?
Expand All @@ -166,8 +170,9 @@ public async Task<SearchResult> GetPreviousPageAsync(SearchResult results)
x.Tags,
false,
false))
.ToArray() ?? Array.Empty<PostPreview>(), results.SearchTags, results.PageNumber - 1);
.ToArray() ?? [], results.SearchTags, nextPage);
}

public Task<SearchResult> GetPopularPostsAsync(PopularType type)
=> throw new NotSupportedException("Rule34 does not support popularity charts");

Expand Down
Loading

0 comments on commit 82103b7

Please sign in to comment.