package catalog import ( "testing" "time" ) // Ответ каталога есть функция снимка И горизонта измерения: метка из будущего, // лежащая в витрине, въезжает в окно сама, с ходом часов и без единого коммита. // Построено враждебным проходом: та же версия витрины, `cumulative` против // `unknown`. Значит горизонт обязан входить в метку — иначе клиент с // `If-None-Match` получит `304` на изменившийся ответ. func TestГоризонтВходитВВерсиюОтвета(t *testing.T) { t.Parallel() at := time.Date(2026, 6, 1, 10, 30, 0, 0, time.UTC) if Stamp("v", at) == Stamp("v", at.Add(2*time.Hour)) { t.Error("версия не изменилась при сдвиге горизонта на два часа") } // Огрубление до часа точное, а не приблизительное: `hour_utc` объектов лежит // ровно на часах, поэтому отбор меняется ровно при переходе через час. // Внутри часа метка обязана стоять — иначе она дребезжала бы ежесекундно. if Stamp("v", at) != Stamp("v", at.Add(20*time.Minute)) { t.Error("версия сдвинулась внутри одного часа — метка дребезжит на месте") } if Stamp("", at) != "" { t.Error("пустая версия витрины подписана горизонтом — подписывать нечем") } }