Files
MeBox/internal/service/reader/toc_url_test.go
T
truewhile b8648f0049 bug处理
2026-10-02 12:02:29 +08:00

100 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package reader
import (
"strings"
"testing"
"github.com/truewhile/MeBox/internal/model"
)
// newTocFallbackBook 建一本书架记录:只存 book_url,toc_url 留空,
// 模拟聚合类书源加入书架时的形态。
func newTocFallbackBook(t *testing.T, svc *ReaderService, serverURL string) *model.ReaderBook {
t.Helper()
book := &model.ReaderBook{
UserID: "u1",
Origin: serverURL,
OriginName: "测试源",
BookURL: serverURL + "/book/1",
Name: "斗破苍穹",
}
if err := svc.repo.CreateBook(t.Context(), book); err != nil {
t.Fatalf("创建书籍失败: %v", err)
}
return book
}
// 聚合类书源(光遇聚合一类)把目录地址放在详情结果里,加书架时只存了 book_url。
// 调用方又习惯把 book_url 当目录地址兜底(前端 toc_url || book_url),于是目录规则
// 拿到的是书籍详情页 → 0 章 → 阅读页显示「目录为空」,漫画根本进不去。
//
// GetToc 必须自己补一次详情、用详情里的 tocUrl 重抓,并把地址写回书架。
func TestGetTocFallsBackToBookInfoTocURL(t *testing.T) {
srv := e2eServer()
defer srv.Close()
svc, _ := newLoginTestService(t)
ctx := t.Context()
sourceID := importTestSource(t, svc, e2eSourceJSON(srv.URL), srv.URL)
book := newTocFallbackBook(t, svc, srv.URL)
chapters, err := svc.GetToc(ctx, "u1", sourceID, srv.URL, book.BookURL, "")
if err != nil {
t.Fatalf("抓目录失败: %v", err)
}
if len(chapters) != 2 {
t.Fatalf("应回退到详情里的 tocUrl 抓到 2 章,实际 %d 章", len(chapters))
}
// 目录地址要写回书架:之后书架/阅读页/更新目录都不用再走一次详情
stored, err := svc.repo.GetBook(ctx, book.ID)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(stored.TocURL, "/book/1/toc") {
t.Fatalf("目录地址未写回: %q", stored.TocURL)
}
}
// 前端会把空 toc_url 兜底成 book_url 传进来,这条路径同样要能拿到目录。
func TestGetTocTreatsBookURLAsMissingTocURL(t *testing.T) {
srv := e2eServer()
defer srv.Close()
svc, _ := newLoginTestService(t)
ctx := t.Context()
sourceID := importTestSource(t, svc, e2eSourceJSON(srv.URL), srv.URL)
book := newTocFallbackBook(t, svc, srv.URL)
chapters, err := svc.GetToc(ctx, "u1", sourceID, srv.URL, book.BookURL, book.BookURL)
if err != nil {
t.Fatalf("抓目录失败: %v", err)
}
if len(chapters) != 2 {
t.Fatalf("book_url 兜底的目录地址也应回退到详情,实际 %d 章", len(chapters))
}
}
// 正常源(详情给了独立目录页、调用方也传了)不能被这次改动影响。
func TestGetTocKeepsGivenTocURL(t *testing.T) {
srv := e2eServer()
defer srv.Close()
svc, _ := newLoginTestService(t)
ctx := t.Context()
sourceID := importTestSource(t, svc, e2eSourceJSON(srv.URL), srv.URL)
book := newTocFallbackBook(t, svc, srv.URL)
book.TocURL = srv.URL + "/book/1/toc.html"
if err := svc.repo.UpdateBook(ctx, book); err != nil {
t.Fatal(err)
}
chapters, err := svc.GetToc(ctx, "u1", sourceID, srv.URL, book.BookURL, book.TocURL)
if err != nil {
t.Fatalf("抓目录失败: %v", err)
}
if len(chapters) != 2 {
t.Fatalf("应正常抓到 2 章,实际 %d 章", len(chapters))
}
}