github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/starkit/set_state_test.go (about)

     1  package starkit
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	"go.starlark.net/starlark"
     9  )
    10  
    11  func TestNormal(t *testing.T) {
    12  	f := newSetStateFixture(t)
    13  	f.File("Tiltfile", `
    14  set_setting(3)
    15  `)
    16  	result, err := f.ExecFile("Tiltfile")
    17  	require.NoError(t, err)
    18  	require.Equal(t, 3, mustState(result).hello)
    19  }
    20  
    21  func TestError(t *testing.T) {
    22  	f := newSetStateFixture(t)
    23  	f.File("Tiltfile", `
    24  set_setting(4)
    25  `)
    26  	result, err := f.ExecFile("Tiltfile")
    27  	require.Error(t, err)
    28  	require.Contains(t, err.Error(), "hello == 4!")
    29  	require.Equal(t, 0, mustState(result).hello)
    30  }
    31  
    32  type settings struct {
    33  	hello int
    34  }
    35  
    36  type testPlugin struct {
    37  }
    38  
    39  func newTestPlugin() testPlugin {
    40  	return testPlugin{}
    41  }
    42  
    43  func (e testPlugin) NewState() interface{} {
    44  	return settings{}
    45  }
    46  
    47  func (testPlugin) OnStart(env *Environment) error {
    48  	return env.AddBuiltin("set_setting", setSetting)
    49  }
    50  
    51  func setSetting(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
    52  	var hello int
    53  	err := UnpackArgs(thread, fn.Name(), args, kwargs, "hello", &hello)
    54  	if err != nil {
    55  		return starlark.None, err
    56  	}
    57  
    58  	err = SetState(thread, func(settings settings) (settings, error) {
    59  		settings.hello = hello
    60  		if hello == 4 {
    61  			return settings, errors.New("hello == 4!")
    62  		}
    63  		return settings, nil
    64  	})
    65  
    66  	return starlark.None, err
    67  }
    68  
    69  var _ StatefulPlugin = testPlugin{}
    70  
    71  func mustState(m Model) settings {
    72  	var state settings
    73  	err := m.Load(&state)
    74  	if err != nil {
    75  		panic(err)
    76  	}
    77  	return state
    78  }
    79  
    80  func newSetStateFixture(tb testing.TB) *Fixture {
    81  	return NewFixture(tb, newTestPlugin())
    82  }