Files
jiu/backend/internal/util/license_key_test.go
T
wangjia 13fc9b7aaf test(backend): 授权系统端到端验证测试 (21H)
util/license_key_test.go:
- TestLicenseKeyRoundTrip: 签发→验签完整流程
- TestVerifyLicenseToken_TamperedPayload: 签名被篡改后被拒绝
- TestVerifyLicenseToken_WrongKey: 用错误公钥验签失败
- TestVerifyLicenseToken_InvalidFormat: 格式非法被拒绝

middleware/license_guard_test.go:
- TestCalcLicensePhase: 覆盖全部 phase 边界
  (perpetual→normal / future→normal / <7d→grace /
   7-15d→readonly / >15d→locked)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 07:10:15 +08:00

76 lines
2.1 KiB
Go

package util
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestLicenseKeyRoundTrip(t *testing.T) {
priv, pub, err := GenerateEd25519KeyPair()
require.NoError(t, err)
exp := time.Now().Add(30 * 24 * time.Hour).Unix()
payload := LicensePayload{
ShopID: 42,
LicenseID: 7,
Type: "annual",
IssuedAt: time.Now().Unix(),
ExpiresAt: &exp,
MaxDevices: 3,
}
token, err := IssueLicenseToken(payload, priv)
require.NoError(t, err)
assert.NotEmpty(t, token)
got, err := VerifyLicenseToken(token, pub)
require.NoError(t, err)
assert.Equal(t, payload.ShopID, got.ShopID)
assert.Equal(t, payload.Type, got.Type)
assert.Equal(t, payload.MaxDevices, got.MaxDevices)
assert.Equal(t, *payload.ExpiresAt, *got.ExpiresAt)
}
func TestVerifyLicenseToken_TamperedPayload(t *testing.T) {
priv, pub, err := GenerateEd25519KeyPair()
require.NoError(t, err)
exp := time.Now().Add(30 * 24 * time.Hour).Unix()
token, err := IssueLicenseToken(LicensePayload{
ShopID: 1, Type: "trial", IssuedAt: time.Now().Unix(), ExpiresAt: &exp, MaxDevices: 1,
}, priv)
require.NoError(t, err)
// Flip the last byte of the signature to simulate tampering
tampered := token[:len(token)-2] + "XX"
_, err = VerifyLicenseToken(tampered, pub)
assert.Error(t, err, "tampered token must be rejected")
}
func TestVerifyLicenseToken_WrongKey(t *testing.T) {
priv, _, err := GenerateEd25519KeyPair()
require.NoError(t, err)
_, otherPub, err := GenerateEd25519KeyPair()
require.NoError(t, err)
exp := time.Now().Add(30 * 24 * time.Hour).Unix()
token, err := IssueLicenseToken(LicensePayload{
ShopID: 1, Type: "trial", IssuedAt: time.Now().Unix(), ExpiresAt: &exp, MaxDevices: 1,
}, priv)
require.NoError(t, err)
_, err = VerifyLicenseToken(token, otherPub)
assert.ErrorIs(t, err, ErrInvalidLicenseSignature)
}
func TestVerifyLicenseToken_InvalidFormat(t *testing.T) {
_, pub, err := GenerateEd25519KeyPair()
require.NoError(t, err)
_, err = VerifyLicenseToken("not-a-valid-token", pub)
assert.ErrorIs(t, err, ErrInvalidLicenseToken)
}