Files
chaisql/internal/database/constraint_test.go
2025-09-14 11:55:27 +05:30

88 lines
2.9 KiB
Go

package database_test
import (
"testing"
"github.com/chaisql/chai/internal/database"
"github.com/chaisql/chai/internal/expr"
"github.com/chaisql/chai/internal/expr/functions"
"github.com/chaisql/chai/internal/testutil"
"github.com/chaisql/chai/internal/types"
"github.com/stretchr/testify/require"
)
func TestColumnConstraintsAdd(t *testing.T) {
tests := []struct {
name string
got []*database.ColumnConstraint
add database.ColumnConstraint
want []*database.ColumnConstraint
fails bool
}{
{
"Same path",
[]*database.ColumnConstraint{{Column: "a", Type: types.TypeInteger}},
database.ColumnConstraint{Column: "a", Type: types.TypeInteger},
nil,
true,
},
{
"Different path",
[]*database.ColumnConstraint{{Column: "a", Type: types.TypeInteger}},
database.ColumnConstraint{Column: "b", Type: types.TypeInteger},
[]*database.ColumnConstraint{
{Position: 0, Column: "a", Type: types.TypeInteger},
{Position: 1, Column: "b", Type: types.TypeInteger},
},
false,
},
{
"Default value conversion, typed constraint",
[]*database.ColumnConstraint{{Column: "a", Type: types.TypeInteger}},
database.ColumnConstraint{Column: "b", Type: types.TypeInteger, DefaultValue: expr.Constraint(testutil.DoubleValue(5))},
[]*database.ColumnConstraint{
{Position: 0, Column: "a", Type: types.TypeInteger},
{Position: 1, Column: "b", Type: types.TypeInteger, DefaultValue: expr.Constraint(testutil.DoubleValue(5))},
},
false,
},
{
"Default value conversion, typed constraint, nextval",
[]*database.ColumnConstraint{{Column: "a", Type: types.TypeInteger}},
database.ColumnConstraint{Column: "b", Type: types.TypeInteger, DefaultValue: expr.Constraint(&functions.NextVal{Expr: testutil.TextValue("seq")})},
[]*database.ColumnConstraint{
{Position: 0, Column: "a", Type: types.TypeInteger},
{Position: 1, Column: "b", Type: types.TypeInteger, DefaultValue: expr.Constraint(&functions.NextVal{Expr: testutil.TextValue("seq")})},
},
false,
},
{
"Default value conversion, typed constraint, nextval with bytea",
[]*database.ColumnConstraint{{Column: "a", Type: types.TypeInteger}},
database.ColumnConstraint{Column: "b", Type: types.TypeBytea, DefaultValue: expr.Constraint(&functions.NextVal{Expr: testutil.TextValue("seq")})},
nil,
true,
},
{
"Default value conversion, typed constraint, incompatible value",
[]*database.ColumnConstraint{{Column: "a", Type: types.TypeInteger}},
database.ColumnConstraint{Column: "b", Type: types.TypeDouble, DefaultValue: expr.Constraint(testutil.BoolValue(true))},
nil,
true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
fcs := database.MustNewColumnConstraints(test.got...)
err := fcs.Add(&test.add)
if test.fails {
require.Error(t, err)
} else {
require.NoError(t, err)
require.Equal(t, test.want, fcs.Ordered)
}
})
}
}