Files
kandev/apps/backend/internal/db/dialect/schema_test.go
T
2026-09-07 19:28:31 +01:00

83 lines
2.8 KiB
Go

package dialect
import (
"strings"
"testing"
)
func TestRenderSchema(t *testing.T) {
schema := `CREATE TABLE example (
id {{identity}} PRIMARY KEY,
enabled {{bool}} NOT NULL DEFAULT 0,
created_at {{timestamp}} NOT NULL DEFAULT {{current_time}}
)`
sqlite, err := RenderSchema(SQLite3, schema)
if err != nil {
t.Fatalf("RenderSchema(sqlite) error = %v", err)
}
if !strings.Contains(sqlite, "id INTEGER PRIMARY KEY") ||
!strings.Contains(sqlite, "enabled INTEGER") ||
!strings.Contains(sqlite, "created_at DATETIME") ||
!strings.Contains(sqlite, "DEFAULT CURRENT_TIMESTAMP") {
t.Errorf("RenderSchema(sqlite) = %q", sqlite)
}
postgres, err := RenderSchema(PGX, schema)
if err != nil {
t.Fatalf("RenderSchema(postgres) error = %v", err)
}
if !strings.Contains(postgres, "id BIGSERIAL PRIMARY KEY") ||
!strings.Contains(postgres, "enabled BOOLEAN") ||
!strings.Contains(postgres, "enabled BOOLEAN NOT NULL DEFAULT FALSE") ||
!strings.Contains(postgres, "created_at TIMESTAMPTZ") {
t.Errorf("RenderSchema(postgres) = %q", postgres)
}
}
func TestRenderSchemaRejectsUnknownAndUnexpandedTokens(t *testing.T) {
for _, test := range []struct {
name string
driver string
schema string
}{
{name: "unknown token", driver: SQLite3, schema: "CREATE TABLE x (v {{uuid}})"},
{name: "unexpanded token", driver: SQLite3, schema: "CREATE TABLE x (v {{timestamp}} {{other}})"},
{name: "unknown driver", driver: "mysql", schema: "CREATE TABLE x (v {{timestamp}})"},
} {
t.Run(test.name, func(t *testing.T) {
if _, err := RenderSchema(test.driver, test.schema); err == nil {
t.Fatal("RenderSchema() error = nil, want error")
}
})
}
}
func TestRenderSchemaSupportsBooleanAndCurrentTimeAliases(t *testing.T) {
for _, token := range []string{schemaTokenBool, schemaTokenBoolean} {
query, err := RenderSchema(SQLite3, "CREATE TABLE x (enabled "+token+" DEFAULT "+schemaTokenNow+")")
if err != nil {
t.Fatalf("RenderSchema(%q) error = %v", token, err)
}
if strings.Contains(query, "{{") {
t.Fatalf("RenderSchema(%q) left token in %q", token, query)
}
}
}
func TestRenderSchemaPreservesCurrentTimestampExpression(t *testing.T) {
schema := "CREATE TABLE example (created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)"
for _, driver := range []string{SQLite3, PGX} {
rendered, err := RenderSchema(driver, schema)
if err != nil {
t.Fatalf("RenderSchema(%q) error = %v", driver, err)
}
if strings.Contains(rendered, "CURRENT_TIMESTAMPTZ") || strings.Contains(rendered, "CURRENT_DATETIME") {
t.Fatalf("RenderSchema(%q) rewrote current-time expression: %q", driver, rendered)
}
if !strings.Contains(rendered, "DEFAULT CURRENT_TIMESTAMP") {
t.Fatalf("RenderSchema(%q) dropped current-time expression: %q", driver, rendered)
}
}
}