package server

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

func TestWriteResponseWithBody(t *testing.T) {
	type Foo struct {
		Bar string `json:"bar"`
	}

	tests := []struct {
		code     int
		obj      interface{}
		wantCode int
		wantBody string
	}{
		// unserializable
		{
			code:     http.StatusTeapot,
			obj:      make(chan bool),
			wantCode: http.StatusInternalServerError,
		},
		// serializable
		{
			code:     http.StatusTeapot,
			obj:      Foo{"asdf"},
			wantCode: http.StatusTeapot,
			wantBody: `{"bar":"asdf"}`,
		},
	}

	for i, tt := range tests {
		w := httptest.NewRecorder()
		writeResponseWithBody(w, tt.code, tt.obj)

		if tt.wantCode != w.Code {
			t.Fatalf("case %d: incorrect status code: want=%d got=%d", i, tt.wantCode, w.Code)
		}

		body := w.Body.String()
		if tt.wantBody != body {
			t.Fatalf("case %d: incorrect body: want=%s got=%s", i, tt.wantBody, body)
		}
	}
}