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 }