180 lines
4.0 KiB
Go
180 lines
4.0 KiB
Go
package starnet
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
func TestResponseBody(t *testing.T) {
|
|
testData := "test response data"
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Write([]byte(testData))
|
|
}))
|
|
defer server.Close()
|
|
|
|
resp, err := Get(server.URL)
|
|
if err != nil {
|
|
t.Fatalf("Get() error: %v", err)
|
|
}
|
|
defer resp.Close()
|
|
|
|
// Test String()
|
|
body, err := resp.Body().String()
|
|
if err != nil {
|
|
t.Fatalf("Body().String() error: %v", err)
|
|
}
|
|
if body != testData {
|
|
t.Errorf("Body = %v; want %v", body, testData)
|
|
}
|
|
|
|
// Test multiple reads (should work because body is cached)
|
|
body2, err := resp.Body().String()
|
|
if err != nil {
|
|
t.Fatalf("Second Body().String() error: %v", err)
|
|
}
|
|
if body2 != testData {
|
|
t.Errorf("Second Body = %v; want %v", body2, testData)
|
|
}
|
|
}
|
|
|
|
func TestResponseJSON(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write([]byte(`{"name":"John","age":30}`))
|
|
}))
|
|
defer server.Close()
|
|
|
|
resp, err := Get(server.URL)
|
|
if err != nil {
|
|
t.Fatalf("Get() error: %v", err)
|
|
}
|
|
defer resp.Close()
|
|
|
|
var result struct {
|
|
Name string `json:"name"`
|
|
Age int `json:"age"`
|
|
}
|
|
|
|
err = resp.Body().JSON(&result)
|
|
if err != nil {
|
|
t.Fatalf("Body().JSON() error: %v", err)
|
|
}
|
|
|
|
if result.Name != "John" {
|
|
t.Errorf("Name = %v; want John", result.Name)
|
|
}
|
|
if result.Age != 30 {
|
|
t.Errorf("Age = %v; want 30", result.Age)
|
|
}
|
|
}
|
|
|
|
func TestResponseBytes(t *testing.T) {
|
|
testData := []byte("binary data")
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Write(testData)
|
|
}))
|
|
defer server.Close()
|
|
|
|
resp, err := Get(server.URL)
|
|
if err != nil {
|
|
t.Fatalf("Get() error: %v", err)
|
|
}
|
|
defer resp.Close()
|
|
|
|
body, err := resp.Body().Bytes()
|
|
if err != nil {
|
|
t.Fatalf("Body().Bytes() error: %v", err)
|
|
}
|
|
|
|
if string(body) != string(testData) {
|
|
t.Errorf("Body = %v; want %v", body, testData)
|
|
}
|
|
}
|
|
|
|
func TestResponseReader(t *testing.T) {
|
|
testData := "stream data"
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Write([]byte(testData))
|
|
}))
|
|
defer server.Close()
|
|
|
|
resp, err := Get(server.URL)
|
|
if err != nil {
|
|
t.Fatalf("Get() error: %v", err)
|
|
}
|
|
defer resp.Close()
|
|
|
|
reader, err := resp.Body().Reader()
|
|
if err != nil {
|
|
t.Fatalf("Body().Reader() error: %v", err)
|
|
}
|
|
defer reader.Close()
|
|
|
|
body, err := io.ReadAll(reader)
|
|
if err != nil {
|
|
t.Fatalf("ReadAll() error: %v", err)
|
|
}
|
|
|
|
if string(body) != testData {
|
|
t.Errorf("Body = %v; want %v", string(body), testData)
|
|
}
|
|
}
|
|
|
|
func TestResponseAutoFetch(t *testing.T) {
|
|
testData := "auto fetch data"
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Write([]byte(testData))
|
|
}))
|
|
defer server.Close()
|
|
|
|
// With auto fetch
|
|
resp, err := Get(server.URL, WithAutoFetch(true))
|
|
if err != nil {
|
|
t.Fatalf("Get() error: %v", err)
|
|
}
|
|
defer resp.Close()
|
|
|
|
if !resp.Body().IsConsumed() {
|
|
t.Error("Body should be consumed with auto fetch")
|
|
}
|
|
|
|
body, _ := resp.Body().String()
|
|
if body != testData {
|
|
t.Errorf("Body = %v; want %v", body, testData)
|
|
}
|
|
}
|
|
|
|
func TestResponseStatusCode(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
statusCode int
|
|
}{
|
|
{"OK", http.StatusOK},
|
|
{"Created", http.StatusCreated},
|
|
{"BadRequest", http.StatusBadRequest},
|
|
{"NotFound", http.StatusNotFound},
|
|
{"InternalServerError", http.StatusInternalServerError},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(tt.statusCode)
|
|
}))
|
|
defer server.Close()
|
|
|
|
resp, err := Get(server.URL)
|
|
if err != nil {
|
|
t.Fatalf("Get() error: %v", err)
|
|
}
|
|
defer resp.Close()
|
|
|
|
if resp.StatusCode != tt.statusCode {
|
|
t.Errorf("StatusCode = %v; want %v", resp.StatusCode, tt.statusCode)
|
|
}
|
|
})
|
|
}
|
|
}
|