This commit is contained in:
zhx 2026-05-26 08:22:42 +08:00
parent 4398a442b4
commit 5b980e8ed1

View File

@ -3588,6 +3588,82 @@ func TestListResourceShopItemsReturnsActiveSaleItems(t *testing.T) {
} }
} }
func TestPurchaseResourceShopItemUsesAuthenticatedUserAndCommandID(t *testing.T) {
walletClient := &fakeWalletClient{
purchaseShopResp: &walletv1.PurchaseResourceShopItemResponse{
OrderId: "rshop_order_1",
TransactionId: "wtx_shop_1",
ResourceGrantId: "rgr_shop_1",
CoinSpent: 300,
Balance: &walletv1.AssetBalance{
AssetType: "COIN",
AvailableAmount: 700,
Version: 2,
},
ShopItem: &walletv1.ResourceShopItem{
ShopItemId: 9001,
ResourceId: 7001,
DurationDays: 3,
PriceType: "coin",
CoinPrice: 300,
Resource: &walletv1.Resource{
ResourceId: 7001,
ResourceCode: "avatar_frame_gold",
ResourceType: "avatar_frame",
Name: "Gold Frame",
},
},
Resource: &walletv1.UserResourceEntitlement{
EntitlementId: "ent_shop_1",
UserId: 42,
ResourceId: 7001,
Status: "active",
Quantity: 1,
Resource: &walletv1.Resource{
ResourceId: 7001,
ResourceCode: "avatar_frame_gold",
ResourceType: "avatar_frame",
},
},
},
}
handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, &fakeUserProfileClient{})
handler.SetWalletClient(walletClient)
router := handler.Routes(auth.NewVerifier("secret"))
request := httptest.NewRequest(http.MethodPost, "/api/v1/resource-shop/items/9001/purchase", bytes.NewReader([]byte(`{"command_id":"cmd-shop-1"}`)))
request.Header.Set("Authorization", "Bearer "+signGatewayToken(t, "secret", 42))
recorder := httptest.NewRecorder()
router.ServeHTTP(recorder, request)
if recorder.Code != http.StatusOK {
t.Fatalf("purchase shop status mismatch: got %d body=%s", recorder.Code, recorder.Body.String())
}
if walletClient.lastPurchaseShop == nil || walletClient.lastPurchaseShop.GetCommandId() != "cmd-shop-1" || walletClient.lastPurchaseShop.GetUserId() != 42 || walletClient.lastPurchaseShop.GetShopItemId() != 9001 {
t.Fatalf("purchase shop request mismatch: %+v", walletClient.lastPurchaseShop)
}
var envelope struct {
Code string `json:"code"`
Data struct {
OrderID string `json:"order_id"`
TransactionID string `json:"transaction_id"`
CoinSpent int64 `json:"coin_spent"`
Balance struct {
AvailableAmount int64 `json:"available_amount"`
} `json:"balance"`
Resource struct {
EntitlementID string `json:"entitlement_id"`
ResourceID int64 `json:"resource_id"`
} `json:"resource"`
} `json:"data"`
}
if err := json.NewDecoder(recorder.Body).Decode(&envelope); err != nil {
t.Fatalf("decode purchase shop failed: %v", err)
}
if envelope.Code != httpkit.CodeOK || envelope.Data.OrderID != "rshop_order_1" || envelope.Data.CoinSpent != 300 || envelope.Data.Balance.AvailableAmount != 700 || envelope.Data.Resource.EntitlementID != "ent_shop_1" {
t.Fatalf("purchase shop envelope mismatch: %+v", envelope)
}
}
func TestListGiftTabsReturnsActiveTypeConfigs(t *testing.T) { func TestListGiftTabsReturnsActiveTypeConfigs(t *testing.T) {
walletClient := &fakeWalletClient{ walletClient := &fakeWalletClient{
listGiftConfigsResp: &walletv1.ListGiftConfigsResponse{ listGiftConfigsResp: &walletv1.ListGiftConfigsResponse{