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 }