github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/trigger_test.go (about) 1 package cli 2 3 import ( 4 "context" 5 "fmt" 6 "net" 7 "net/http" 8 "strconv" 9 "testing" 10 11 "github.com/tilt-dev/tilt/internal/testutils" 12 13 "github.com/stretchr/testify/require" 14 "k8s.io/cli-runtime/pkg/genericclioptions" 15 ) 16 17 func TestTriggerSuccess(t *testing.T) { 18 f := newTriggerFixture(t) 19 streams, _, out, errOut := genericclioptions.NewTestIOStreams() 20 cmd := newTriggerCmd(streams) 21 c := cmd.register() 22 err := c.Flags().Parse([]string{"foo"}) 23 require.NoError(t, err) 24 err = cmd.run(f.ctx, c.Flags().Args()) 25 require.NoError(t, err) 26 27 require.Equal(t, "Successfully triggered update for resource: \"foo\"\n", out.String()) 28 require.Equal(t, 0, errOut.Len()) 29 } 30 31 func TestTriggerFailure(t *testing.T) { 32 f := newTriggerFixture(t) 33 f.responseBody = "nothing ever works" 34 streams, _, out, errOut := genericclioptions.NewTestIOStreams() 35 cmd := newTriggerCmd(streams) 36 c := cmd.register() 37 err := c.Flags().Parse([]string{"foo"}) 38 require.NoError(t, err) 39 err = cmd.run(f.ctx, c.Flags().Args()) 40 require.Equal(t, "nothing ever works", err.Error()) 41 42 require.Equal(t, 0, errOut.Len()) 43 require.Equal(t, 0, out.Len()) 44 } 45 46 func TestTriggerNotFound(t *testing.T) { 47 f := newTriggerFixture(t) 48 f.responseBody = "nothing ever works" 49 f.responseStatus = http.StatusNotFound 50 streams, _, out, errOut := genericclioptions.NewTestIOStreams() 51 cmd := newTriggerCmd(streams) 52 c := cmd.register() 53 err := c.Flags().Parse([]string{"foo"}) 54 require.NoError(t, err) 55 err = cmd.run(f.ctx, c.Flags().Args()) 56 require.Equal(t, "(404): nothing ever works", err.Error()) 57 58 require.Equal(t, 0, errOut.Len()) 59 require.Equal(t, 0, out.Len()) 60 } 61 62 type triggerFixture struct { 63 responseBody string 64 responseStatus int 65 ctx context.Context 66 } 67 68 func newTriggerFixture(t *testing.T) *triggerFixture { 69 ctx, _, _ := testutils.CtxAndAnalyticsForTest() 70 f := &triggerFixture{ 71 ctx: ctx, 72 responseStatus: http.StatusOK, 73 } 74 75 l, port := listenOnFreePort(t) 76 origPort := defaultWebPort 77 defaultWebPort = port 78 t.Cleanup(func() { 79 defaultWebPort = origPort 80 }) 81 82 mux := &http.ServeMux{} 83 mux.HandleFunc("/api/trigger", func(w http.ResponseWriter, req *http.Request) { 84 http.Error(w, f.responseBody, f.responseStatus) 85 }) 86 87 srv := &http.Server{ 88 Addr: fmt.Sprintf(":%d", defaultWebPort), 89 Handler: mux, 90 } 91 92 go func() { _ = srv.Serve(l) }() 93 t.Cleanup(func() { 94 _ = srv.Shutdown(ctx) 95 }) 96 97 return f 98 } 99 100 func listenOnFreePort(t *testing.T) (net.Listener, int) { 101 t.Helper() 102 103 l, err := net.Listen("tcp", ":0") 104 require.NoError(t, err) 105 106 _, portString, err := net.SplitHostPort(l.Addr().String()) 107 require.NoError(t, err) 108 109 port, err := strconv.Atoi(portString) 110 require.NoError(t, err) 111 return l, port 112 }