package httpapi

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

	"github.com/stretchr/testify/assert"

	"github.com/gin-gonic/gin"
)

type TestReq struct {
	Name string `json:"name" form:"name" validate:"required,min=1,max=4"`
}

type TestResp struct {
	ID string `json:"id" form:"id"`
}

func TestHandleJsonRequestFromBody(t *testing.T) {
	t.Run("normal", func(t *testing.T) {
		c, _ := gin.CreateTestContext(httptest.NewRecorder())
		body := "{\"name\":\"aaa\"}"
		c.Request, _ = http.NewRequest("POST", "/", strings.NewReader(body))
		req := &TestReq{}
		ok := HandleJsonRequestFromBody(c, req)
		assert.True(t, ok)
		assert.Equal(t, "aaa", req.Name)
	})
	t.Run("bind failed", func(t *testing.T) {
		c, _ := gin.CreateTestContext(httptest.NewRecorder())
		body := "{\"name\":\"aaa\""
		c.Request, _ = http.NewRequest("POST", "/", strings.NewReader(body))
		req := &TestReq{}
		ok := HandleJsonRequestFromBody(c, req)
		assert.False(t, ok)
	})
	t.Run("validate failed", func(t *testing.T) {
		c, _ := gin.CreateTestContext(httptest.NewRecorder())
		body := "{\"name\":\"aaaaa\"}"
		c.Request, _ = http.NewRequest("POST", "/", strings.NewReader(body))
		req := &TestReq{}
		ok := HandleJsonRequestFromBody(c, req)
		assert.False(t, ok)
	})
}

func TestHandleJsonRequestFromQuery(t *testing.T) {
	t.Run("normal", func(t *testing.T) {
		c, _ := gin.CreateTestContext(httptest.NewRecorder())
		c.Request, _ = http.NewRequest("GET", "/?name=aaa", strings.NewReader(""))
		req := &TestReq{}
		ok := HandleJsonRequestFromQuery(c, req)
		assert.True(t, ok)
		assert.Equal(t, "aaa", req.Name)
	})
}

func TestHandleJsonRequestWithBuiltReq(t *testing.T) {
	c, _ := gin.CreateTestContext(httptest.NewRecorder())
	c.Request, _ = http.NewRequest("GET", "/?name=aaa", strings.NewReader(""))
	req := &TestReq{
		Name: "aaa",
	}
	ok := HandleJsonRequestWithBuiltReq(c, req)
	assert.True(t, ok)
	assert.Equal(t, "aaa", req.Name)
}

func TestHandleRequest(t *testing.T) {
	c, _ := gin.CreateTestContext(httptest.NewRecorder())
	c.Request, _ = http.NewRequest("POST", "/", nil)

}
