discount/internal/utils/discount/calculate_test.go
2024-12-11 15:14:39 +03:00

347 lines
8.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package discount_test
import (
"testing"
"github.com/stretchr/testify/assert"
"gitea.pena/PenaSide/discount/internal/core"
"gitea.pena/PenaSide/discount/internal/models"
"gitea.pena/PenaSide/discount/internal/utils/discount"
)
func TestCalculate(t *testing.T) {
t.Run("Покупка продуктов в количестве не больше 1 при отсутствии скидок", func(t *testing.T) {
assert.Equal(t, uint64(3), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 1},
{ID: "p2", Price: 2},
},
[]models.Discount{},
))
})
t.Run("Сумма корзины достигла 5к", func(t *testing.T) {
assert.Equal(t, uint64(4925), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 2000},
{ID: "p2", Price: 3000},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.985,
},
},
},
))
assert.Equal(t, uint64(4925), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 2000},
{ID: "p2", Price: 3000},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Factor: 0.985,
},
},
},
))
})
t.Run("Наложение несколько скидок разного формата", func(t *testing.T) {
assert.Equal(t, uint64(5025), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 2000},
{ID: "p2", Price: 3000},
{ID: "p3", Price: 105},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{{ID: "p3", Factor: 0.97}},
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.985,
},
},
},
))
})
t.Run("Наложение несколько скидок разного формата с несколькими таргетами", func(t *testing.T) {
assert.Equal(t, uint64(5223), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 2000},
{ID: "p2", Price: 3000},
{ID: "p3", Price: 105},
{ID: "p4", Price: 210},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p3", Factor: 0.97},
{ID: "p4", Factor: 0.96},
},
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.985,
},
},
},
))
})
t.Run("Наложение несколько скидок с наличием скидки на лояльность", func(t *testing.T) {
assert.Equal(t, uint64(5171), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 2000},
{ID: "p2", Price: 3000},
{ID: "p3", Price: 105},
{ID: "p4", Price: 210},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p3", Factor: 0.97},
{ID: "p4", Factor: 0.96},
},
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.985,
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.99,
},
},
},
), 0.001)
})
t.Run("Наложение несколько скидок на привелегии", func(t *testing.T) {
assert.Equal(t, uint64(422), discount.Calculate(
[]core.Product{
{ID: "p5", Price: 30},
{ID: "p6", Price: 70},
{ID: "p7", Price: 400},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p5", Factor: 0.97},
{ID: "p6", Factor: 0.935},
},
},
},
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p7", Factor: 0.83},
},
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.99,
},
},
},
))
})
t.Run("Наложение несколько скидок на привелегии без лояльности", func(t *testing.T) {
assert.Equal(t, uint64(426), discount.Calculate(
[]core.Product{
{ID: "p5", Price: 30},
{ID: "p6", Price: 70},
{ID: "p7", Price: 400},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p5", Factor: 0.97},
{ID: "p6", Factor: 0.935},
{ID: "p7", Factor: 0.83},
},
},
},
},
))
})
t.Run("Вычисление скидки за привелегии и сервис", func(t *testing.T) {
assert.Equal(t, uint64(743), discount.Calculate(
[]core.Product{
{ID: "p5", Price: 30, Group: "dwarfener"},
{ID: "p6", Price: 70, Group: "dwarfener"},
{ID: "p7", Price: 800, Group: "dwarfener"},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p5", Factor: 0.97},
{ID: "p6", Factor: 0.935},
{ID: "p7", Factor: 0.83},
},
},
},
{
Target: models.DiscountCalculationTarget{
Factor: 0.99,
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetGroup,
TargetGroup: "dwarfener",
Factor: 0.99,
},
},
},
))
})
t.Run("Наложение скидок на несколько сервисов", func(t *testing.T) {
assert.Equal(t, uint64(2398), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 1500, Group: "templategen"},
{ID: "p2", Price: 300, Group: "templategen"},
{ID: "p5", Price: 30, Group: "dwarfener"},
{ID: "p6", Price: 70, Group: "dwarfener"},
{ID: "p7", Price: 800, Group: "dwarfener"},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p1", Factor: 0.93},
{ID: "p2", Factor: 0.945},
{ID: "p5", Factor: 0.97},
{ID: "p6", Factor: 0.935},
{ID: "p7", Factor: 0.83},
},
},
},
{
Target: models.DiscountCalculationTarget{
Factor: 0.99,
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetGroup,
TargetGroup: "templategen",
Factor: 0.996,
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetGroup,
TargetGroup: "dwarfener",
Factor: 0.99,
},
},
},
))
})
t.Run("Наложение скидок с промокодом", func(t *testing.T) {
assert.Equal(t, uint64(2368), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 1500, Group: "templategen"},
{ID: "p2", Price: 300, Group: "templategen"},
{ID: "p5", Price: 30, Group: "dwarfener"},
{ID: "p6", Price: 70, Group: "dwarfener"},
{ID: "p7", Price: 800, Group: "dwarfener"},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p1", Factor: 0.93},
{ID: "p2", Factor: 0.945},
{ID: "p5", Factor: 0.97},
{ID: "p6", Factor: 0.97},
{ID: "p7", Factor: 0.83},
},
},
},
{
Layer: 2,
Target: models.DiscountCalculationTarget{
Products: []models.ProductTarget{
{ID: "p6", Factor: 0.5, Overhelm: true},
},
},
},
{
Target: models.DiscountCalculationTarget{
Factor: 0.94,
},
},
{
ID: "2",
Layer: 2,
Target: models.DiscountCalculationTarget{
Factor: 0.99,
Overhelm: true,
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetGroup,
TargetGroup: "templategen",
Factor: 0.996,
},
},
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetGroup,
TargetGroup: "dwarfener",
Factor: 0.99,
},
},
},
))
})
t.Run("Наложение скидок по типу пользователя", func(t *testing.T) {
assert.Equal(t, uint64(540), discount.Calculate(
[]core.Product{
{ID: "p1", Price: 1500, Group: "templategen"},
{ID: "p2", Price: 300, Group: "templategen"},
{ID: "p5", Price: 30, Group: "dwarfener"},
{ID: "p6", Price: 70, Group: "dwarfener"},
{ID: "p7", Price: 800, Group: "dwarfener"},
},
[]models.Discount{
{
Target: models.DiscountCalculationTarget{
TargetScope: models.TargetSum,
Factor: 0.2,
},
},
},
))
})
}