package main import ( "fmt" "net/http" "net/http/httptest" "strings" "testing" "time" ) func TestGreetingHandler(t *testing.T) { tests := []struct { name string method string url string wantStatus int }{ {name: "valid", method: http.MethodGet, url: "/hello?name=Go", wantStatus: http.StatusOK}, {name: "missing_name", method: http.MethodGet, url: "/hello", wantStatus: http.StatusBadRequest}, {name: "wrong_method", method: http.MethodPost, url: "/hello?name=Go", wantStatus: http.StatusMethodNotAllowed}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { request := httptest.NewRequest(tt.method, tt.url, nil) response := httptest.NewRecorder() greetingHandler(response, request) if response.Code != tt.wantStatus { t.Errorf("状态码=%d,期望=%d", response.Code, tt.wantStatus) } if tt.wantStatus == http.StatusOK && !strings.Contains(response.Body.String(), "你好,Go!") { t.Errorf("响应内容不符合预期:%s", response.Body.String()) } }) } } func TestFetchGreeting(t *testing.T) { mux := http.NewServeMux() mux.HandleFunc("/hello", greetingHandler) server := httptest.NewServer(mux) defer server.Close() client := &http.Client{Timeout: 2 * time.Second} got, err := fetchGreeting(client, server.URL, "小 朱&Go") if err != nil { t.Fatalf("请求失败:%v", err) } if got.Message != "你好,小 朱&Go!" { t.Errorf("消息=%q", got.Message) } if _, err := fetchGreeting(client, server.URL, ""); err == nil { t.Error("空姓名应导致客户端返回错误") } } func TestFetchRejectsInvalidResponse(t *testing.T) { tests := []struct { name string body string }{ {name: "invalid_json", body: "not json"}, {name: "oversized", body: strings.Repeat("a", 64*1024+1)}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, tt.body) })) defer server.Close() client := &http.Client{Timeout: 2 * time.Second} if _, err := fetchGreeting(client, server.URL, "Go"); err == nil { t.Error("无效响应应返回错误") } }) } }