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 }