From 7ac75ec69af8ffc2ac404427ef8011db04a9d4d1 Mon Sep 17 00:00:00 2001
From: truewhile <62226914+truewhile@users.noreply.github.com>
Date: Tue, 1 Sep 2026 14:22:52 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20beta=20CI=20?=
=?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E4=B8=A4=E4=B8=AA=E5=B9=B3=E5=8F=B0?=
=?UTF-8?q?/=E7=BD=91=E7=BB=9C=E6=95=8F=E6=84=9F=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- TestSanitizePathWithSpecialChars:Windows 盘符断言按 runtime.GOOS 分支
(Linux 下反斜杠统一为分隔符,期望 D/test/...)
- TestEnrichOneAdultScrapesArtwork:AdultProvider 改用 RoundTripper 全量
mock,拦截所有外网请求(CI 环境可达 javdb/dmm 时会把真实封面写入
断言导致失败);断言放宽为封面路径后缀
---
internal/service/scraper_test.go | 30 ++++++++++++++++++++----------
internal/service/strm_sync_test.go | 10 +++++++++-
2 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/internal/service/scraper_test.go b/internal/service/scraper_test.go
index 2500645..1dfa893 100644
--- a/internal/service/scraper_test.go
+++ b/internal/service/scraper_test.go
@@ -2,8 +2,8 @@ package service
import (
"errors"
+ "io"
"net/http"
- "net/http/httptest"
"path/filepath"
"strings"
"testing"
@@ -396,15 +396,19 @@ func TestEnrichOneAdultScrapesArtwork(t *testing.T) {
t.Fatal(err)
}
- // Mock adult provider
- adultServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "text/html; charset=utf-8")
- _, _ = w.Write([]byte(`
IPX-235 测试番号封面
`))
- }))
- defer adultServer.Close()
-
+ // Mock adult provider:RoundTripper 拦截 provider 发出的全部请求(不访问
+ // 外网),任何站点都返回带封面链接的测试 HTML——保证 CI 上不命中真实
+ // javdb/dmm 站点(外网可达时会把真实封面写进断言导致失败)。
+ adultHTML := `IPX-235 测试番号封面
`
+ mockAdultTransport := roundTripFunc(func(r *http.Request) (*http.Response, error) {
+ return &http.Response{
+ StatusCode: http.StatusOK,
+ Header: http.Header{"Content-Type": []string{"text/html; charset=utf-8"}},
+ Body: io.NopCloser(strings.NewReader(adultHTML)),
+ }, nil
+ })
scraper.adult = &AdultProvider{
- client: adultServer.Client(),
+ client: &http.Client{Transport: mockAdultTransport},
}
if err := scraper.EnrichOne(t.Context(), &media); err != nil {
@@ -418,7 +422,13 @@ func TestEnrichOneAdultScrapesArtwork(t *testing.T) {
if got.ScrapeStatus != "matched" {
t.Fatalf("ScrapeStatus = %q, want 'matched'", got.ScrapeStatus)
}
- if got.PosterURL != "https://pics.dmm.co.jp/digital/video/ipx00235/ipx00235pl.jpg" && got.PosterURL != adultServer.URL+"/pics/cover/ipx235.jpg" {
+ // 封面来自 mock HTML 的 cover 链接(Host 随站点变化,只校验路径后缀)。
+ if got.PosterURL != "https://pics.dmm.co.jp/digital/video/ipx00235/ipx00235pl.jpg" && !strings.HasSuffix(got.PosterURL, "/pics/cover/ipx235.jpg") {
t.Fatalf("unexpected PosterURL = %q", got.PosterURL)
}
}
+
+// roundTripFunc 把函数适配为 http.RoundTripper,用于测试中拦截全部外网请求。
+type roundTripFunc func(*http.Request) (*http.Response, error)
+
+func (f roundTripFunc) RoundTrip(r *http.Request) (*http.Response, error) { return f(r) }
diff --git a/internal/service/strm_sync_test.go b/internal/service/strm_sync_test.go
index c1da6b8..01cd509 100644
--- a/internal/service/strm_sync_test.go
+++ b/internal/service/strm_sync_test.go
@@ -7,6 +7,7 @@ import (
"net/url"
"os"
"path/filepath"
+ "runtime"
"strings"
"sync"
"testing"
@@ -291,8 +292,15 @@ func TestSanitizePathWithSpecialChars(t *testing.T) {
}
// Test sanitizeLocalPath - Windows Drive
+ // sanitizeLocalPath 的盘符处理是平台相关的:Windows 保留 `D:\` 前缀,
+ // Linux 把反斜杠统一当作分隔符(结果等价于 D:/test/...)。
localWin := `D:\test\动漫\数码宝贝:拯救者\poster.jpg`
- wantLocalWin := filepath.Join(`D:\`, "test", "动漫", "数码宝贝 拯救者", "poster.jpg")
+ var wantLocalWin string
+ if runtime.GOOS == "windows" {
+ wantLocalWin = filepath.Join(`D:\`, "test", "动漫", "数码宝贝 拯救者", "poster.jpg")
+ } else {
+ wantLocalWin = filepath.Join("D", "test", "动漫", "数码宝贝 拯救者", "poster.jpg")
+ }
if got := sanitizeLocalPath(localWin); got != wantLocalWin {
t.Errorf("sanitizeLocalPath(%q) = %q, want %q", localWin, got, wantLocalWin)
}