package router

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

func TestMakeWrapperFunc(t *testing.T) {
	var (
		firstBody    = []byte("1")
		secondBody   = []byte("2")
		mainBody     = []byte("3")
		expectedBody = append(firstBody, append(secondBody, mainBody...)...)
	)

	pre := func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
		w.Header().Set("X-Custom", "data")
		next(w, r)
	}

	first := func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
		w.Write(firstBody)
		next(w, r)
	}

	second := func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
		w.Write(secondBody)
		next(w, r)
	}

	mainHandler := func(w http.ResponseWriter, r *http.Request) {
		w.Write(mainBody)
	}

	wrapper := makeWrapperFunc(second, first)
	wrapper = makeWrapperFunc(wrapper, pre)

	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", "https://iris-go.com", nil)
	wrapper(w, r, mainHandler)

	if got := w.Body.Bytes(); !bytes.Equal(expectedBody, got) {
		t.Fatalf("expected boy: %s but got: %s", string(expectedBody), string(got))
	}

	if expected, got := "data", w.Header().Get("X-Custom"); expected != got {
		t.Fatalf("expected x-custom header: %s but got: %s", expected, got)
	}
}