package commonv1

import (
	"context"
	"errors"
	"testing"
	"time"
)

func TestValidateRequestContextOwnsLifecycleClassification(t *testing.T) {
	canceled, cancel := context.WithCancel(context.Background())
	cancel()
	expired, expire := context.WithDeadline(context.Background(), time.Now().Add(-time.Second))
	defer expire()
	valid, validCancel := context.WithTimeout(context.Background(), time.Second)
	defer validCancel()

	tests := []struct {
		name             string
		ctx              context.Context
		category         FailureCategory
		invalidComponent InvalidComponent
	}{
		{name: "nil", category: FailureInvalidRequest, invalidComponent: InvalidComponentDeadline},
		{name: "missing deadline", ctx: context.Background(), category: FailureInvalidRequest, invalidComponent: InvalidComponentDeadline},
		{name: "canceled", ctx: canceled, category: FailureCanceled},
		{name: "expired", ctx: expired, category: FailureDeadlineExceeded},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			var failure *Failure
			if err := ValidateRequestContext(test.ctx); !errors.As(err, &failure) || failure.Category != test.category ||
				failure.InvalidComponent != test.invalidComponent {
				t.Fatalf("ValidateRequestContext() = %#v, want %s/%s", err, test.category, test.invalidComponent)
			}
		})
	}
	if err := ValidateRequestContext(valid); err != nil {
		t.Fatalf("valid context = %v", err)
	}
}
