github.com/nvkalinin/business-calendar@v1.0.2-0.20220515154925-e7df8a3d0c34/cmd/cmd_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/stretchr/testify/require"
     6  	"io"
     7  	"net"
     8  	"net/http"
     9  	"testing"
    10  	"time"
    11  )
    12  
    13  func newApp(t *testing.T, cmdMod func(*Server)) (cmd *Server, app *app, port int) {
    14  	port = unusedPort()
    15  
    16  	cmd = &Server{}
    17  	cmd.SyncOnStart = []string{}
    18  	cmd.Web.Listen = fmt.Sprintf("127.0.0.1:%d", port)
    19  	cmd.Web.AdminPasswd = "pass"
    20  	cmd.Web.ReadTimeout = 5 * time.Second
    21  	cmd.Web.ReadHeaderTimeout = 5 * time.Second
    22  	cmd.Web.WriteTimeout = 5 * time.Second
    23  	cmd.Web.IdleTimeout = 30 * time.Second
    24  	cmd.Web.RateLimiter.ReqLimit = 100
    25  	cmd.Web.RateLimiter.LimitWindow = 1 * time.Second
    26  	cmd.Store.Engine = EngineType("memory")
    27  	cmd.Source.Parser = ParserType("none")
    28  	if cmdMod != nil {
    29  		cmdMod(cmd)
    30  	}
    31  
    32  	var err error
    33  	app, err = cmd.makeApp()
    34  	require.NoError(t, err)
    35  
    36  	return cmd, app, port
    37  }
    38  
    39  func unusedPort() int {
    40  	l, err := net.Listen("tcp", "127.0.0.1:0")
    41  	if err != nil {
    42  		panic(err)
    43  	}
    44  	defer func() {
    45  		if err := l.Close(); err != nil {
    46  			panic(err)
    47  		}
    48  	}()
    49  
    50  	return l.Addr().(*net.TCPAddr).Port
    51  }
    52  
    53  func waitForHTTP(port int) {
    54  	for i := 0; i < 100; i++ {
    55  		time.Sleep(50 * time.Millisecond)
    56  		if resp, err := http.Get(fmt.Sprintf("http://localhost:%d", port)); err == nil {
    57  			resp.Body.Close()
    58  			return
    59  		}
    60  	}
    61  	panic(fmt.Sprintf("cannot connect to localhost:%d", port))
    62  }
    63  
    64  func getBody(t *testing.T, url string) (int, string) {
    65  	resp, err := http.Get(url)
    66  	require.NoError(t, err)
    67  	defer resp.Body.Close()
    68  	json, err := io.ReadAll(resp.Body)
    69  	require.NoError(t, err)
    70  	return resp.StatusCode, string(json)
    71  }