package api

import (
	"fmt"
	"net/http"
	"testing"
)

// TestOwnerIDSurvivesRequestBufferReuse: Fiber v2'de c.Get(...) istek tamponuna işaret eden kopyalanmamış
// bir string döner. Kimlik kopyalanmadan konuşma sahibi olarak (bellek içi depoda) saklanırsa, sonraki
// istekler tamponu ezdiğinde sahip kimliği değişir ve gerçek sahibi kendi konuşmasına 404 alır.
// Bu test, aynı uzunlukta farklı kimlikleri art arda göndererek tamponun yeniden kullanılmasını zorlar.
func TestOwnerIDSurvivesRequestBufferReuse(t *testing.T) {
	s, _ := testServer(t, &fakeProvider{})

	const rounds = 150
	ids := make([]string, rounds)
	owners := make([]string, rounds)
	for i := 0; i < rounds; i++ {
		owners[i] = fmt.Sprintf("owner-%04d", i) // hepsi aynı uzunlukta: tampon aynı yere yazılır
		_, raw := do(t, s, http.MethodPost, "/api/conversations", nil, map[string]string{UserHeader: owners[i]})
		ids[i] = decode[conversationResponse](t, raw).Conversation.ID
		// Araya başka kimliklerle istekler sokarak tamponu ez.
		for j := 0; j < 3; j++ {
			do(t, s, http.MethodGet, "/api/conversations", nil, map[string]string{UserHeader: fmt.Sprintf("other-%04d", i)})
		}
	}

	for i := 0; i < rounds; i++ {
		resp, body := do(t, s, http.MethodGet, "/api/conversations/"+ids[i], nil, map[string]string{UserHeader: owners[i]})
		if resp.StatusCode != http.StatusOK {
			t.Fatalf("konuşma %d: gerçek sahibi (%s) okuyamadı: %d %s — sahip kimliği bozulmuş", i, owners[i], resp.StatusCode, body)
		}
	}
}
