feat(street): 公开详情改为runway同形嵌套;审核页合并为图片流

This commit is contained in:
toom1996
2026-09-21 23:24:00 +08:00
parent 49bd7b74c6
commit 85ad3a3f68
5 changed files with 119 additions and 108 deletions

View File

@ -7,12 +7,13 @@ import (
"fashionapi/internal/pkg/imgurl"
)
// TestGroupSnapImages 验证主副图分组与「副图的副图」上浮归并。
// TestBuildSnapImages 验证公开详情的 image 只含主图、副图嵌套在其主图的 Detail 下,
// 且「副图的副图」上浮归并到该副图所在组的主图。
//
// 5 张图:A 主,B 副(挂 A);C 主;D 副(挂 C);E 副(挂 B → 应上浮归并到 A)
//
// 期望 2 组:第 0 组 = A + [B, E],第 1 组 = C + [D]。
func TestGroupSnapImages(t *testing.T) {
// 期望 images 只有 2 张主图:A(Detail=[B,E], LookIndex=1)、C(Detail=[D], LookIndex=2)。
func TestBuildSnapImages(t *testing.T) {
s := &streetSnapService{img: imgurl.New("", "", "")}
imgs := []model.StreetSnapImage{
{ID: 1, Image: "A", Name: "A", IsDetail: 0, ParentImageID: 0},
@ -22,46 +23,45 @@ func TestGroupSnapImages(t *testing.T) {
{ID: 5, Image: "E", Name: "E", IsDetail: 1, ParentImageID: 2}, // 2 是副图 → 上浮到 A
}
flat, groups := s.groupSnapImages(imgs)
if len(flat) != 5 {
t.Fatalf("flat 应 5 张,实际 %d", len(flat))
}
if len(groups) != 2 {
t.Fatalf("groups 应为 2 组,实际 %d", len(groups))
out := s.buildSnapImages(imgs)
if len(out) != 2 {
t.Fatalf("images 应只含 2 张主图,实际 %d", len(out))
}
g0 := groups[0]
if g0.Image.Name != "A" {
t.Fatalf("第 0 组主图应为 A,实际 %s", g0.Image.Name)
a := out[0]
if a.Name != "A" || a.IsDetail != 0 || a.LookIndex != 1 {
t.Fatalf("第 1 张应为 A 主图 LookIndex=1,实际 name=%s is_detail=%d look=%d", a.Name, a.IsDetail, a.LookIndex)
}
if len(g0.Details) != 2 {
t.Fatalf("第 0 组副图应为 2 张,实际 %d", len(g0.Details))
if len(a.Detail) != 2 || a.Detail[0].Name != "B" || a.Detail[1].Name != "E" {
t.Fatalf("A 的副图应依序为 [B,E],实际 %d 张", len(a.Detail))
}
if g0.Details[0].Name != "B" || g0.Details[1].Name != "E" {
t.Fatalf("第 0 组副图顺序应为 [B, E],实际 %s, %s", g0.Details[0].Name, g0.Details[1].Name)
for _, d := range a.Detail {
if d.IsDetail != 1 || d.LookIndex != 1 {
t.Fatalf("副图 %s 的 is_detail/look_index 应为 1/1,实际 %d/%d", d.Name, d.IsDetail, d.LookIndex)
}
}
g1 := groups[1]
if g1.Image.Name != "C" {
t.Fatalf("第 1 组主图应为 C,实际 %s", g1.Image.Name)
c := out[1]
if c.Name != "C" || c.LookIndex != 2 {
t.Fatalf("第 2 张应为 C 主图 LookIndex=2,实际 name=%s look=%d", c.Name, c.LookIndex)
}
if len(g1.Details) != 1 || g1.Details[0].Name != "D" {
t.Fatalf("第 1 组副图应为 [D],实际 %d 张", len(g1.Details))
if len(c.Detail) != 1 || c.Detail[0].Name != "D" {
t.Fatalf("C 的副图应为 [D],实际 %d 张", len(c.Detail))
}
}
// TestGroupSnapImagesOrphan 父引用指向失效行(不存在)时,该图按主图渲染,不丢图。
func TestGroupSnapImagesOrphan(t *testing.T) {
// TestBuildSnapImagesOrphan 父引用指向失效行(不存在)时,该图按主图渲染,不丢图。
func TestBuildSnapImagesOrphan(t *testing.T) {
s := &streetSnapService{img: imgurl.New("", "", "")}
imgs := []model.StreetSnapImage{
{ID: 1, Image: "A", Name: "A", IsDetail: 1, ParentImageID: 99}, // 父 99 不存在
{ID: 2, Image: "B", Name: "B", IsDetail: 0, ParentImageID: 0},
}
flat, groups := s.groupSnapImages(imgs)
if len(flat) != 2 || len(groups) != 2 {
t.Fatalf("孤儿副图应自成主图:flat=%d groups=%d", len(flat), len(groups))
out := s.buildSnapImages(imgs)
if len(out) != 2 {
t.Fatalf("孤儿副图应自成主图:images=%d", len(out))
}
if groups[0].Image.Name != "A" || len(groups[0].Details) != 0 {
t.Fatalf("A 应作为主图且无副图,实际 %s details=%d", groups[0].Image.Name, len(groups[0].Details))
if out[0].Name != "A" || out[0].IsDetail != 0 || len(out[0].Detail) != 0 {
t.Fatalf("A 应作为无副图的主图,实际 name=%s is_detail=%d details=%d", out[0].Name, out[0].IsDetail, len(out[0].Detail))
}
}