github.com/Jeffail/benthos/v3@v3.65.0/public/bloblang/environment_test.go (about) 1 package bloblang 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestEnvironment(t *testing.T) { 11 env1, env2 := NewEnvironment(), NewEnvironment() 12 13 require.NoError(t, env1.RegisterMethod("foo", func(_ ...interface{}) (Method, error) { 14 return StringMethod(func(s string) (interface{}, error) { 15 return "foo:" + s, nil 16 }), nil 17 })) 18 19 require.NoError(t, env2.RegisterFunction("bar", func(_ ...interface{}) (Function, error) { 20 return func() (interface{}, error) { 21 return "bar", nil 22 }, nil 23 })) 24 25 _, err := env1.Parse(`root = bar()`) 26 assert.EqualError(t, err, "unrecognised function 'bar': bar()") 27 28 exe, err := env1.Parse(`root = "bar".foo()`) 29 require.NoError(t, err) 30 31 v, err := exe.Query(nil) 32 require.NoError(t, err) 33 assert.Equal(t, "foo:bar", v) 34 35 _, err = env2.Parse(`root = "bar".foo()`) 36 assert.EqualError(t, err, "unrecognised method 'foo': foo()") 37 38 exe, err = env2.Parse(`root = bar()`) 39 require.NoError(t, err) 40 41 v, err = exe.Query(nil) 42 require.NoError(t, err) 43 assert.Equal(t, "bar", v) 44 } 45 46 func TestEnvironmentV2(t *testing.T) { 47 env1, env2 := NewEnvironment(), NewEnvironment() 48 49 require.NoError(t, env1.RegisterMethodV2("foo", NewPluginSpec(), func(_ *ParsedParams) (Method, error) { 50 return StringMethod(func(s string) (interface{}, error) { 51 return "foo:" + s, nil 52 }), nil 53 })) 54 55 require.NoError(t, env2.RegisterFunctionV2("bar", NewPluginSpec(), func(_ *ParsedParams) (Function, error) { 56 return func() (interface{}, error) { 57 return "bar", nil 58 }, nil 59 })) 60 61 _, err := env1.Parse(`root = bar()`) 62 assert.EqualError(t, err, "unrecognised function 'bar': bar()") 63 64 exe, err := env1.Parse(`root = "bar".foo()`) 65 require.NoError(t, err) 66 67 v, err := exe.Query(nil) 68 require.NoError(t, err) 69 assert.Equal(t, "foo:bar", v) 70 71 _, err = env2.Parse(`root = "bar".foo()`) 72 assert.EqualError(t, err, "unrecognised method 'foo': foo()") 73 74 exe, err = env2.Parse(`root = bar()`) 75 require.NoError(t, err) 76 77 v, err = exe.Query(nil) 78 require.NoError(t, err) 79 assert.Equal(t, "bar", v) 80 } 81 82 func TestEmptyEnvironment(t *testing.T) { 83 env := NewEmptyEnvironment() 84 85 env.RegisterMethod("foo", func(_ ...interface{}) (Method, error) { 86 return StringMethod(func(s string) (interface{}, error) { 87 return "foo:" + s, nil 88 }), nil 89 }) 90 91 _, err := env.Parse(`root = now()`) 92 assert.EqualError(t, err, "unrecognised function 'now': now()") 93 94 exe, err := env.Parse(`root = "hello world".foo()`) 95 require.NoError(t, err) 96 97 v, err := exe.Query(nil) 98 require.NoError(t, err) 99 assert.Equal(t, "foo:hello world", v) 100 } 101 102 func TestEnvironmentDisabledImports(t *testing.T) { 103 env := NewEmptyEnvironment().WithDisabledImports() 104 105 _, err := env.Parse(`from "/tmp/foo.blobl"`) 106 require.Error(t, err) 107 assert.Contains(t, err.Error(), "imports are disabled in this context") 108 }