package main

import (
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

func sahteEverything(t *testing.T, kod int, govde string) func() {
	t.Helper()
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Query().Get("json") != "1" || r.URL.Query().Get("count") != "50" || r.URL.Query().Get("size_column") != "1" || r.URL.Query().Get("date_modified_column") != "1" {
			t.Errorf("beklenmeyen parametreler: %v", r.URL.Query())
		}
		w.WriteHeader(kod)
		_, _ = w.Write([]byte(govde))
	}))
	onceki := everythingAdres
	everythingAdres = srv.URL + "/"
	return func() {
		everythingAdres = onceki
		srv.Close()
	}
}

func TestAraBasarili(t *testing.T) {
	defer sahteEverything(t, 200, `{"results":[{"name":"a.txt"}]}`)()
	c := islemeAl([]byte(`{"islem":"ara","veri":{"sorgu":"a.txt"}}`))
	if !c.Tamam || !json.Valid(c.Veri) {
		t.Fatalf("basarili arama beklenirken: %+v", c)
	}
}

func TestGirdiDogrulama(t *testing.T) {
	uzun := strings.Repeat("a", 201)
	for _, satir := range []string{
		`{"islem":"sil","veri":{"sorgu":"x"}}`,
		`{"islem":"ara","veri":{"sorgu":""}}`,
		`{"islem":"ara","veri":{"sorgu":"   "}}`,
		`{"islem":"ara","veri":{"sorgu":"` + uzun + `"}}`,
		`bozuk json`,
	} {
		if c := islemeAl([]byte(satir)); c.Tamam {
			t.Fatalf("gecersiz girdi kabul edildi: %s", satir)
		}
	}
}

func TestEverythingHataVeGecersizYanit(t *testing.T) {
	defer sahteEverything(t, 500, `{}`)()
	if c := islemeAl([]byte(`{"islem":"ara","veri":{"sorgu":"x"}}`)); c.Tamam {
		t.Fatal("HTTP 500 basarili sayildi")
	}
	everythingAdres = "http://127.0.0.1:1/"
	if c := islemeAl([]byte(`{"islem":"ara","veri":{"sorgu":"x"}}`)); c.Tamam {
		t.Fatal("ulasilamayan sunucu basarili sayildi")
	}
}

func TestPing(t *testing.T) {
	if c := islemeAl([]byte(`{"islem":"ping"}`)); !c.Tamam {
		t.Fatal("ping basarili donmeli")
	}
}

func TestGecersizJSONYanit(t *testing.T) {
	defer sahteEverything(t, 200, `<html>hata</html>`)()
	if c := islemeAl([]byte(`{"islem":"ara","veri":{"sorgu":"x"}}`)); c.Tamam {
		t.Fatal("JSON olmayan yanit kabul edildi")
	}
}
