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) } }