test(admin): add admin transfer handler tests
This commit is contained in:
parent
7d530f9612
commit
b3a74d6740
1 changed files with 233 additions and 0 deletions
|
|
@ -0,0 +1,233 @@
|
|||
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)
|
||||
}
|
||||
Loading…
Reference in a new issue