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  }