github.com/Jeffail/benthos/v3@v3.65.0/internal/bloblang/query/parsed_test.go (about)

     1  package query_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/Jeffail/benthos/v3/internal/bloblang"
    10  	"github.com/Jeffail/benthos/v3/internal/bloblang/query"
    11  	"github.com/Jeffail/benthos/v3/lib/message"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  
    15  	_ "github.com/Jeffail/benthos/v3/public/components/all"
    16  )
    17  
    18  func TestFunctionExamples(t *testing.T) {
    19  	tmpJSONFile, err := os.CreateTemp("", "benthos_bloblang_functions_test")
    20  	require.NoError(t, err)
    21  	t.Cleanup(func() {
    22  		os.Remove(tmpJSONFile.Name())
    23  	})
    24  
    25  	_, err = tmpJSONFile.WriteString(`{"foo":"bar"}`)
    26  	require.NoError(t, err)
    27  
    28  	key := "BENTHOS_TEST_BLOBLANG_FILE"
    29  	os.Setenv(key, tmpJSONFile.Name())
    30  	t.Cleanup(func() {
    31  		os.Unsetenv(key)
    32  	})
    33  
    34  	for _, spec := range query.FunctionDocs() {
    35  		spec := spec
    36  		t.Run(spec.Name, func(t *testing.T) {
    37  			t.Parallel()
    38  			for i, e := range spec.Examples {
    39  				m, err := bloblang.GlobalEnvironment().NewMapping(e.Mapping)
    40  				require.NoError(t, err)
    41  
    42  				for j, io := range e.Results {
    43  					msg := message.New([][]byte{[]byte(io[0])})
    44  					p, err := m.MapPart(0, msg)
    45  					exp := io[1]
    46  					if strings.HasPrefix(exp, "Error(") {
    47  						exp = exp[7 : len(exp)-2]
    48  						require.EqualError(t, err, exp, fmt.Sprintf("%v-%v", i, j))
    49  					} else {
    50  						require.NoError(t, err)
    51  						assert.Equal(t, exp, string(p.Get()), fmt.Sprintf("%v-%v", i, j))
    52  					}
    53  				}
    54  			}
    55  		})
    56  	}
    57  }
    58  
    59  func TestMethodExamples(t *testing.T) {
    60  	tmpJSONFile, err := os.CreateTemp("", "benthos_bloblang_methods_test")
    61  	require.NoError(t, err)
    62  	t.Cleanup(func() {
    63  		os.Remove(tmpJSONFile.Name())
    64  	})
    65  
    66  	_, err = tmpJSONFile.WriteString(`
    67    "type":"object",
    68    "properties":{
    69      "foo":{
    70        "type":"string"
    71      }
    72    }
    73  }`)
    74  	require.NoError(t, err)
    75  
    76  	key := "BENTHOS_TEST_BLOBLANG_SCHEMA_FILE"
    77  	os.Setenv(key, tmpJSONFile.Name())
    78  	t.Cleanup(func() {
    79  		os.Unsetenv(key)
    80  	})
    81  
    82  	for _, spec := range query.MethodDocs() {
    83  		spec := spec
    84  		t.Run(spec.Name, func(t *testing.T) {
    85  			t.Parallel()
    86  			for i, e := range spec.Examples {
    87  				m, err := bloblang.GlobalEnvironment().NewMapping(e.Mapping)
    88  				require.NoError(t, err)
    89  
    90  				for j, io := range e.Results {
    91  					msg := message.New([][]byte{[]byte(io[0])})
    92  					p, err := m.MapPart(0, msg)
    93  					exp := io[1]
    94  					if strings.HasPrefix(exp, "Error(") {
    95  						exp = exp[7 : len(exp)-2]
    96  						require.EqualError(t, err, exp, fmt.Sprintf("%v-%v", i, j))
    97  					} else if exp == "<Message deleted>" {
    98  						require.NoError(t, err)
    99  						require.Nil(t, p)
   100  					} else {
   101  						require.NoError(t, err)
   102  						assert.Equal(t, exp, string(p.Get()), fmt.Sprintf("%v-%v", i, j))
   103  					}
   104  				}
   105  			}
   106  			for _, target := range spec.Categories {
   107  				for i, e := range target.Examples {
   108  					m, err := bloblang.GlobalEnvironment().NewMapping(e.Mapping)
   109  					require.NoError(t, err)
   110  
   111  					for j, io := range e.Results {
   112  						msg := message.New([][]byte{[]byte(io[0])})
   113  						p, err := m.MapPart(0, msg)
   114  						exp := io[1]
   115  						if strings.HasPrefix(exp, "Error(") {
   116  							exp = exp[7 : len(exp)-2]
   117  							require.EqualError(t, err, exp, fmt.Sprintf("%v-%v-%v", target.Category, i, j))
   118  						} else {
   119  							require.NoError(t, err)
   120  							assert.Equal(t, exp, string(p.Get()), fmt.Sprintf("%v-%v-%v", target.Category, i, j))
   121  						}
   122  					}
   123  				}
   124  			}
   125  		})
   126  	}
   127  }
   128  
   129  func TestMappings(t *testing.T) {
   130  	tests := []struct {
   131  		name         string
   132  		mapping      string
   133  		inputOutputs [][2]string
   134  	}{
   135  		{
   136  			name:    "format_timestamp one nameless arg",
   137  			mapping: `root.something_at = this.created_at.format_timestamp("2006-Jan-02 15:04:05")`,
   138  			inputOutputs: [][2]string{
   139  				{
   140  					`{"created_at":"2020-08-14T11:50:26.371Z"}`,
   141  					`{"something_at":"2020-Aug-14 11:50:26"}`,
   142  				},
   143  			},
   144  		},
   145  		{
   146  			name:    "format_timestamp both nameless args",
   147  			mapping: `root.something_at = this.created_at.format_timestamp("2006-Jan-02 15:04:05", "America/New_York")`,
   148  			inputOutputs: [][2]string{
   149  				{
   150  					`{"created_at":1597405526}`,
   151  					`{"something_at":"2020-Aug-14 07:45:26"}`,
   152  				},
   153  				{
   154  					`{"created_at":"2020-08-14T11:50:26.371Z"}`,
   155  					`{"something_at":"2020-Aug-14 07:50:26"}`,
   156  				},
   157  			},
   158  		},
   159  	}
   160  
   161  	for _, test := range tests {
   162  		t.Run(test.name, func(t *testing.T) {
   163  			m, err := bloblang.GlobalEnvironment().NewMapping(test.mapping)
   164  			require.NoError(t, err)
   165  
   166  			for i, io := range test.inputOutputs {
   167  				msg := message.New([][]byte{[]byte(io[0])})
   168  				p, err := m.MapPart(0, msg)
   169  				exp := io[1]
   170  				if strings.HasPrefix(exp, "Error(") {
   171  					exp = exp[7 : len(exp)-2]
   172  					require.EqualError(t, err, exp, fmt.Sprintf("%v", i))
   173  				} else if exp == "<Message deleted>" {
   174  					require.NoError(t, err)
   175  					require.Nil(t, p)
   176  				} else {
   177  					require.NoError(t, err)
   178  					assert.Equal(t, exp, string(p.Get()), fmt.Sprintf("%v", i))
   179  				}
   180  			}
   181  		})
   182  	}
   183  }