/
codespawn
/
tgstream
Обзор
Документация
Войти
/
codespawn
/
tgstream
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
16
CI/CD
Аналитика
Безопасность
master
internal/dsl/parse_test.go
150 строк
4 KB
codespawn
Запрос на слияние 'feat/websource-edge-docs' (
#3
) из feat/websource-edge-docs в master
16 июл 2026, 07:24
Верифицирован
16 июл 2026, 07:24
fb8bdd6
Код
Авторство
О чём код?
package dsl import ( "testing" "time" ) func TestParseCount(t *testing.T) { cases := []struct { in string want int }{ {"999", 999}, {"1.2K", 1200}, {"3.36M", 3360000}, {"1B", 1000000000}, {"12.3k", 12300}, // lowercase suffix {"0", 0}, {"", 0}, {"not-a-number", 0}, {" 42 ", 42}, // trim } for _, tc := range cases { got := parseCount(tc.in) if got != tc.want { t.Errorf("parseCount(%q) = %d, want %d", tc.in, got, tc.want) } } } func TestParseDate(t *testing.T) { // RFC3339 (t.me отдаёт этот формат) — основной кейс для parity. t.Run("rfc3339", func(t *testing.T) { got, err := parseDate("2026-06-25T17:28:00+00:00") if err != nil { t.Fatalf("unexpected error: %v", err) } want := time.Date(2026, 6, 25, 17, 28, 0, 0, time.UTC) if !got.Equal(want) { t.Errorf("got %v, want %v", got, want) } }) t.Run("date_only", func(t *testing.T) { got, err := parseDate("2026-01-15") if err != nil { t.Fatalf("unexpected error: %v", err) } want := time.Date(2026, 1, 15, 0, 0, 0, 0, time.UTC) if !got.Equal(want) { t.Errorf("got %v, want %v", got, want) } }) t.Run("human_readable", func(t *testing.T) { got, err := parseDate("January 2, 2006") if err != nil { t.Fatalf("unexpected error: %v", err) } want := time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC) if !got.Equal(want) { t.Errorf("got %v, want %v", got, want) } }) t.Run("invalid", func(t *testing.T) { _, err := parseDate("not-a-date") if err == nil { t.Fatal("want error for invalid date, got nil") } }) // Пустая строка через parseValue → zero без ошибки (контракт на уровне parseValue, // не parseDate — parseDate честно ошибается на пустом). Проверяется в TestParseValue. } func TestParseDateUnix(t *testing.T) { got, err := parseDateUnix("1719334080") if err != nil { t.Fatalf("unexpected error: %v", err) } want := time.Unix(1719334080, 0).UTC() if !got.Equal(want) { t.Errorf("got %v, want %v", got, want) } if _, err := parseDateUnix("abc"); err == nil { t.Error("want error for invalid unix time") } } func TestParseValue(t *testing.T) { t.Run("empty_mode_returns_string", func(t *testing.T) { v, err := parseValue("hello", "") if err != nil { t.Fatalf("unexpected error: %v", err) } s, ok := v.(string) if !ok { t.Fatalf("want string, got %T", v) } if s != "hello" { t.Errorf("got %q, want hello", s) } }) t.Run("count_returns_int", func(t *testing.T) { v, err := parseValue("3.36M", "count") if err != nil { t.Fatalf("unexpected error: %v", err) } n, ok := v.(int) if !ok { t.Fatalf("want int, got %T", v) } if n != 3360000 { t.Errorf("got %d, want 3360000", n) } }) t.Run("date_returns_time", func(t *testing.T) { v, err := parseValue("2026-06-25T17:28:00+00:00", "date") if err != nil { t.Fatalf("unexpected error: %v", err) } if _, ok := v.(time.Time); !ok { t.Fatalf("want time.Time, got %T", v) } }) t.Run("empty_date_returns_zero_no_error", func(t *testing.T) { // Контракт: опциональное поле (напр. edited) при отсутствии → zero без ошибки, // а не «постотбрасывание». Это живёт в parseValue, не parseDate. v, err := parseValue("", "date") if err != nil { t.Fatalf("unexpected error for empty date: %v", err) } tm, ok := v.(time.Time) if !ok || !tm.IsZero() { t.Errorf("empty date should be zero time, got %v", v) } }) t.Run("unknown_mode_error", func(t *testing.T) { _, err := parseValue("x", "frobnicate") if err == nil { t.Fatal("want error for unknown mode") } }) }