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  }