Files
streamsql/functions/aggregator_adapter_test.go
T
2025-08-08 09:00:02 +08:00

178 lines
5.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package functions
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestAggregatorAdapterBasic 测试聚合器适配器基本功能
func TestAggregatorAdapterBasic(t *testing.T) {
// 测试创建聚合器适配器
adapter, err := NewAggregatorAdapter("sum")
require.NoError(t, err)
require.NotNil(t, adapter)
// 测试GetFunctionName
funcName := adapter.GetFunctionName()
assert.Equal(t, "sum", funcName)
// 测试New方法
newAdapter := adapter.New()
assert.NotNil(t, newAdapter)
// 测试Add和Result方法
adapter.Add(10)
adapter.Add(20)
adapter.Add(30)
result := adapter.Result()
assert.Equal(t, 60.0, result)
// 测试创建不存在的聚合器
_, err = NewAggregatorAdapter("nonexistent")
assert.Error(t, err)
}
// TestAggregatorAdapterWithNilFunction 测试聚合器适配器的nil函数情况
func TestAggregatorAdapterWithNilFunction(t *testing.T) {
adapter := &AggregatorAdapter{aggFunc: nil}
funcName := adapter.GetFunctionName()
assert.Equal(t, "", funcName)
}
// TestAnalyticalAdapterBasic 测试分析函数适配器基本功能
func TestAnalyticalAdapterBasic(t *testing.T) {
// 测试创建分析函数适配器
adapter, err := NewAnalyticalAdapter("latest")
require.NoError(t, err)
require.NotNil(t, adapter)
// 测试Execute方法
ctx := &FunctionContext{
Data: map[string]interface{}{"test": "value"},
}
result, err := adapter.Execute(ctx, []interface{}{"test_value"})
assert.NoError(t, err)
assert.Equal(t, "test_value", result)
// 测试Reset方法
adapter.Reset()
// 测试Clone方法
clonedAdapter := adapter.Clone()
assert.NotNil(t, clonedAdapter)
assert.NotSame(t, adapter, clonedAdapter)
// 测试创建不存在的分析函数
_, err = NewAnalyticalAdapter("nonexistent")
assert.Error(t, err)
}
// TestRegisterAggregatorAdapter 测试注册聚合器适配器
func TestRegisterAggregatorAdapter(t *testing.T) {
// 注册聚合器适配器
err := RegisterAggregatorAdapter("sum")
assert.NoError(t, err)
// 获取聚合器适配器
constructor, exists := GetAggregatorAdapter("sum")
assert.True(t, exists)
assert.NotNil(t, constructor)
// 使用构造函数创建实例
instance := constructor()
assert.NotNil(t, instance)
// 测试不存在的适配器
_, exists = GetAggregatorAdapter("nonexistent")
assert.False(t, exists)
}
// TestRegisterAnalyticalAdapter 测试注册分析函数适配器
func TestRegisterAnalyticalAdapter(t *testing.T) {
// 注册分析函数适配器
err := RegisterAnalyticalAdapter("latest")
assert.NoError(t, err)
// 获取分析函数适配器
constructor, exists := GetAnalyticalAdapter("latest")
assert.True(t, exists)
assert.NotNil(t, constructor)
// 使用构造函数创建实例
instance := constructor()
assert.NotNil(t, instance)
// 测试不存在的适配器
_, exists = GetAnalyticalAdapter("nonexistent")
assert.False(t, exists)
}
// TestCreateBuiltinAggregatorFromFunctions 测试从函数模块创建内置聚合器
func TestCreateBuiltinAggregatorFromFunctions(t *testing.T) {
// 先注册一个适配器
err := RegisterAggregatorAdapter("sum")
assert.NoError(t, err)
// 从注册的适配器创建
aggregator := CreateBuiltinAggregatorFromFunctions("sum")
assert.NotNil(t, aggregator)
// 从未注册的函数直接创建
aggregator2 := CreateBuiltinAggregatorFromFunctions("avg")
assert.NotNil(t, aggregator2)
// 测试不存在的聚合器
aggregator3 := CreateBuiltinAggregatorFromFunctions("nonexistent")
assert.Nil(t, aggregator3)
}
// TestCreateAnalyticalFromFunctions 测试从函数模块创建分析函数
func TestCreateAnalyticalFromFunctions(t *testing.T) {
// 先注册一个适配器
err := RegisterAnalyticalAdapter("latest")
assert.NoError(t, err)
// 从注册的适配器创建
analytical := CreateAnalyticalFromFunctions("latest")
assert.NotNil(t, analytical)
// 从未注册的函数直接创建
analytical2 := CreateAnalyticalFromFunctions("had_changed")
assert.NotNil(t, analytical2)
// 测试不存在的分析函数
analytical3 := CreateAnalyticalFromFunctions("nonexistent")
assert.Nil(t, analytical3)
}
// TestAggregatorAdapterErrorHandling 测试聚合器适配器错误处理
func TestAggregatorAdapterErrorHandling(t *testing.T) {
// 注册一个会失败的适配器(使用不存在的函数名)
err := RegisterAggregatorAdapter("invalid_function")
assert.NoError(t, err)
// 获取并尝试创建实例
constructor, exists := GetAggregatorAdapter("invalid_function")
assert.True(t, exists)
// 创建实例应该返回nil因为函数不存在
instance := constructor()
assert.Nil(t, instance)
}
// TestAnalyticalAdapterErrorHandling 测试分析函数适配器错误处理
func TestAnalyticalAdapterErrorHandling(t *testing.T) {
// 注册一个会失败的适配器(使用不存在的函数名)
err := RegisterAnalyticalAdapter("invalid_analytical")
assert.NoError(t, err)
// 获取并尝试创建实例
constructor, exists := GetAnalyticalAdapter("invalid_analytical")
assert.True(t, exists)
// 创建实例应该返回nil因为函数不存在
instance := constructor()
assert.Nil(t, instance)
}