Files
zitadel/backend/v3/storage/database/statement_test.go
T

139 lines
3.5 KiB
Go

package database
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestStatementBuilder_AppendArg(t *testing.T) {
t.Run("same arg returns different placeholder", func(t *testing.T) {
var b StatementBuilder
placeholder1 := b.AppendArg("same")
placeholder2 := b.AppendArg("same")
assert.NotEqual(t, placeholder1, placeholder2)
assert.Len(t, b.Args(), 2)
})
t.Run("same arg different types", func(t *testing.T) {
var b StatementBuilder
placeholder1 := b.AppendArg("same")
placeholder2 := b.AppendArg([]byte("same"))
placeholder3 := b.AppendArg("same")
assert.NotEqual(t, placeholder1, placeholder2)
assert.NotEqual(t, placeholder1, placeholder3)
assert.Len(t, b.Args(), 3)
})
t.Run("Instruction args are always different", func(t *testing.T) {
var b StatementBuilder
placeholder1 := b.AppendArg(DefaultInstruction)
placeholder2 := b.AppendArg(DefaultInstruction)
assert.Equal(t, placeholder1, placeholder2)
assert.Len(t, b.Args(), 0)
})
}
func TestStatementBuilder_AppendArgs(t *testing.T) {
t.Run("same arg returns different placeholder", func(t *testing.T) {
var b StatementBuilder
b.AppendArgs("same", "same")
assert.Len(t, b.Args(), 2)
})
t.Run("same arg different types", func(t *testing.T) {
var b StatementBuilder
b.AppendArgs("same", []byte("same"), "same")
assert.Len(t, b.Args(), 3)
})
t.Run("Instruction args are always different", func(t *testing.T) {
var b StatementBuilder
b.AppendArgs(DefaultInstruction, DefaultInstruction)
assert.Len(t, b.Args(), 0)
})
}
func TestStatementBuilder_WriteArg(t *testing.T) {
for _, test := range []struct {
name string
arg any
wantSQL string
wantArg []any
}{
{
name: "primitive arg",
arg: "test",
wantSQL: "$1",
wantArg: []any{"test"},
},
{
name: "argWriter arg",
arg: SHA256Value("wrapped"),
wantSQL: "SHA256($1)",
wantArg: []any{"wrapped"},
},
{
name: "Instruction arg",
arg: DefaultInstruction,
wantSQL: "DEFAULT",
wantArg: []any{},
},
} {
t.Run(test.name, func(t *testing.T) {
var b StatementBuilder
b.WriteArg(test.arg)
assert.Equal(t, test.wantSQL, b.String())
require.Len(t, b.Args(), len(test.wantArg))
for i := range test.wantArg {
assert.Equal(t, test.wantArg[i], b.Args()[i])
}
})
}
}
func TestStatementBuilder_WriteArgs(t *testing.T) {
for _, test := range []struct {
name string
args []any
wantSQL string
wantArg []any
}{
{
name: "primitive args",
args: []any{"test", 123, true, uint32(123)},
wantSQL: "$1, $2, $3, $4",
wantArg: []any{"test", 123, true, uint32(123)},
},
{
name: "argWriter args",
args: []any{SHA256Value("wrapped"), LowerValue("ASDF")},
wantSQL: "SHA256($1), LOWER($2)",
wantArg: []any{"wrapped", "ASDF"},
},
{
name: "Instruction args",
args: []any{DefaultInstruction, NowInstruction, NullInstruction},
wantSQL: "DEFAULT, NOW(), NULL",
wantArg: []any{},
},
{
name: "mixed args",
args: []any{123, uint32(123), NowInstruction, NullInstruction, SHA256Value("wrapped"), LowerValue("ASDF")},
wantSQL: "$1, $2, NOW(), NULL, SHA256($3), LOWER($4)",
wantArg: []any{123, uint32(123), "wrapped", "ASDF"},
},
} {
t.Run(test.name, func(t *testing.T) {
var b StatementBuilder
b.WriteArgs(test.args...)
assert.Equal(t, test.wantSQL, b.String())
require.Len(t, b.Args(), len(test.wantArg))
for i := range test.wantArg {
assert.Equal(t, test.wantArg[i], b.Args()[i])
}
})
}
}