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)
}
