package yandex import ( "context" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // Принятие операции распознавания защищено от отмены: остановка сервиса не // должна обрывать вызов, который уже мог начать стоить денег и чей результат // нельзя переспросить. Проверяется само средство защиты — проводка к нему // оракула не имеет: клиент SpeechKit подставить нечем, а прогон на реальных // ключах запрещён (CLAUDE.md, «Запреты»). func TestProtectedContextSurvivesParentCancel(t *testing.T) { parent, cancel := context.WithCancel(t.Context()) protected, release := protectFromCancel(parent, time.Minute) defer release() cancel() require.Error(t, parent.Err(), "родитель отменён — иначе проверка судит не то") assert.NoError(t, protected.Err(), "защищённый вызов пережил отмену родителя") } // Защита не бессрочна: у вызова свой предел, иначе остановка ждала бы вечно. func TestProtectedContextKeepsItsOwnDeadline(t *testing.T) { protected, release := protectFromCancel(t.Context(), time.Minute) defer release() deadline, ok := protected.Deadline() require.True(t, ok, "у защищённого вызова обязан быть свой предел") assert.WithinDuration(t, time.Now().Add(time.Minute), deadline, 5*time.Second) }