summaryrefslogtreecommitdiff
path: root/internal/api/http_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/api/http_test.go')
-rw-r--r--internal/api/http_test.go207
1 files changed, 207 insertions, 0 deletions
diff --git a/internal/api/http_test.go b/internal/api/http_test.go
new file mode 100644
index 0000000..c2c32ee
--- /dev/null
+++ b/internal/api/http_test.go
@@ -0,0 +1,207 @@
+package api
+
+import (
+ "context"
+ "encoding/json"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+)
+
+func TestNewBaseClient(t *testing.T) {
+ client := NewBaseClient("https://api.example.com")
+ if client.BaseURL != "https://api.example.com" {
+ t.Errorf("Expected BaseURL 'https://api.example.com', got '%s'", client.BaseURL)
+ }
+ if client.HTTPClient == nil {
+ t.Error("HTTPClient should not be nil")
+ }
+}
+
+func TestBaseClient_Get(t *testing.T) {
+ expected := map[string]string{"message": "hello"}
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "GET" {
+ t.Errorf("Expected GET, got %s", r.Method)
+ }
+ if r.URL.Path != "/test" {
+ t.Errorf("Expected path /test, got %s", r.URL.Path)
+ }
+ if r.Header.Get("Authorization") != "Bearer token123" {
+ t.Errorf("Expected Authorization header")
+ }
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(expected)
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]string
+ err := client.Get(context.Background(), "/test", map[string]string{"Authorization": "Bearer token123"}, &result)
+ if err != nil {
+ t.Fatalf("Get failed: %v", err)
+ }
+ if result["message"] != "hello" {
+ t.Errorf("Expected message 'hello', got '%s'", result["message"])
+ }
+}
+
+func TestBaseClient_Get_Error(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(http.StatusInternalServerError)
+ w.Write([]byte("server error"))
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]string
+ err := client.Get(context.Background(), "/test", nil, &result)
+ if err == nil {
+ t.Error("Expected error for 500 response")
+ }
+}
+
+func TestBaseClient_Post(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "POST" {
+ t.Errorf("Expected POST, got %s", r.Method)
+ }
+ if r.Header.Get("Content-Type") != "application/json" {
+ t.Error("Expected Content-Type application/json")
+ }
+
+ var body map[string]string
+ json.NewDecoder(r.Body).Decode(&body)
+ if body["name"] != "test" {
+ t.Errorf("Expected name 'test', got '%s'", body["name"])
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(map[string]int{"id": 42})
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]int
+ err := client.Post(context.Background(), "/create", nil, map[string]string{"name": "test"}, &result)
+ if err != nil {
+ t.Fatalf("Post failed: %v", err)
+ }
+ if result["id"] != 42 {
+ t.Errorf("Expected id 42, got %d", result["id"])
+ }
+}
+
+func TestBaseClient_Post_NilBody(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Header.Get("Content-Type") == "application/json" {
+ t.Error("Content-Type should not be set for nil body")
+ }
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]string
+ err := client.Post(context.Background(), "/action", nil, nil, &result)
+ if err != nil {
+ t.Fatalf("Post with nil body failed: %v", err)
+ }
+}
+
+func TestBaseClient_PostForm(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "POST" {
+ t.Errorf("Expected POST, got %s", r.Method)
+ }
+ if r.Header.Get("Content-Type") != "application/x-www-form-urlencoded" {
+ t.Error("Expected form-urlencoded Content-Type")
+ }
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(map[string]bool{"success": true})
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]bool
+ err := client.PostForm(context.Background(), "/submit", nil, "key=value", &result)
+ if err != nil {
+ t.Fatalf("PostForm failed: %v", err)
+ }
+ if !result["success"] {
+ t.Error("Expected success to be true")
+ }
+}
+
+func TestBaseClient_PostEmpty(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "POST" {
+ t.Errorf("Expected POST, got %s", r.Method)
+ }
+ if r.Header.Get("X-Custom") != "custom-value" {
+ t.Error("Expected custom header")
+ }
+ w.WriteHeader(http.StatusNoContent)
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ err := client.PostEmpty(context.Background(), "/trigger", map[string]string{"X-Custom": "custom-value"})
+ if err != nil {
+ t.Fatalf("PostEmpty failed: %v", err)
+ }
+}
+
+func TestBaseClient_PostEmpty_Error(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(http.StatusBadRequest)
+ w.Write([]byte("bad request"))
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ err := client.PostEmpty(context.Background(), "/fail", nil)
+ if err == nil {
+ t.Error("Expected error for 400 response")
+ }
+}
+
+func TestBaseClient_Put(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != "PUT" {
+ t.Errorf("Expected PUT, got %s", r.Method)
+ }
+ if r.Header.Get("Content-Type") != "application/x-www-form-urlencoded" {
+ t.Error("Expected form-urlencoded Content-Type")
+ }
+ w.Header().Set("Content-Type", "application/json")
+ json.NewEncoder(w).Encode(map[string]string{"updated": "yes"})
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]string
+ err := client.Put(context.Background(), "/update", nil, "field=value", &result)
+ if err != nil {
+ t.Fatalf("Put failed: %v", err)
+ }
+ if result["updated"] != "yes" {
+ t.Error("Expected updated to be yes")
+ }
+}
+
+func TestBaseClient_doJSON_DecodeError(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("invalid json"))
+ }))
+ defer server.Close()
+
+ client := BaseClient{HTTPClient: server.Client(), BaseURL: server.URL}
+ var result map[string]string
+ err := client.Get(context.Background(), "/bad-json", nil, &result)
+ if err == nil {
+ t.Error("Expected error for invalid JSON")
+ }
+}