Files
streamsql/functions/functions_datetime_test.go
2025-06-11 18:45:39 +08:00

239 lines
5.4 KiB
Go

package functions
import (
"testing"
)
func TestDateTimeFunctions(t *testing.T) {
tests := []struct {
name string
function Function
args []interface{}
expected interface{}
wantErr bool
}{
// DateFormatFunction 测试
{
name: "date_format basic",
function: NewDateFormatFunction(),
args: []interface{}{"2023-12-25 15:30:45", "YYYY-MM-DD HH:MI:SS"},
expected: "2023-12-25 15:30:45",
wantErr: false,
},
{
name: "date_format custom",
function: NewDateFormatFunction(),
args: []interface{}{"2023-12-25 15:30:45", "YYYY/MM/DD"},
expected: "2023/12/25",
wantErr: false,
},
// DateAddFunction 测试
{
name: "date_add days",
function: NewDateAddFunction(),
args: []interface{}{"2023-12-25", 7, "days"},
expected: "2024-01-01 00:00:00",
wantErr: false,
},
{
name: "date_add months",
function: NewDateAddFunction(),
args: []interface{}{"2023-12-25", 1, "months"},
expected: "2024-01-25 00:00:00",
wantErr: false,
},
// DateSubFunction 测试
{
name: "date_sub days",
function: NewDateSubFunction(),
args: []interface{}{"2024-01-01", 7, "days"},
expected: "2023-12-25 00:00:00",
wantErr: false,
},
// DateDiffFunction 测试
{
name: "date_diff days",
function: NewDateDiffFunction(),
args: []interface{}{"2024-01-01", "2023-12-25", "days"},
expected: int64(7),
wantErr: false,
},
// YearFunction 测试
{
name: "year extraction",
function: NewYearFunction(),
args: []interface{}{"2023-12-25 15:30:45"},
expected: float64(2023),
wantErr: false,
},
// MonthFunction 测试
{
name: "month extraction",
function: NewMonthFunction(),
args: []interface{}{"2023-12-25 15:30:45"},
expected: float64(12),
wantErr: false,
},
// DayFunction 测试
{
name: "day extraction",
function: NewDayFunction(),
args: []interface{}{"2023-12-25 15:30:45"},
expected: 25,
wantErr: false,
},
// HourFunction 测试
{
name: "hour extraction",
function: NewHourFunction(),
args: []interface{}{"2023-12-25 15:30:45"},
expected: 15,
wantErr: false,
},
// MinuteFunction 测试
{
name: "minute extraction",
function: NewMinuteFunction(),
args: []interface{}{"2023-12-25 15:30:45"},
expected: 30,
wantErr: false,
},
// SecondFunction 测试
{
name: "second extraction",
function: NewSecondFunction(),
args: []interface{}{"2023-12-25 15:30:45"},
expected: 45,
wantErr: false,
},
// UnixTimestampFunction 测试
{
name: "unix_timestamp",
function: NewUnixTimestampFunction(),
args: []interface{}{"2023-01-01 00:00:00"},
expected: int64(1672531200),
wantErr: false,
},
// FromUnixtimeFunction 测试
{
name: "from_unixtime",
function: NewFromUnixtimeFunction(),
args: []interface{}{1672531200},
expected: "2023-01-01 00:00:00",
wantErr: false,
},
// ExtractFunction 测试
{
name: "extract year",
function: NewExtractFunction(),
args: []interface{}{"year", "2023-12-25 15:30:45"},
expected: 2023,
wantErr: false,
},
{
name: "extract month",
function: NewExtractFunction(),
args: []interface{}{"month", "2023-12-25 15:30:45"},
expected: 12,
wantErr: false,
},
// DayOfWeekFunction 测试
{
name: "dayofweek",
function: NewDayOfWeekFunction(),
args: []interface{}{"2023-12-25"},
expected: 1, // Monday
wantErr: false,
},
// DateParseFunction 测试
{
name: "date_parse",
function: NewDateParseFunction(),
args: []interface{}{"2023/12/25", "YYYY/MM/DD"},
expected: "2023-12-25 00:00:00",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// 验证参数
if err := tt.function.Validate(tt.args); err != nil {
if !tt.wantErr {
t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
}
return
}
// 执行函数
result, err := tt.function.Execute(nil, tt.args)
if (err != nil) != tt.wantErr {
t.Errorf("Execute() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !tt.wantErr && result != tt.expected {
t.Errorf("Execute() = %v, want %v", result, tt.expected)
}
})
}
}
func TestDateTimeRegistration(t *testing.T) {
// 测试函数是否正确注册
dateTimeFunctions := []string{
"date_format",
"date_add",
"date_sub",
"date_diff",
"date_parse",
"extract",
"unix_timestamp",
"from_unixtime",
"year",
"month",
"day",
"hour",
"minute",
"second",
"dayofweek",
"dayofyear",
"weekofyear",
}
for _, funcName := range dateTimeFunctions {
t.Run("register_"+funcName, func(t *testing.T) {
func_, exists := Get(funcName)
if !exists {
t.Errorf("Function %s not registered", funcName)
return
}
if func_ == nil {
t.Errorf("Function %s is nil", funcName)
}
})
}
}
func TestDateFormatConversion(t *testing.T) {
tests := []struct {
input string
expected string
}{
{"YYYY-MM-DD", "2006-01-02"},
{"yyyy/mm/dd", "2006/01/02"},
{"DD/MM/YYYY", "02/01/2006"},
{"HH:MI:SS", "15:04:05"},
{"YYYY-MM-DD HH:MI:SS", "2006-01-02 15:04:05"},
}
for _, tt := range tests {
t.Run(tt.input, func(t *testing.T) {
result := convertToGoFormat(tt.input)
if result != tt.expected {
t.Errorf("convertToGoFormat(%s) = %s, want %s", tt.input, result, tt.expected)
}
})
}
}