package sdk

import (
	"bufio"
	"encoding/json"
	"io"
	"testing"
	"time"
)

// Girdi (stdin) kapandiginda bile calisan bir islemcinin cevabi yazilmali; surec erken cikmamali.
func TestGirdiKapanincaCalisanIslemCevabiniYazar(t *testing.T) {
	e := Yeni("test")
	e.Kayit("yavas", func(c *Cagri) (any, error) {
		time.Sleep(100 * time.Millisecond)
		return map[string]string{"durum": "tamam"}, nil
	})

	pin, cw := io.Pipe()
	cr, pout := io.Pipe()
	done := make(chan error, 1)
	go func() { done <- e.Calistir(pin, pout) }()

	b, err := cerceve(Mesaj{Id: json.RawMessage("9"), Method: "yavas"})
	if err != nil {
		t.Fatal(err)
	}
	if _, err := cw.Write(b); err != nil {
		t.Fatal(err)
	}
	// Girdiyi hemen kapat: Calistir bitmeden islemci hala calisiyor olmali.
	cw.Close()

	m, err := oku(bufio.NewReader(cr))
	if err != nil {
		t.Fatalf("girdi kapandiktan sonra cevap okunamadi: %v", err)
	}
	if string(m.Id) != "9" || m.Error != nil {
		t.Fatalf("cevap hatali: %+v", m)
	}
	if err := <-done; err != io.EOF && err != io.ErrClosedPipe {
		t.Fatalf("beklenmeyen Calistir hatasi: %v", err)
	}
}
