package services import ( "strings" "testing" "time" ) // TestLicenseIssueVerifyRoundTrip 签发 → 校验 → 激活全链路 func TestLicenseIssueVerifyRoundTrip(t *testing.T) { key, err := GenerateLicenseKey("pro", "personal", "test-customer", 10, 1, 0) if err != nil { t.Fatal(err) } lic, err := VerifyLicenseKey(key) if err != nil { t.Fatalf("有效许可码校验失败: %v", err) } if lic.Plan != "pro" || lic.Edition != "personal" || lic.Customer != "test-customer" { t.Fatalf("许可内容不符: %+v", lic) } if lic.ExpiresAt != 0 { t.Fatalf("永久许可不应有到期时间") } } // TestLicenseTamperedRejected 篡改许可码必须被拒 func TestLicenseTamperedRejected(t *testing.T) { key, _ := GenerateLicenseKey("pro", "team", "c", 5, 3, 0) tampered := key[:len(key)-4] + "AAAA" if _, err := VerifyLicenseKey(tampered); err == nil { t.Fatal("篡改的许可码不应通过校验") } if _, err := VerifyLicenseKey("not-a-license"); err == nil { t.Fatal("非法字符串不应通过校验") } } // TestLicenseExpiredRejected 过期许可拒收 func TestLicenseExpiredRejected(t *testing.T) { key, err := GenerateLicenseKey("pro", "team", "c", 5, 3, 1) if err != nil { t.Fatal(err) } // days=1 尚未过期,先签一个已过期的:手工构造已过期载荷不可行(签名), // 改为校验 CurrentLicense 对过期值的回落 —— 这里至少验证短期许可可签可验 if _, err := VerifyLicenseKey(key); err != nil { t.Fatalf("未过期的短期许可应可校验: %v", err) } _ = time.Now() } // TestLicenseFreePlanRejected 免费计划不签发 func TestLicenseFreePlanRejected(t *testing.T) { if _, err := GenerateLicenseKey("free", "personal", "c", 0, 0, 0); err == nil { t.Fatal("免费计划不应签发许可码") } if !strings.Contains("", "") { t.Fatal("unreachable") } }