Files
back-hokm/internal/economy/verify_test.go
T
2026-07-04 21:21:13 +03:30

76 lines
2.2 KiB
Go

package economy
import (
"context"
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/base64"
"testing"
)
// TestBazaarRSAVerify امضای معتبر را می‌پذیرد و امضای/دیتای دستکاری‌شده را رد می‌کند.
func TestBazaarRSAVerify(t *testing.T) {
key, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
t.Fatal(err)
}
der, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
if err != nil {
t.Fatal(err)
}
pubB64 := base64.StdEncoding.EncodeToString(der) // مثلِ خروجیِ کنسولِ کافه‌بازار
v, err := NewBazaarRSAVerifier(pubB64)
if err != nil {
t.Fatalf("new verifier: %v", err)
}
data := `{"orderId":"1","productId":"coin_small","purchaseToken":"tok123","purchaseState":0}`
h := sha1.Sum([]byte(data))
sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA1, h[:])
if err != nil {
t.Fatal(err)
}
sigB64 := base64.StdEncoding.EncodeToString(sig)
ctx := context.Background()
ok, err := v.Verify(ctx, IAPProof{PurchaseData: data, Signature: sigB64})
if err != nil || !ok {
t.Fatalf("valid signature rejected: ok=%v err=%v", ok, err)
}
// دیتای دستکاری‌شده ⇒ رد
ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data + " ", Signature: sigB64})
if ok {
t.Fatal("tampered data accepted")
}
// امضای دستکاری‌شده ⇒ رد
bad := base64.StdEncoding.EncodeToString([]byte("not-a-real-signature"))
ok, _ = v.Verify(ctx, IAPProof{PurchaseData: data, Signature: bad})
if ok {
t.Fatal("bad signature accepted")
}
}
// TestStoreRouter مسیر‌دهی بر اساس store و fallback را بررسی می‌کند.
func TestStoreRouter(t *testing.T) {
ctx := context.Background()
// بدونِ پیکربندی و بدونِ fallback ⇒ خطا.
r := StoreRouter{}
if ok, err := r.Verify(ctx, IAPProof{Store: "myket", Token: "x"}); ok || err == nil {
t.Fatal("unconfigured store should error")
}
// با devFallback ⇒ توکنِ غیرخالی معتبر است.
r = StoreRouter{DevFallback: true}
if ok, err := r.Verify(ctx, IAPProof{Store: "bazaar", Token: "x"}); err != nil || !ok {
t.Fatalf("dev fallback failed: ok=%v err=%v", ok, err)
}
}