package ident_test import ( "errors" "strings" "testing" "git.vakhrushev.me/av/healthlog/internal/ident" ) func TestNewIDIsLowercaseULID(t *testing.T) { id := ident.NewID() if len(id) != 26 { t.Errorf("длина = %d, ожидалось 26: %q", len(id), id) } if id != strings.ToLower(id) { t.Errorf("id не в нижнем регистре: %q", id) } if ident.NewID() == id { t.Error("два вызова вернули один и тот же id") } } // Идентификаторы сортируемы по времени создания — на этом держится // хронология выборок и корреляция в логах. func TestNewIDSortsByCreationTime(t *testing.T) { prev := ident.NewID() for range 10 { next := ident.NewID() if next <= prev { t.Fatalf("порядок нарушен: %q после %q", next, prev) } prev = next } } // Внешний id приводится к каноническому виду: сравнение строк в SQLite // побайтовое, а base32 ULID при декодировании нечувствителен к регистру. func TestParseNormalizesCase(t *testing.T) { id := ident.NewID() got, err := ident.Parse(strings.ToUpper(id)) if err != nil { t.Fatalf("Parse: %v", err) } if got != id { t.Errorf("Parse вернул %q, ожидалось %q", got, id) } } func TestParseRejectsGarbage(t *testing.T) { for _, s := range []string{"", "не-id", "01k1", strings.Repeat("z", 26)} { if _, err := ident.Parse(s); !errors.Is(err, ident.ErrInvalid) { t.Errorf("Parse(%q): ошибка = %v, ожидалась ErrInvalid", s, err) } } }