feat(barcode): 多条码管理(后端+迁移+GTIN校验)WIP
- 迁移 0007: 新增 product_barcode 表(一品多码),回填旧 product.gtin 为主码, 全局唯一索引保证「一码一品」,每品至多一个主码 - internal/gtin: GS1 GTIN-8/12/13/14 校验(校验位 + 拒收店内码/变量重量码/优惠券码) - 公开只读 API: 任一条码命中商品、详情返回 barcodes、搜索匹配条码 - adminstore: 商品详情含 barcodes;新增 AddBarcode/DeleteBarcode/SetPrimaryBarcode, 一码命中其他商品返回 ConflictError 供后台去重 待办(按用户要求暂停): 后台 handler 路由、投稿/审核多条码、前后端 UI Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
package gtin
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestNormalizeValid(t *testing.T) {
|
||||
cases := []struct{ in, want, typ string }{
|
||||
{" 5449000000996 ", "5449000000996", "EAN13"}, // Coca-Cola EAN-13
|
||||
{"3017624010701", "3017624010701", "EAN13"}, // Nutella EAN-13
|
||||
{"036000291452", "036000291452", "UPC"}, // UPC-A
|
||||
{"96385074", "96385074", "EAN8"}, // EAN-8
|
||||
{"00012345600012", "00012345600012", "GTIN14"},
|
||||
{"6901234567892", "6901234567892", "EAN13"}, // China 690 prefix
|
||||
}
|
||||
for _, c := range cases {
|
||||
got, err := Normalize(c.in)
|
||||
if err != nil {
|
||||
t.Errorf("Normalize(%q) unexpected error: %v", c.in, err)
|
||||
continue
|
||||
}
|
||||
if got != c.want {
|
||||
t.Errorf("Normalize(%q) = %q, want %q", c.in, got, c.want)
|
||||
}
|
||||
if InferType(got) != c.typ {
|
||||
t.Errorf("InferType(%q) = %q, want %q", got, InferType(got), c.typ)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeRejects(t *testing.T) {
|
||||
cases := []struct {
|
||||
in string
|
||||
want error
|
||||
}{
|
||||
{"", ErrEmpty},
|
||||
{"12ab5678", ErrFormat},
|
||||
{"12345", ErrFormat},
|
||||
{"5449000000997", ErrCheck}, // bad check digit
|
||||
{"2012345678903", ErrRestricted}, // 20-29 in-store EAN-13
|
||||
{"0212345678909", ErrRestricted}, // 02x variable measure
|
||||
{"212345678909", ErrRestricted}, // UPC number system 2
|
||||
{"02345673", ErrRestricted}, // EAN-8 in-store
|
||||
}
|
||||
for _, c := range cases {
|
||||
_, err := Normalize(c.in)
|
||||
if err != c.want {
|
||||
t.Errorf("Normalize(%q) error = %v, want %v", c.in, err, c.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user