yao/job/data_internal_test.go
Max 8786aa9a6a feat(database): add PostgreSQL support and enhance JSON handling
- Updated database configuration to include PostgreSQL 14.0 in CI workflows.
- Enhanced JSON null detection in the Xun store to support PostgreSQL dialect.
- Refactored time conversion utilities to handle multiple database formats, including PostgreSQL.
- Improved cleanup logic in the DataCleaner to ensure proper order of operations for referential integrity.
- Added utility functions for converting between Unix timestamps and database timestamps.
2026-04-06 02:56:04 +08:00

97 lines
2.6 KiB
Go

package job
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/yaoapp/kun/maps"
)
func TestMapToStructBooleanFields(t *testing.T) {
tests := []struct {
name string
key string
value interface{}
expected bool
}{
{"bool true", "enabled", true, true},
{"bool false", "enabled", false, false},
{"string true", "enabled", "true", true},
{"string 1", "enabled", "1", true},
{"string t (PG)", "enabled", "t", true},
{"string false", "enabled", "false", false},
{"string 0", "enabled", "0", false},
{"string f (PG)", "enabled", "f", false},
{"int 1", "enabled", int(1), true},
{"int 0", "enabled", int(0), false},
{"int64 1", "enabled", int64(1), true},
{"int64 0", "enabled", int64(0), false},
{"float64 1", "enabled", float64(1), true},
{"float64 0", "enabled", float64(0), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
m := maps.MapStr{tt.key: tt.value}
job := &Job{}
err := mapToStruct(m, job)
assert.NoError(t, err)
assert.Equal(t, tt.expected, job.Enabled, "field %s with value %v", tt.key, tt.value)
})
}
t.Run("system field", func(t *testing.T) {
m := maps.MapStr{"system": "t"}
job := &Job{}
err := mapToStruct(m, job)
assert.NoError(t, err)
assert.True(t, job.System)
})
t.Run("readonly field", func(t *testing.T) {
m := maps.MapStr{"readonly": "1"}
job := &Job{}
err := mapToStruct(m, job)
assert.NoError(t, err)
assert.True(t, job.Readonly)
})
}
func TestMapToStructTimeFields(t *testing.T) {
refTime := time.Date(2024, 6, 15, 10, 30, 45, 0, time.UTC)
tests := []struct {
name string
input string
parsed bool
}{
{"MySQL format", "2024-06-15 10:30:45", true},
{"PG fractional", "2024-06-15 10:30:45.123456", true},
{"PG with +00", "2024-06-15 10:30:45.123456+00", true},
{"PG with -07", "2024-06-15 03:30:45.123456-07", true},
{"RFC3339", "2024-06-15T10:30:45Z", true},
{"RFC3339Nano", "2024-06-15T10:30:45.123456789Z", true},
{"empty string", "", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
m := maps.MapStr{
"name": "test-job",
"job_id": "j-123",
"created_at": tt.input,
}
job := &Job{}
err := mapToStruct(m, job)
if tt.parsed {
assert.NoError(t, err)
assert.False(t, job.CreatedAt.IsZero(), "expected non-zero time for input: %s", tt.input)
assert.Equal(t, refTime.Unix(), job.CreatedAt.Unix(),
"expected %v, got %v for input: %s", refTime, job.CreatedAt, tt.input)
} else {
assert.True(t, job.CreatedAt.IsZero())
}
})
}
}