diff --git a/veza-backend-api/internal/core/marketplace/invoice_test.go b/veza-backend-api/internal/core/marketplace/invoice_test.go new file mode 100644 index 000000000..1ebba4af6 --- /dev/null +++ b/veza-backend-api/internal/core/marketplace/invoice_test.go @@ -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") +}