github.com/gophish/gophish@v0.12.2-0.20230915144530-8e7929441393/webhook/webhook_test.go (about)

     1  package webhook
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"reflect"
    11  	"testing"
    12  )
    13  
    14  type mockSender struct {
    15  	client *http.Client
    16  }
    17  
    18  func newMockSender() *mockSender {
    19  	ms := &mockSender{
    20  		client: &http.Client{},
    21  	}
    22  	return ms
    23  }
    24  
    25  func (ms mockSender) Send(endPoint EndPoint, data interface{}) error {
    26  	log.Println("[test] mocked 'Send' function")
    27  	return nil
    28  }
    29  
    30  func TestSendMocked(t *testing.T) {
    31  	ms := newMockSender()
    32  	endpoint := EndPoint{URL: "http://example.com/a1", Secret: "s1"}
    33  	data := map[string]string{
    34  		"a1": "a11",
    35  		"a2": "a22",
    36  		"a3": "a33",
    37  	}
    38  	err := ms.Send(endpoint, data)
    39  	if err != nil {
    40  		t.Fatalf("error sending data to webhook endpoint: %v", err)
    41  	}
    42  }
    43  
    44  func TestSendReal(t *testing.T) {
    45  	expectedSig := "004b36ca3fcbc01a08b17bf5d4a7e1aa0b10e14f55f3f8bd9acac0c7e8d2635d"
    46  	secret := "secret456"
    47  	data := map[string]interface{}{
    48  		"key1": "val1",
    49  		"key2": "val2",
    50  		"key3": "val3",
    51  	}
    52  
    53  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    54  		fmt.Println("[test] running the server...")
    55  
    56  		signStartIdx := len(Sha256Prefix) + 1
    57  		sigHeader := r.Header.Get(SignatureHeader)
    58  		gotSig := sigHeader[signStartIdx:]
    59  		if expectedSig != gotSig {
    60  			t.Fatalf("invalid signature received. expected %s got %s", expectedSig, gotSig)
    61  		}
    62  
    63  		ct := r.Header.Get("Content-Type")
    64  		expectedCT := "application/json"
    65  		if ct != expectedCT {
    66  			t.Fatalf("invalid content type. expected %s got %s", ct, expectedCT)
    67  		}
    68  
    69  		body, err := ioutil.ReadAll(r.Body)
    70  		if err != nil {
    71  			t.Fatalf("error reading JSON body from webhook request: %v", err)
    72  		}
    73  
    74  		var payload map[string]interface{}
    75  		err = json.Unmarshal(body, &payload)
    76  		if err != nil {
    77  			t.Fatalf("error unmarshaling webhook payload: %v", err)
    78  		}
    79  		if !reflect.DeepEqual(data, payload) {
    80  			t.Fatalf("invalid payload received. expected %#v got %#v", data, payload)
    81  		}
    82  	}))
    83  
    84  	defer ts.Close()
    85  	endp1 := EndPoint{URL: ts.URL, Secret: secret}
    86  	err := Send(endp1, data)
    87  	if err != nil {
    88  		t.Fatalf("error sending data to webhook endpoint: %v", err)
    89  	}
    90  }
    91  
    92  func TestSignature(t *testing.T) {
    93  	secret := "secret123"
    94  	payload := []byte("some payload456")
    95  	expected := "ab7844c1e9149f8dc976c4188a72163c005930f3c2266a163ffe434230bdf761"
    96  	got, err := sign(secret, payload)
    97  	if err != nil {
    98  		t.Fatalf("error signing payload: %v", err)
    99  	}
   100  	if expected != got {
   101  		t.Fatalf("invalid signature received. expected %s got %s", expected, got)
   102  	}
   103  }