121 lines
5.4 KiB
Go
121 lines
5.4 KiB
Go
package financewithdrawal
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"hyapp-admin-server/internal/integration/walletclient"
|
|
"hyapp-admin-server/internal/model"
|
|
"hyapp-admin-server/internal/modules/shared"
|
|
walletv1 "hyapp.local/api/proto/wallet/v1"
|
|
)
|
|
|
|
func TestApplyWalletDecisionRoutesPointApprovalToPointSettlement(t *testing.T) {
|
|
wallet := &fakeAuditWalletClient{}
|
|
svc := &Service{wallet: wallet}
|
|
|
|
transactionID, err := svc.applyWalletDecision(context.Background(), model.WithdrawalApplicationStatusApproved, "audit:77:approved", "huwaa", 42001, "POINT", 1_000_000, shared.Actor{UserID: 90001}, "paid", 77)
|
|
if err != nil {
|
|
t.Fatalf("apply point approval failed: %v", err)
|
|
}
|
|
if transactionID != "point-settle-tx" {
|
|
t.Fatalf("point approval transaction id mismatch: %s", transactionID)
|
|
}
|
|
if wallet.settlePoint == nil ||
|
|
wallet.settlePoint.GetCommandId() != "audit:77:approved" ||
|
|
wallet.settlePoint.GetAppCode() != "huwaa" ||
|
|
wallet.settlePoint.GetUserId() != 42001 ||
|
|
wallet.settlePoint.GetAssetType() != "POINT" ||
|
|
wallet.settlePoint.GetGrossPointAmount() != 1_000_000 ||
|
|
wallet.settlePoint.GetFeePointAmount() != 50_000 ||
|
|
wallet.settlePoint.GetNetPointAmount() != 950_000 ||
|
|
wallet.settlePoint.GetOperatorUserId() != 90001 ||
|
|
wallet.settlePoint.GetWithdrawalApplicationId() != "77" {
|
|
t.Fatalf("SettlePointWithdrawal payload mismatch: %+v", wallet.settlePoint)
|
|
}
|
|
if wallet.settleSalary != nil || wallet.releasePoint != nil || wallet.releaseSalary != nil {
|
|
t.Fatalf("point approval must not call legacy salary or release RPCs: wallet=%+v", wallet)
|
|
}
|
|
}
|
|
|
|
func TestApplyWalletDecisionRoutesPointRejectionToPointRelease(t *testing.T) {
|
|
wallet := &fakeAuditWalletClient{}
|
|
svc := &Service{wallet: wallet}
|
|
|
|
transactionID, err := svc.applyWalletDecision(context.Background(), model.WithdrawalApplicationStatusRejected, "audit:78:rejected", "huwaa", 42002, "COIN_SELLER_POINT", 2_000_000, shared.Actor{UserID: 90002}, "bad address", 78)
|
|
if err != nil {
|
|
t.Fatalf("apply point rejection failed: %v", err)
|
|
}
|
|
if transactionID != "point-release-tx" {
|
|
t.Fatalf("point rejection transaction id mismatch: %s", transactionID)
|
|
}
|
|
if wallet.releasePoint == nil ||
|
|
wallet.releasePoint.GetCommandId() != "audit:78:rejected" ||
|
|
wallet.releasePoint.GetAppCode() != "huwaa" ||
|
|
wallet.releasePoint.GetUserId() != 42002 ||
|
|
wallet.releasePoint.GetAssetType() != "COIN_SELLER_POINT" ||
|
|
wallet.releasePoint.GetGrossPointAmount() != 2_000_000 ||
|
|
wallet.releasePoint.GetFeePointAmount() != 100_000 ||
|
|
wallet.releasePoint.GetNetPointAmount() != 1_900_000 ||
|
|
wallet.releasePoint.GetOperatorUserId() != 90002 ||
|
|
wallet.releasePoint.GetReason() != "bad address" ||
|
|
wallet.releasePoint.GetWithdrawalApplicationId() != "78" {
|
|
t.Fatalf("ReleasePointWithdrawal payload mismatch: %+v", wallet.releasePoint)
|
|
}
|
|
if wallet.settlePoint != nil || wallet.settleSalary != nil || wallet.releaseSalary != nil {
|
|
t.Fatalf("point rejection must not call legacy salary or settle RPCs: wallet=%+v", wallet)
|
|
}
|
|
}
|
|
|
|
func TestApplyWalletDecisionKeepsLegacySalaryAssetsOnSalaryRPC(t *testing.T) {
|
|
wallet := &fakeAuditWalletClient{}
|
|
svc := &Service{wallet: wallet}
|
|
|
|
transactionID, err := svc.applyWalletDecision(context.Background(), model.WithdrawalApplicationStatusApproved, "audit:79:approved", "lalu", 42003, "HOST_SALARY_USD", 12_345, shared.Actor{UserID: 90003}, "", 79)
|
|
if err != nil {
|
|
t.Fatalf("apply salary approval failed: %v", err)
|
|
}
|
|
if transactionID != "salary-settle-tx" {
|
|
t.Fatalf("salary approval transaction id mismatch: %s", transactionID)
|
|
}
|
|
if wallet.settleSalary == nil ||
|
|
wallet.settleSalary.GetAppCode() != "lalu" ||
|
|
wallet.settleSalary.GetUserId() != 42003 ||
|
|
wallet.settleSalary.GetSalaryAssetType() != "HOST_SALARY_USD" ||
|
|
wallet.settleSalary.GetSalaryUsdMinor() != 12_345 ||
|
|
wallet.settleSalary.GetWithdrawalApplicationId() != "79" {
|
|
t.Fatalf("SettleSalaryWithdrawal payload mismatch: %+v", wallet.settleSalary)
|
|
}
|
|
if wallet.settlePoint != nil || wallet.releasePoint != nil {
|
|
t.Fatalf("legacy salary asset must not call point RPCs: wallet=%+v", wallet)
|
|
}
|
|
}
|
|
|
|
type fakeAuditWalletClient struct {
|
|
walletclient.Client
|
|
settlePoint *walletv1.SettlePointWithdrawalRequest
|
|
releasePoint *walletv1.ReleasePointWithdrawalRequest
|
|
settleSalary *walletv1.SettleSalaryWithdrawalRequest
|
|
releaseSalary *walletv1.ReleaseSalaryWithdrawalRequest
|
|
}
|
|
|
|
func (f *fakeAuditWalletClient) SettlePointWithdrawal(_ context.Context, req *walletv1.SettlePointWithdrawalRequest) (*walletv1.SettlePointWithdrawalResponse, error) {
|
|
f.settlePoint = req
|
|
return &walletv1.SettlePointWithdrawalResponse{TransactionId: "point-settle-tx"}, nil
|
|
}
|
|
|
|
func (f *fakeAuditWalletClient) ReleasePointWithdrawal(_ context.Context, req *walletv1.ReleasePointWithdrawalRequest) (*walletv1.ReleasePointWithdrawalResponse, error) {
|
|
f.releasePoint = req
|
|
return &walletv1.ReleasePointWithdrawalResponse{TransactionId: "point-release-tx"}, nil
|
|
}
|
|
|
|
func (f *fakeAuditWalletClient) SettleSalaryWithdrawal(_ context.Context, req *walletv1.SettleSalaryWithdrawalRequest) (*walletv1.SettleSalaryWithdrawalResponse, error) {
|
|
f.settleSalary = req
|
|
return &walletv1.SettleSalaryWithdrawalResponse{TransactionId: "salary-settle-tx"}, nil
|
|
}
|
|
|
|
func (f *fakeAuditWalletClient) ReleaseSalaryWithdrawal(_ context.Context, req *walletv1.ReleaseSalaryWithdrawalRequest) (*walletv1.ReleaseSalaryWithdrawalResponse, error) {
|
|
f.releaseSalary = req
|
|
return &walletv1.ReleaseSalaryWithdrawalResponse{TransactionId: "salary-release-tx"}, nil
|
|
}
|