test(marketplace): add invoice generation unit tests
This commit is contained in:
parent
a40c27bcc9
commit
c22866fe8c
1 changed files with 113 additions and 0 deletions
113
veza-backend-api/internal/core/marketplace/invoice_test.go
Normal file
113
veza-backend-api/internal/core/marketplace/invoice_test.go
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
package marketplace
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"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/models"
|
||||
)
|
||||
|
||||
func setupInvoiceTestDB(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{},
|
||||
&Product{},
|
||||
&Order{},
|
||||
&OrderItem{},
|
||||
))
|
||||
return db
|
||||
}
|
||||
|
||||
func TestGenerateInvoice_Success(t *testing.T) {
|
||||
db := setupInvoiceTestDB(t)
|
||||
logger := zap.NewNop()
|
||||
svc := NewService(db, logger, nil)
|
||||
|
||||
buyerID := uuid.New()
|
||||
productID := uuid.New()
|
||||
orderID := uuid.New()
|
||||
|
||||
require.NoError(t, db.Create(&models.User{ID: buyerID, Username: "buyer1", Email: "b@test.com"}).Error)
|
||||
require.NoError(t, db.Create(&Product{ID: productID, SellerID: uuid.New(), Title: "Sample Track", Price: 9.99, ProductType: "track", Status: ProductStatusActive}).Error)
|
||||
require.NoError(t, db.Create(&Order{
|
||||
ID: orderID,
|
||||
BuyerID: buyerID,
|
||||
TotalAmount: 19.98,
|
||||
Currency: "EUR",
|
||||
Status: "completed",
|
||||
}).Error)
|
||||
require.NoError(t, db.Create(&OrderItem{ID: uuid.New(), OrderID: orderID, ProductID: productID, Price: 9.99}).Error)
|
||||
require.NoError(t, db.Create(&OrderItem{ID: uuid.New(), OrderID: orderID, ProductID: productID, Price: 9.99}).Error)
|
||||
|
||||
pdf, err := svc.GenerateInvoice(context.Background(), orderID, buyerID)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, pdf)
|
||||
assert.True(t, bytes.HasPrefix(pdf, []byte("%PDF")), "PDF should start with %PDF")
|
||||
}
|
||||
|
||||
func TestGenerateInvoice_WrongBuyer(t *testing.T) {
|
||||
db := setupInvoiceTestDB(t)
|
||||
logger := zap.NewNop()
|
||||
svc := NewService(db, logger, nil)
|
||||
|
||||
buyerID := uuid.New()
|
||||
otherBuyerID := uuid.New()
|
||||
orderID := uuid.New()
|
||||
productID := uuid.New()
|
||||
|
||||
require.NoError(t, db.Create(&models.User{ID: buyerID, Username: "buyer1", Email: "b@test.com"}).Error)
|
||||
require.NoError(t, db.Create(&models.User{ID: otherBuyerID, Username: "other", Email: "o@test.com"}).Error)
|
||||
require.NoError(t, db.Create(&Product{ID: productID, SellerID: uuid.New(), Title: "P", Price: 1, ProductType: "track", Status: ProductStatusActive}).Error)
|
||||
require.NoError(t, db.Create(&Order{ID: orderID, BuyerID: buyerID, TotalAmount: 1, Currency: "EUR", Status: "completed"}).Error)
|
||||
require.NoError(t, db.Create(&OrderItem{ID: uuid.New(), OrderID: orderID, ProductID: productID, Price: 1}).Error)
|
||||
|
||||
_, err := svc.GenerateInvoice(context.Background(), orderID, otherBuyerID)
|
||||
require.Error(t, err)
|
||||
assert.ErrorIs(t, err, ErrOrderNotFound)
|
||||
}
|
||||
|
||||
func TestGenerateInvoice_OrderNotFound(t *testing.T) {
|
||||
db := setupInvoiceTestDB(t)
|
||||
logger := zap.NewNop()
|
||||
svc := NewService(db, logger, nil)
|
||||
|
||||
_, err := svc.GenerateInvoice(context.Background(), uuid.New(), uuid.New())
|
||||
require.Error(t, err)
|
||||
assert.ErrorIs(t, err, ErrOrderNotFound)
|
||||
}
|
||||
|
||||
func TestGenerateInvoice_WithDiscount(t *testing.T) {
|
||||
db := setupInvoiceTestDB(t)
|
||||
logger := zap.NewNop()
|
||||
svc := NewService(db, logger, nil)
|
||||
|
||||
buyerID := uuid.New()
|
||||
productID := uuid.New()
|
||||
orderID := uuid.New()
|
||||
|
||||
require.NoError(t, db.Create(&models.User{ID: buyerID, Username: "buyer1", Email: "b@test.com"}).Error)
|
||||
require.NoError(t, db.Create(&Product{ID: productID, SellerID: uuid.New(), Title: "Discounted", Price: 10, ProductType: "track", Status: ProductStatusActive}).Error)
|
||||
require.NoError(t, db.Create(&Order{
|
||||
ID: orderID,
|
||||
BuyerID: buyerID,
|
||||
TotalAmount: 9.50,
|
||||
Currency: "EUR",
|
||||
Status: "completed",
|
||||
DiscountAmountCents: 500,
|
||||
}).Error)
|
||||
require.NoError(t, db.Create(&OrderItem{ID: uuid.New(), OrderID: orderID, ProductID: productID, Price: 10}).Error)
|
||||
|
||||
pdf, err := svc.GenerateInvoice(context.Background(), orderID, buyerID)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, pdf)
|
||||
assert.True(t, bytes.HasPrefix(pdf, []byte("%PDF")), "PDF should start with %PDF")
|
||||
}
|
||||
Loading…
Reference in a new issue