test(marketplace): add invoice generation unit tests

This commit is contained in:
senke 2026-02-24 00:19:10 +01:00
parent a40c27bcc9
commit c22866fe8c

View 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")
}