feat: ground competitive insights in peer metrics

This commit is contained in:
2026-08-22 18:45:29 +08:00
parent 1a8a61cfe7
commit 4f91726edb
10 changed files with 497 additions and 86 deletions

View File

@@ -3,6 +3,8 @@ package insight
import (
"strings"
"testing"
"git.amiirkhl.ir/starcoach-hackathon/zarinpal-analytics-backend/internal/peercomparison"
)
func TestDeterministicTransactionCopyDistinguishesPaymentStatesWithoutCausalClaims(t *testing.T) {
@@ -27,6 +29,22 @@ func TestDeterministicTransactionCopyDistinguishesPaymentStatesWithoutCausalClai
}
}
func TestDeterministicPeerCopyNamesStrongestWeakestAndAction(t *testing.T) {
result := peercomparison.Result{State: peercomparison.StateReady, Metrics: []peercomparison.Metric{
{MetricID: "payment_success_rate", MerchantPerformancePercentile: "85.00"},
{MetricID: "verification_completion_rate", MerchantPerformancePercentile: "40.00"},
}}
copy := deterministicPeerCopy(&result, "مرداد ۱۴۰۵")
for _, expected := range []string{"مرداد ۱۴۰۵", "موفقیت پرداخت", "صدک 85.00", "تکمیل تأیید", "صدک 40.00"} {
if !strings.Contains(copy.LatestObserved.Body, expected) {
t.Fatalf("peer summary missing %q: %s", expected, copy.LatestObserved.Body)
}
}
if !strings.Contains(copy.Options[0].Description, "تکمیل تأیید") {
t.Fatalf("peer action did not target weakest category: %+v", copy.Options)
}
}
func TestDeterministicTransactionCopyHandlesEmptyPeriod(t *testing.T) {
copy := deterministicTransactionCopy(
PeriodScope{JalaliLabelFA: "امروز"},