veza/veza-backend-api/internal/handlers/admin_transfer_handler_test.go

233 lines
6.6 KiB
Go

package handlers
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"veza-backend-api/internal/core/marketplace"
"veza-backend-api/internal/models"
)
func setupAdminTransferTestDB(t *testing.T) *gorm.DB {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
require.NoError(t, err)
require.NoError(t, db.AutoMigrate(
&models.User{},
&marketplace.SellerTransfer{},
))
return db
}
type mockTransferServiceAdmin struct {
err error
}
func (m *mockTransferServiceAdmin) CreateTransfer(_ context.Context, _ uuid.UUID, _ int64, _, _ string) error {
return m.err
}
func TestGetTransfers_ReturnsAll(t *testing.T) {
db := setupAdminTransferTestDB(t)
logger := zap.NewNop()
handler := NewAdminTransferHandler(db, nil, 0.10, logger)
sellerID := uuid.New()
orderID := uuid.New()
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: uuid.New(),
SellerID: sellerID,
OrderID: orderID,
AmountCents: 1000,
PlatformFeeCents: 100,
Currency: "EUR",
Status: "completed",
}).Error)
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest(http.MethodGet, "/admin/transfers", nil)
handler.GetTransfers(c)
assert.Equal(t, http.StatusOK, w.Code)
var body map[string]interface{}
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &body))
assert.True(t, body["success"].(bool))
data := body["data"].(map[string]interface{})
transfers := data["transfers"].([]interface{})
assert.Len(t, transfers, 1)
assert.Equal(t, float64(1), float64(data["total"].(float64)))
}
func TestGetTransfers_FilterByStatus(t *testing.T) {
db := setupAdminTransferTestDB(t)
logger := zap.NewNop()
handler := NewAdminTransferHandler(db, nil, 0.10, logger)
sellerID := uuid.New()
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: uuid.New(),
SellerID: sellerID,
OrderID: uuid.New(),
AmountCents: 1000,
PlatformFeeCents: 100,
Currency: "EUR",
Status: "completed",
}).Error)
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: uuid.New(),
SellerID: sellerID,
OrderID: uuid.New(),
AmountCents: 500,
PlatformFeeCents: 50,
Currency: "EUR",
Status: "failed",
}).Error)
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest(http.MethodGet, "/admin/transfers?status=failed", nil)
handler.GetTransfers(c)
assert.Equal(t, http.StatusOK, w.Code)
var body map[string]interface{}
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &body))
data := body["data"].(map[string]interface{})
transfers := data["transfers"].([]interface{})
assert.Len(t, transfers, 1)
assert.Equal(t, float64(1), float64(data["total"].(float64)))
}
func TestGetTransfers_FilterBySeller(t *testing.T) {
db := setupAdminTransferTestDB(t)
logger := zap.NewNop()
handler := NewAdminTransferHandler(db, nil, 0.10, logger)
seller1 := uuid.New()
seller2 := uuid.New()
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: uuid.New(),
SellerID: seller1,
OrderID: uuid.New(),
AmountCents: 1000,
PlatformFeeCents: 100,
Currency: "EUR",
Status: "completed",
}).Error)
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: uuid.New(),
SellerID: seller2,
OrderID: uuid.New(),
AmountCents: 500,
PlatformFeeCents: 50,
Currency: "EUR",
Status: "completed",
}).Error)
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest(http.MethodGet, "/admin/transfers?seller_id="+seller1.String(), nil)
handler.GetTransfers(c)
assert.Equal(t, http.StatusOK, w.Code)
var body map[string]interface{}
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &body))
data := body["data"].(map[string]interface{})
transfers := data["transfers"].([]interface{})
assert.Len(t, transfers, 1)
}
func TestRetryTransfer_Success(t *testing.T) {
db := setupAdminTransferTestDB(t)
logger := zap.NewNop()
mock := &mockTransferServiceAdmin{}
handler := NewAdminTransferHandler(db, mock, 0.10, logger)
transferID := uuid.New()
sellerID := uuid.New()
orderID := uuid.New()
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: transferID,
SellerID: sellerID,
OrderID: orderID,
AmountCents: 900,
PlatformFeeCents: 100,
Currency: "EUR",
Status: "failed",
}).Error)
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest(http.MethodPost, "/admin/transfers/"+transferID.String()+"/retry", nil)
c.Params = gin.Params{{Key: "id", Value: transferID.String()}}
handler.RetryTransfer(c)
assert.Equal(t, http.StatusOK, w.Code)
var updated marketplace.SellerTransfer
require.NoError(t, db.First(&updated, transferID).Error)
assert.Equal(t, "completed", updated.Status)
}
func TestRetryTransfer_NotFailed(t *testing.T) {
db := setupAdminTransferTestDB(t)
logger := zap.NewNop()
mock := &mockTransferServiceAdmin{}
handler := NewAdminTransferHandler(db, mock, 0.10, logger)
transferID := uuid.New()
require.NoError(t, db.Create(&marketplace.SellerTransfer{
ID: transferID,
SellerID: uuid.New(),
OrderID: uuid.New(),
AmountCents: 900,
PlatformFeeCents: 100,
Currency: "EUR",
Status: "completed",
}).Error)
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest(http.MethodPost, "/admin/transfers/"+transferID.String()+"/retry", nil)
c.Params = gin.Params{{Key: "id", Value: transferID.String()}}
handler.RetryTransfer(c)
assert.Equal(t, http.StatusBadRequest, w.Code)
}
func TestRetryTransfer_NotFound(t *testing.T) {
db := setupAdminTransferTestDB(t)
logger := zap.NewNop()
mock := &mockTransferServiceAdmin{}
handler := NewAdminTransferHandler(db, mock, 0.10, logger)
nonexistentID := uuid.New()
gin.SetMode(gin.TestMode)
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Request = httptest.NewRequest(http.MethodPost, "/admin/transfers/"+nonexistentID.String()+"/retry", nil)
c.Params = gin.Params{{Key: "id", Value: nonexistentID.String()}}
handler.RetryTransfer(c)
assert.Equal(t, http.StatusNotFound, w.Code)
}