80 lines
2.5 KiB
Go
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")
|
|
}
|
|
}
|