Files
aura-crm/production/backend/internal/analytics/summary_test.go
T

80 lines
2.5 KiB
Go

package analytics
import (
"strings"
"testing"
)
func TestParseAmount(t *testing.T) {
tests := []struct {
name string
in string
want float64
}{
{"valid decimal", "1234.56", 1234.56},
{"zero", "0", 0},
{"empty falls back to zero", "", 0},
{"garbage falls back to zero", "not-a-number", 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := parseAmount(tt.in); got != tt.want {
t.Errorf("parseAmount(%q) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestBuildDigestSumsRevenueAcrossBuckets(t *testing.T) {
revenue := []revenueBucket{
{Bucket: "2026-08-01", Income: "1000.00", Expense: "200.00", Payroll: "0"},
{Bucket: "2026-08-02", Income: "500.00", Expense: "0", Payroll: "300.00"},
}
digest := buildDigest(revenue, nil, nil, nil, nil, nil)
if !strings.Contains(digest, "1500.00") {
t.Errorf("expected summed income 1500.00 in digest, got: %s", digest)
}
if !strings.Contains(digest, "200.00") {
t.Errorf("expected summed expense 200.00 in digest, got: %s", digest)
}
if !strings.Contains(digest, "300.00") {
t.Errorf("expected summed payroll 300.00 in digest, got: %s", digest)
}
}
func TestBuildDigestReportsNoCompletedOrdersWhenAvgHoursNil(t *testing.T) {
digest := buildDigest(nil, nil, nil, nil, nil, nil)
if !strings.Contains(digest, "нет завершённых заявок") {
t.Errorf("expected a nil-avg-hours message, got: %s", digest)
}
}
func TestBuildDigestReportsNoLowStockWhenEmpty(t *testing.T) {
digest := buildDigest(nil, nil, nil, nil, nil, []lowStockPart{})
if !strings.Contains(digest, "нет таких позиций") {
t.Errorf("expected a no-low-stock message, got: %s", digest)
}
}
func TestBuildDigestListsLowStockParts(t *testing.T) {
lowStock := []lowStockPart{{Name: "Экран iPhone 12", CurrentStock: 1, MinStock: 5}}
digest := buildDigest(nil, nil, nil, nil, nil, lowStock)
if !strings.Contains(digest, "Экран iPhone 12 (1/5)") {
t.Errorf("expected low stock part listed, got: %s", digest)
}
}
func TestSummaryPromptFencesDigestBetweenMarkers(t *testing.T) {
prompt := summaryPrompt("тестовые данные")
if !strings.Contains(prompt, "тестовые данные") {
t.Error("prompt does not contain the digest")
}
if !strings.Contains(prompt, "ДАННЫЕ") || !strings.Contains(prompt, "КОНЕЦ ДАННЫХ") {
t.Error("prompt is missing the delimiter markers")
}
if !strings.Contains(prompt, "Никогда не выдумывай") {
t.Error("prompt is missing the anti-hallucination instruction")
}
}