github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/get_test.go (about)

     1  package cli
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"path/filepath"
     7  	"strconv"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    13  	"k8s.io/cli-runtime/pkg/genericclioptions"
    14  	"k8s.io/kubectl/pkg/cmd/util"
    15  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
    16  
    17  	"github.com/tilt-dev/tilt-apiserver/pkg/server/testdata"
    18  	"github.com/tilt-dev/tilt/internal/hud/server"
    19  	"github.com/tilt-dev/tilt/internal/store"
    20  	"github.com/tilt-dev/tilt/internal/testutils"
    21  	"github.com/tilt-dev/tilt/internal/testutils/tempdir"
    22  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    23  	"github.com/tilt-dev/tilt/pkg/assets"
    24  	"github.com/tilt-dev/tilt/pkg/model"
    25  	"github.com/tilt-dev/wmclient/pkg/analytics"
    26  	"github.com/tilt-dev/wmclient/pkg/dirs"
    27  )
    28  
    29  func TestGet(t *testing.T) {
    30  	f := newServerFixture(t)
    31  
    32  	err := f.client.Create(f.ctx, &v1alpha1.Cmd{
    33  		ObjectMeta: metav1.ObjectMeta{Name: "my-sleep"},
    34  		Spec: v1alpha1.CmdSpec{
    35  			Args: []string{"sleep", "1"},
    36  		},
    37  	})
    38  	require.NoError(t, err)
    39  
    40  	streams, _, out, _ := genericclioptions.NewTestIOStreams()
    41  	get := newGetCmd(streams)
    42  	get.register()
    43  
    44  	err = get.run(f.ctx, []string{"cmd", "my-sleep"})
    45  	require.NoError(t, err)
    46  
    47  	assert.Contains(t, out.String(), `NAME       CREATED AT
    48  my-sleep`)
    49  }
    50  
    51  type staticConnProvider struct {
    52  	l net.Listener
    53  }
    54  
    55  func newStaticConnProvider(t testing.TB) *staticConnProvider {
    56  	l, err := net.Listen("tcp", "localhost:0")
    57  	require.NoError(t, err)
    58  	return &staticConnProvider{l: l}
    59  }
    60  
    61  func (p *staticConnProvider) Dial(network, address string) (net.Conn, error) {
    62  	return net.Dial(network, p.l.Addr().String())
    63  }
    64  func (p *staticConnProvider) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
    65  	return (&net.Dialer{}).DialContext(ctx, network, p.l.Addr().String())
    66  }
    67  func (p *staticConnProvider) Listen(network, address string) (net.Listener, error) {
    68  	return p.l, nil
    69  }
    70  
    71  type serverFixture struct {
    72  	*tempdir.TempDirFixture
    73  	ctx       context.Context
    74  	cancel    func()
    75  	hudsc     *server.HeadsUpServerController
    76  	client    ctrlclient.Client
    77  	analytics *analytics.MemoryAnalytics
    78  
    79  	origPort int
    80  }
    81  
    82  func newServerFixture(t *testing.T) *serverFixture {
    83  	f := tempdir.NewTempDirFixture(t)
    84  	util.BehaviorOnFatal(func(err string, code int) {
    85  		t.Fatal(err)
    86  	})
    87  
    88  	dir := dirs.NewTiltDevDirAt(f.Path())
    89  
    90  	ctx, a, _ := testutils.CtxAndAnalyticsForTest()
    91  	ctx, cancel := context.WithCancel(ctx)
    92  	apiConnProvider := newStaticConnProvider(t)
    93  	_, apiPortString, _ := net.SplitHostPort(apiConnProvider.l.Addr().String())
    94  	apiPort, err := strconv.Atoi(apiPortString)
    95  	require.NoError(t, err)
    96  	cfg, err := server.ProvideTiltServerOptions(ctx, model.TiltBuild{}, apiConnProvider,
    97  		"corgi-charge", testdata.CertKey(), server.APIServerPort(apiPort))
    98  	require.NoError(t, err)
    99  
   100  	webListener, err := server.ProvideWebListener("localhost", model.WebPort(0))
   101  	require.NoError(t, err)
   102  
   103  	_, webPortString, _ := net.SplitHostPort(webListener.Addr().String())
   104  	webPort, err := strconv.Atoi(webPortString)
   105  	require.NoError(t, err)
   106  
   107  	cfgAccess := server.ProvideConfigAccess(dir)
   108  	hudsc := server.ProvideHeadsUpServerController(cfgAccess, model.ProvideAPIServerName(model.WebPort(webPort)),
   109  		webListener, cfg, &server.HeadsUpServer{}, assets.NewFakeServer(), model.WebURL{})
   110  	st := store.NewTestingStore()
   111  	require.NoError(t, hudsc.SetUp(ctx, st))
   112  
   113  	scheme := v1alpha1.NewScheme()
   114  	client, err := ctrlclient.New(cfg.GenericConfig.LoopbackClientConfig, ctrlclient.Options{Scheme: scheme})
   115  	require.NoError(t, err)
   116  
   117  	t.Setenv("TILT_CONFIG", filepath.Join(f.Path(), "config"))
   118  
   119  	origPort := defaultWebPort
   120  	defaultWebPort = webPort
   121  
   122  	ret := &serverFixture{
   123  		TempDirFixture: f,
   124  		ctx:            ctx,
   125  		cancel:         cancel,
   126  		hudsc:          hudsc,
   127  		client:         client,
   128  		origPort:       origPort,
   129  		analytics:      a,
   130  	}
   131  
   132  	t.Cleanup(ret.TearDown)
   133  	return ret
   134  }
   135  
   136  func (f *serverFixture) TearDown() {
   137  	f.hudsc.TearDown(f.ctx)
   138  	f.cancel()
   139  	defaultWebPort = f.origPort
   140  	util.DefaultBehaviorOnFatal()
   141  }