2026-08-13 11:15:54 +08:00
package service
import (
"errors"
"testing"
"time"
"cmautobuy/admin/model"
"cmautobuy/admin/repository"
)
2026-08-13 11:47:56 +08:00
func TestShop_管理员维护单一店铺名称并精确关联历史数据 ( t * testing . T ) {
2026-08-13 11:15:54 +08:00
db := newTestDB ( t )
now := time . Date ( 2026 , 8 , 13 , 10 , 0 , 0 , 0 , time . UTC )
admin := & model . User { UserID : "SHOP-ADMIN" , Username : "shop-admin" , PasswordHash : "x" ,
Role : model . RoleAdmin , Status : model . UserActive , PasswordChangedAt : model . NowISO (),
CreatedAt : model . NowISO (), UpdatedAt : model . NowISO ()}
if err := repository . CreateUser ( db , * admin ); err != nil {
t . Fatal ( err )
}
if _ , err := db . Exec ( `INSERT INTO shopee_products(goods_id,title,shopee_shop_name,source,created_at,updated_at)
2026-08-13 11:47:56 +08:00
VALUES('S-HISTORY','历史商品','统一店铺','api',?,?)` , model . NowISO (), model . NowISO ()); err != nil {
2026-08-13 11:15:54 +08:00
t . Fatal ( err )
}
2026-08-13 11:47:56 +08:00
if err := CreateShop ( db , admin , "统一店铺" , now ); err != nil {
2026-08-13 11:15:54 +08:00
t . Fatal ( err )
}
result , err := ListShops ( db , admin )
if err != nil || len ( result . Items ) != 1 {
t . Fatalf ( "店铺列表错误: %+v %v" , result , err )
}
shop := result . Items [ 0 ]
2026-08-13 11:47:56 +08:00
if ! shop . Enabled || shop . ShopeeProductCount != 1 {
2026-08-13 11:15:54 +08:00
t . Fatalf ( "店铺状态或回填错误: %+v" , shop )
}
product , err := repository . GetShopeeProductByGoodsID ( db , "S-HISTORY" )
if err != nil || product . ShopID != shop . ShopID {
t . Fatalf ( "蝦皮商品未精确关联: %+v %v" , product , err )
}
2026-08-13 11:47:56 +08:00
var aliases int
if err := db . QueryRow ( `SELECT COUNT(*) FROM shop_channel_aliases WHERE shop_id=? AND alias_name='统一店铺' AND enabled=1` , shop . ShopID ). Scan ( & aliases ); err != nil || aliases != 2 {
t . Fatalf ( "两个兼容渠道记录必须由同一名称派生: count=%d err=%v" , aliases , err )
}
if err := SetShopEnabled ( db , admin , shop . ShopID , false , now . Add ( time . Minute )); err != nil {
2026-08-13 11:15:54 +08:00
t . Fatal ( err )
}
2026-08-13 11:47:56 +08:00
if err := db . QueryRow ( `SELECT COUNT(*) FROM shop_channel_aliases WHERE shop_id=? AND enabled=0` , shop . ShopID ). Scan ( & aliases ); err != nil || aliases != 2 {
t . Fatalf ( "停用状态必须同步到兼容数据: count=%d err=%v" , aliases , err )
}
2026-08-13 11:15:54 +08:00
if count , err := CountEnabledSybAllowedShops ( db ); err != nil || count != 0 {
t . Fatalf ( "SYB 停用没有生效: %d %v" , count , err )
}
if err := EnsureEnabledSybAllowedShops ( db ); ! IsValidationError ( err ) {
t . Fatalf ( "没有启用 SYB 店铺应阻止同步: %v" , err )
}
if err := DeleteShop ( db , admin , shop . ShopID ); ! IsValidationError ( err ) {
t . Fatalf ( "有关联商品的店铺不能删除: %v" , err )
}
}
2026-08-13 11:47:56 +08:00
func TestShop_店铺名称不可重复且采购员不能管理 ( t * testing . T ) {
2026-08-13 11:15:54 +08:00
db := newTestDB ( t )
now := time . Now ()
admin := & model . User { UserID : "SHOP-ADMIN-2" , Username : "shop-admin-2" , PasswordHash : "x" , Role : model . RoleAdmin ,
Status : model . UserActive , PasswordChangedAt : model . NowISO (), CreatedAt : model . NowISO (), UpdatedAt : model . NowISO ()}
if err := repository . CreateUser ( db , * admin ); err != nil {
t . Fatal ( err )
}
2026-08-13 11:47:56 +08:00
if err := CreateShop ( db , admin , "店铺一" , now ); err != nil {
2026-08-13 11:15:54 +08:00
t . Fatal ( err )
}
2026-08-13 11:47:56 +08:00
if err := CreateShop ( db , admin , "店铺一" , now ); ! IsValidationError ( err ) {
t . Fatalf ( "重复店铺名称必须拒绝: %v" , err )
2026-08-13 11:15:54 +08:00
}
purchaser := & model . User { UserID : "BUYER" , Role : model . RolePurchaser , Status : model . UserActive }
2026-08-13 11:47:56 +08:00
if err := CreateShop ( nil , purchaser , "店铺" , now ); ! errors . Is ( err , ErrAdminRequired ) {
2026-08-13 11:15:54 +08:00
t . Fatalf ( "采购员新增应被拒绝: %v" , err )
}
if _ , err := ListShops ( nil , purchaser ); ! errors . Is ( err , ErrAdminRequired ) {
t . Fatalf ( "采购员读取管理页应被拒绝: %v" , err )
}
}