Files
streamsql/streamsql_validation_test.go
2025-06-11 18:44:41 +08:00

78 lines
2.2 KiB
Go

package streamsql
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestFunctionValidationIntegration(t *testing.T) {
tests := []struct {
name string
sql string
expectError bool
errorContains string
}{
{
name: "Valid builtin function in SELECT",
sql: "SELECT abs(temperature) FROM stream",
expectError: false,
},
{
name: "Unknown function in SELECT",
sql: "SELECT unknown_func(temperature) FROM stream",
expectError: true,
errorContains: "unknown_func",
},
{
name: "Unknown function in WHERE",
sql: "SELECT temperature FROM stream WHERE unknown_func(temperature) > 0",
expectError: true,
errorContains: "unknown_func",
},
{
name: "Unknown function in HAVING",
sql: "SELECT temperature FROM stream GROUP BY device HAVING unknown_func(temperature) > 0",
expectError: true,
errorContains: "unknown_func",
},
{
name: "Valid nested functions",
sql: "SELECT sqrt(abs(temperature)) FROM stream",
expectError: false,
},
{
name: "Mixed valid and invalid functions",
sql: "SELECT abs(temperature), unknown_func(humidity) FROM stream",
expectError: true,
errorContains: "unknown_func",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ssql := New()
err := ssql.Execute(tt.sql)
if tt.expectError {
assert.Error(t, err, "Expected error for SQL: %s", tt.sql)
if tt.errorContains != "" {
assert.Contains(t, err.Error(), tt.errorContains, "Error should contain: %s", tt.errorContains)
}
} else {
assert.NoError(t, err, "Expected no error for SQL: %s", tt.sql)
}
})
}
}
func TestFunctionValidationWithCustomFunctions(t *testing.T) {
// 测试自定义函数注册后的验证
sql := "SELECT custom_func(temperature) FROM stream"
// 在没有注册自定义函数时应该报错
ssql := New()
err := ssql.Execute(sql)
assert.Error(t, err, "Should error when custom function is not registered")
assert.Contains(t, err.Error(), "custom_func", "Error should mention the unknown function")
}