main_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/http/httptest"
  6. "strings"
  7. "testing"
  8. "time"
  9. )
  10. func TestGreetingHandler(t *testing.T) {
  11. tests := []struct {
  12. name string
  13. method string
  14. url string
  15. wantStatus int
  16. }{
  17. {name: "valid", method: http.MethodGet, url: "/hello?name=Go", wantStatus: http.StatusOK},
  18. {name: "missing_name", method: http.MethodGet, url: "/hello", wantStatus: http.StatusBadRequest},
  19. {name: "wrong_method", method: http.MethodPost, url: "/hello?name=Go", wantStatus: http.StatusMethodNotAllowed},
  20. }
  21. for _, tt := range tests {
  22. t.Run(tt.name, func(t *testing.T) {
  23. request := httptest.NewRequest(tt.method, tt.url, nil)
  24. response := httptest.NewRecorder()
  25. greetingHandler(response, request)
  26. if response.Code != tt.wantStatus {
  27. t.Errorf("状态码=%d,期望=%d", response.Code, tt.wantStatus)
  28. }
  29. if tt.wantStatus == http.StatusOK && !strings.Contains(response.Body.String(), "你好,Go!") {
  30. t.Errorf("响应内容不符合预期:%s", response.Body.String())
  31. }
  32. })
  33. }
  34. }
  35. func TestFetchGreeting(t *testing.T) {
  36. mux := http.NewServeMux()
  37. mux.HandleFunc("/hello", greetingHandler)
  38. server := httptest.NewServer(mux)
  39. defer server.Close()
  40. client := &http.Client{Timeout: 2 * time.Second}
  41. got, err := fetchGreeting(client, server.URL, "小 朱&Go")
  42. if err != nil {
  43. t.Fatalf("请求失败:%v", err)
  44. }
  45. if got.Message != "你好,小 朱&Go!" {
  46. t.Errorf("消息=%q", got.Message)
  47. }
  48. if _, err := fetchGreeting(client, server.URL, ""); err == nil {
  49. t.Error("空姓名应导致客户端返回错误")
  50. }
  51. }
  52. func TestFetchRejectsInvalidResponse(t *testing.T) {
  53. tests := []struct {
  54. name string
  55. body string
  56. }{
  57. {name: "invalid_json", body: "not json"},
  58. {name: "oversized", body: strings.Repeat("a", 64*1024+1)},
  59. }
  60. for _, tt := range tests {
  61. t.Run(tt.name, func(t *testing.T) {
  62. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  63. fmt.Fprint(w, tt.body)
  64. }))
  65. defer server.Close()
  66. client := &http.Client{Timeout: 2 * time.Second}
  67. if _, err := fetchGreeting(client, server.URL, "Go"); err == nil {
  68. t.Error("无效响应应返回错误")
  69. }
  70. })
  71. }
  72. }