347 lines
8.5 KiB
Go
347 lines
8.5 KiB
Go
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,
|
||
},
|
||
},
|
||
},
|
||
))
|
||
})
|
||
}
|