github.com/rudderlabs/rudder-go-kit@v0.30.0/testhelper/httptest/httptest_test.go (about)

     1  package httptest_test
     2  
     3  import (
     4  	"io"
     5  	"net"
     6  	"net/http"
     7  	"net/url"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/rudderlabs/rudder-go-kit/httputil"
    14  	kithttptest "github.com/rudderlabs/rudder-go-kit/testhelper/httptest"
    15  )
    16  
    17  func TestServer(t *testing.T) {
    18  	httpServer := kithttptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    19  		_, _ = w.Write([]byte("Hello, world!"))
    20  	}))
    21  	defer httpServer.Close()
    22  
    23  	httpServerParsedURL, err := url.Parse(httpServer.URL)
    24  	require.NoError(t, err)
    25  
    26  	_, httpServerPort, err := net.SplitHostPort(httpServerParsedURL.Host)
    27  	require.NoError(t, err)
    28  
    29  	var (
    30  		body       []byte
    31  		statusCode int
    32  	)
    33  	require.Eventually(t, func() bool {
    34  		resp, err := http.Get("http://0.0.0.0:" + httpServerPort)
    35  		defer func() { httputil.CloseResponse(resp) }()
    36  		if err == nil {
    37  			statusCode = resp.StatusCode
    38  			body, err = io.ReadAll(resp.Body)
    39  		}
    40  		return err == nil
    41  	}, 5*time.Second, 10*time.Millisecond, "failed to connect to proxy")
    42  
    43  	require.Equal(t, http.StatusOK, statusCode)
    44  	require.Equal(t, "Hello, world!", string(body))
    45  }
    46  
    47  func TestUnStartedServer(t *testing.T) {
    48  	// create a server which is not started
    49  	httpUnStartedServer := kithttptest.NewUnStartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    50  		_, _ = w.Write([]byte("Hello, world!"))
    51  	}))
    52  
    53  	var (
    54  		body       []byte
    55  		statusCode int
    56  	)
    57  	require.Never(t, func() bool {
    58  		resp, err := http.Get("http://" + httpUnStartedServer.Listener.Addr().String())
    59  		defer func() { httputil.CloseResponse(resp) }()
    60  		return err == nil
    61  	}, 5*time.Second, 10*time.Millisecond, "connected to an un-started server")
    62  
    63  	// start the server now
    64  	httpUnStartedServer.Start()
    65  	defer httpUnStartedServer.Close()
    66  
    67  	require.Eventually(t, func() bool {
    68  		resp, err := http.Get(httpUnStartedServer.URL)
    69  		defer func() { httputil.CloseResponse(resp) }()
    70  		if err == nil {
    71  			statusCode = resp.StatusCode
    72  			body, err = io.ReadAll(resp.Body)
    73  		}
    74  		return err == nil
    75  	}, 2*time.Second, 100*time.Millisecond, "failed to connect to server")
    76  
    77  	require.Equal(t, http.StatusOK, statusCode)
    78  	require.Equal(t, "Hello, world!", string(body))
    79  }