You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							150 lines
						
					
					
						
							3.7 KiB
						
					
					
				| package webhook | |
| 
 | |
| import ( | |
| 	"encoding/json" | |
| 	"io" | |
| 	"net/http" | |
| 	"net/http/httptest" | |
| 	"testing" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" | |
| 	util_http "github.com/seaweedfs/seaweedfs/weed/util/http" | |
| ) | |
| 
 | |
| func init() { | |
| 	util_http.InitGlobalHttpClient() | |
| } | |
| 
 | |
| func TestHttpClientSendMessage(t *testing.T) { | |
| 	var receivedPayload map[string]interface{} | |
| 	var receivedHeaders http.Header | |
| 
 | |
| 	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |
| 		receivedHeaders = r.Header | |
| 		body, _ := io.ReadAll(r.Body) | |
| 		if err := json.Unmarshal(body, &receivedPayload); err != nil { | |
| 			w.WriteHeader(http.StatusInternalServerError) | |
| 			return | |
| 		} | |
| 		w.WriteHeader(http.StatusOK) | |
| 	})) | |
| 	defer server.Close() | |
| 
 | |
| 	cfg := &config{ | |
| 		endpoint:        server.URL, | |
| 		authBearerToken: "test-token", | |
| 	} | |
| 
 | |
| 	client, err := newHTTPClient(cfg) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to create HTTP client: %v", err) | |
| 	} | |
| 
 | |
| 	message := &filer_pb.EventNotification{ | |
| 		OldEntry: nil, | |
| 		NewEntry: &filer_pb.Entry{ | |
| 			Name:        "test.txt", | |
| 			IsDirectory: false, | |
| 		}, | |
| 	} | |
| 
 | |
| 	err = client.sendMessage(newWebhookMessage("/test/path", message)) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to send message: %v", err) | |
| 	} | |
| 
 | |
| 	if receivedPayload["key"] != "/test/path" { | |
| 		t.Errorf("Expected key '/test/path', got %v", receivedPayload["key"]) | |
| 	} | |
| 
 | |
| 	if receivedPayload["event_type"] != "create" { | |
| 		t.Errorf("Expected event_type 'create', got %v", receivedPayload["event_type"]) | |
| 	} | |
| 
 | |
| 	if receivedPayload["message"] == nil { | |
| 		t.Error("Expected message to be present") | |
| 	} | |
| 
 | |
| 	if receivedHeaders.Get("Content-Type") != "application/json" { | |
| 		t.Errorf("Expected Content-Type 'application/json', got %s", receivedHeaders.Get("Content-Type")) | |
| 	} | |
| 
 | |
| 	expectedAuth := "Bearer test-token" | |
| 	if receivedHeaders.Get("Authorization") != expectedAuth { | |
| 		t.Errorf("Expected Authorization '%s', got %s", expectedAuth, receivedHeaders.Get("Authorization")) | |
| 	} | |
| } | |
| 
 | |
| func TestHttpClientSendMessageWithoutToken(t *testing.T) { | |
| 	var receivedHeaders http.Header | |
| 
 | |
| 	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |
| 		receivedHeaders = r.Header | |
| 		w.WriteHeader(http.StatusOK) | |
| 	})) | |
| 	defer server.Close() | |
| 
 | |
| 	cfg := &config{ | |
| 		endpoint:        server.URL, | |
| 		authBearerToken: "", | |
| 	} | |
| 
 | |
| 	client, err := newHTTPClient(cfg) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to create HTTP client: %v", err) | |
| 	} | |
| 
 | |
| 	message := &filer_pb.EventNotification{} | |
| 
 | |
| 	err = client.sendMessage(newWebhookMessage("/test/path", message)) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to send message: %v", err) | |
| 	} | |
| 
 | |
| 	if receivedHeaders.Get("Authorization") != "" { | |
| 		t.Errorf("Expected no Authorization header, got %s", receivedHeaders.Get("Authorization")) | |
| 	} | |
| } | |
| 
 | |
| func TestHttpClientSendMessageServerError(t *testing.T) { | |
| 	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |
| 		w.WriteHeader(http.StatusInternalServerError) | |
| 	})) | |
| 	defer server.Close() | |
| 
 | |
| 	cfg := &config{ | |
| 		endpoint:        server.URL, | |
| 		authBearerToken: "test-token", | |
| 	} | |
| 
 | |
| 	client, err := newHTTPClient(cfg) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to create HTTP client: %v", err) | |
| 	} | |
| 
 | |
| 	message := &filer_pb.EventNotification{} | |
| 
 | |
| 	err = client.sendMessage(newWebhookMessage("/test/path", message)) | |
| 	if err == nil { | |
| 		t.Error("Expected error for server error response") | |
| 	} | |
| } | |
| 
 | |
| func TestHttpClientSendMessageNetworkError(t *testing.T) { | |
| 	cfg := &config{ | |
| 		endpoint:        "http://localhost:99999", | |
| 		authBearerToken: "", | |
| 	} | |
| 
 | |
| 	client, err := newHTTPClient(cfg) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to create HTTP client: %v", err) | |
| 	} | |
| 
 | |
| 	message := &filer_pb.EventNotification{} | |
| 
 | |
| 	err = client.sendMessage(newWebhookMessage("/test/path", message)) | |
| 	if err == nil { | |
| 		t.Error("Expected error for network failure") | |
| 	} | |
| }
 |