package main

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

// korumaliCevap: korunan bir isleyiciye token ile istek atar; kodu ve govdeyi dondurur.
// Isleyici, istegin profilini ve o profilin izin durumunu yazar; boylece hangi hesabin
// verisinin kullanildigi govdeden anlasilir.
func korumaliCevap(t *testing.T, token string) (int, string) {
	t.Helper()
	h := korumali(func(w http.ResponseWriter, r *http.Request) {
		p := profilDe(r)
		ev := "false"
		if izinOkuProfil(p).EverythingAra {
			ev = "true"
		}
		_, _ = w.Write([]byte(p + "|" + ev))
	})
	req := httptest.NewRequest(http.MethodGet, "/x", nil)
	req.Header.Set("X-Bridge-Token", token)
	rec := httptest.NewRecorder()
	h(rec, req)
	return rec.Code, rec.Body.String()
}

// TestKorumaliCokluHesapIzolasyon: iki etkin hesap ayni anda calisir; her token yalnizca kendi
// hesabinin verisini gorur. Biri etkinlestirme disi birakilinca onun token'i reddedilir.
func TestKorumaliCokluHesapIzolasyon(t *testing.T) {
	t.Setenv("APPDATA", t.TempDir())
	profilTokenKur(t, "ahmet", "t-ahmet")
	profilTokenKur(t, "ayse", "t-ayse")
	etkinTestKur(t, "ahmet", "ayse")

	// Izin durumlarini testte acikca kur (onbellek diger testlerden kalmis olabilir).
	if err := izinleriKaydetProfil("ahmet", Izinler{}); err != nil {
		t.Fatal(err)
	}
	// Yalnizca ayse'nin everything izni var.
	if err := izinleriKaydetProfil("ayse", Izinler{EverythingAra: true}); err != nil {
		t.Fatal(err)
	}

	if c, govde := korumaliCevap(t, "t-ahmet"); c != http.StatusOK || govde != "ahmet|false" {
		t.Errorf("ahmet token'i: kod %d govde %q; ahmet|false bekleniyordu", c, govde)
	}
	if c, govde := korumaliCevap(t, "t-ayse"); c != http.StatusOK || govde != "ayse|true" {
		t.Errorf("ayse token'i: kod %d govde %q; ayse|true bekleniyordu", c, govde)
	}

	// Ayse devre disi: token reddedilir, ahmet etkilenmez.
	if err := etkinHesapCikar("ayse"); err != nil {
		t.Fatal(err)
	}
	if c, _ := korumaliCevap(t, "t-ayse"); c != http.StatusConflict {
		t.Errorf("etkin olmayan ayse 409 bekleniyordu, %d", c)
	}
	if c, govde := korumaliCevap(t, "t-ahmet"); c != http.StatusOK || govde != "ahmet|false" {
		t.Errorf("ahmet hala calismali: kod %d govde %q", c, govde)
	}
}
