chore: build

This commit is contained in:
Xor290
2026-09-10 18:53:29 +02:00
parent 624df79974
commit 181147e3bf
6 changed files with 370 additions and 0 deletions
@@ -224,6 +224,51 @@ func TestClaimMyReward_HTTPFlow_FailsAtomicallyWhenProductMissing(t *testing.T)
}
}
// Si les catégories configurées sur la récompense ne correspondent à aucune
// catégorie du pool réclamé (erreur de configuration admin : pool assigné à
// "test", récompense configurée sur "other"), la liste de produits éligibles
// est vide et la réclamation doit échouer avant de consommer un point —
// sinon points_redeemed serait incrémenté sans qu'aucun produit ne soit
// jamais ajouté au panier (régression couverte : la récompense était
// auparavant "consommée" silencieusement sans rien livrer).
func TestClaimMyReward_HTTPFlow_RejectsWhenNoEligibleItemsForPoolCategories(t *testing.T) {
cleanupStockTestData(t)
username := newTestClient(t, "reward_http_no_eligible")
newTestProduct(t, "RewardHTTPNoEligible", 5)
configureRewardSettings(t, &models.PointsReward{
Threshold: 20,
CategoryConfigs: []models.RewardCategoryConfig{
{Category: "other", Type: "free_product", AllProducts: true, Quantity: 1},
},
})
setClientPoolPoints(t, username, "pool_0", 25)
body, _ := json.Marshal(map[string]string{"pool_key": "pool_0"})
c, rec := claimRewardContext(username, body)
handlers.ClaimMyReward(c)
if rec.Code != http.StatusConflict {
t.Fatalf("status HTTP: got=%d want=%d body=%s", rec.Code, http.StatusConflict, rec.Body.String())
}
points, redeemed, err := testDB.GetClientPointsAndRewards(username)
if err != nil {
t.Fatalf("GetClientPointsAndRewards: %v", err)
}
if redeemed["pool_0"] != 0 {
t.Errorf("la récompense ne doit PAS être consommée si aucun produit n'est éligible: got redeemed=%d want=0", redeemed["pool_0"])
}
if points["pool_0"] != 25 {
t.Errorf("les points accumulés ne doivent pas être touchés: got=%d want=25", points["pool_0"])
}
rows := basketRewardItems(t, username)
if len(rows) != 0 {
t.Errorf("aucun produit récompense ne doit être ajouté au panier: %+v", rows)
}
}
// Une même catégorie peut avoir les deux types de récompense actifs en
// parallèle (un lot de produits offerts + un lot de produits à -50%), chacun
// avec sa propre sélection de produits et sa propre quantité. Un seul claim