- Introduced equivalent base types and variants for PostgreSQL types to normalize type comparisons. - Added functions for normalizing SQL types and retrieving equivalent type variants. - Updated migration writer to handle type alterations with checks for existing types. - Implemented logic to create necessary extensions (e.g., pg_trgm) based on schema requirements. - Enhanced tests to cover new functionality for type normalization and migration handling. - Improved handling of GIN indexes to use appropriate operator classes based on column types.
199 lines
5.4 KiB
Go
199 lines
5.4 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestRunMerge_FromListMutuallyExclusiveWithSourcePath(t *testing.T) {
|
|
saved := saveMergeState()
|
|
defer restoreMergeState(saved)
|
|
|
|
dir := t.TempDir()
|
|
file := filepath.Join(dir, "schema.json")
|
|
writeTestJSON(t, file, []string{"users"})
|
|
|
|
mergeTargetType = "json"
|
|
mergeTargetPath = file
|
|
mergeTargetConn = ""
|
|
mergeSourceType = "json"
|
|
mergeSourcePath = file
|
|
mergeSourceConn = ""
|
|
mergeFromList = []string{file}
|
|
mergeOutputType = "json"
|
|
mergeOutputPath = filepath.Join(dir, "out.json")
|
|
mergeOutputConn = ""
|
|
mergeSkipTables = ""
|
|
mergeReportPath = ""
|
|
|
|
err := runMerge(nil, nil)
|
|
if err == nil {
|
|
t.Error("expected error when --source-path and --from-list are both set")
|
|
}
|
|
}
|
|
|
|
func TestRunMerge_FromListSingleFile(t *testing.T) {
|
|
saved := saveMergeState()
|
|
defer restoreMergeState(saved)
|
|
|
|
dir := t.TempDir()
|
|
targetFile := filepath.Join(dir, "target.json")
|
|
sourceFile := filepath.Join(dir, "source.json")
|
|
outFile := filepath.Join(dir, "output.json")
|
|
writeTestJSON(t, targetFile, []string{"users"})
|
|
writeTestJSON(t, sourceFile, []string{"posts"})
|
|
|
|
mergeTargetType = "json"
|
|
mergeTargetPath = targetFile
|
|
mergeTargetConn = ""
|
|
mergeSourceType = "json"
|
|
mergeSourcePath = ""
|
|
mergeSourceConn = ""
|
|
mergeFromList = []string{sourceFile}
|
|
mergeOutputType = "json"
|
|
mergeOutputPath = outFile
|
|
mergeOutputConn = ""
|
|
mergeSkipTables = ""
|
|
mergeReportPath = ""
|
|
|
|
if err := runMerge(nil, nil); err != nil {
|
|
t.Fatalf("runMerge() error = %v", err)
|
|
}
|
|
if _, err := os.Stat(outFile); os.IsNotExist(err) {
|
|
t.Error("expected output file to be created")
|
|
}
|
|
}
|
|
|
|
func TestRunMerge_FromListMultipleFiles(t *testing.T) {
|
|
saved := saveMergeState()
|
|
defer restoreMergeState(saved)
|
|
|
|
dir := t.TempDir()
|
|
targetFile := filepath.Join(dir, "target.json")
|
|
source1 := filepath.Join(dir, "source1.json")
|
|
source2 := filepath.Join(dir, "source2.json")
|
|
outFile := filepath.Join(dir, "output.json")
|
|
writeTestJSON(t, targetFile, []string{"users"})
|
|
writeTestJSON(t, source1, []string{"posts"})
|
|
writeTestJSON(t, source2, []string{"comments"})
|
|
|
|
mergeTargetType = "json"
|
|
mergeTargetPath = targetFile
|
|
mergeTargetConn = ""
|
|
mergeSourceType = "json"
|
|
mergeSourcePath = ""
|
|
mergeSourceConn = ""
|
|
mergeFromList = []string{source1, source2}
|
|
mergeOutputType = "json"
|
|
mergeOutputPath = outFile
|
|
mergeOutputConn = ""
|
|
mergeSkipTables = ""
|
|
mergeReportPath = ""
|
|
|
|
if err := runMerge(nil, nil); err != nil {
|
|
t.Fatalf("runMerge() error = %v", err)
|
|
}
|
|
if _, err := os.Stat(outFile); os.IsNotExist(err) {
|
|
t.Error("expected output file to be created")
|
|
}
|
|
}
|
|
|
|
func TestRunMerge_FromListPathWithSpaces(t *testing.T) {
|
|
saved := saveMergeState()
|
|
defer restoreMergeState(saved)
|
|
|
|
spacedDir := filepath.Join(t.TempDir(), "my schema files")
|
|
if err := os.MkdirAll(spacedDir, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
targetFile := filepath.Join(spacedDir, "target schema.json")
|
|
sourceFile := filepath.Join(spacedDir, "source schema.json")
|
|
outFile := filepath.Join(spacedDir, "merged output.json")
|
|
writeTestJSON(t, targetFile, []string{"users"})
|
|
writeTestJSON(t, sourceFile, []string{"comments"})
|
|
|
|
mergeTargetType = "json"
|
|
mergeTargetPath = targetFile
|
|
mergeTargetConn = ""
|
|
mergeSourceType = "json"
|
|
mergeSourcePath = ""
|
|
mergeSourceConn = ""
|
|
mergeFromList = []string{sourceFile}
|
|
mergeOutputType = "json"
|
|
mergeOutputPath = outFile
|
|
mergeOutputConn = ""
|
|
mergeSkipTables = ""
|
|
mergeReportPath = ""
|
|
|
|
if err := runMerge(nil, nil); err != nil {
|
|
t.Fatalf("runMerge() with spaced paths error = %v", err)
|
|
}
|
|
if _, err := os.Stat(outFile); os.IsNotExist(err) {
|
|
t.Error("expected output file to be created")
|
|
}
|
|
}
|
|
|
|
func TestRunMerge_FromListMissingSourceType(t *testing.T) {
|
|
saved := saveMergeState()
|
|
defer restoreMergeState(saved)
|
|
|
|
dir := t.TempDir()
|
|
file := filepath.Join(dir, "schema.json")
|
|
writeTestJSON(t, file, []string{"users"})
|
|
|
|
mergeTargetType = "json"
|
|
mergeTargetPath = file
|
|
mergeTargetConn = ""
|
|
mergeSourceType = "json"
|
|
mergeSourcePath = ""
|
|
mergeSourceConn = ""
|
|
mergeFromList = []string{} // empty list, no source-path either
|
|
mergeOutputType = "json"
|
|
mergeOutputPath = filepath.Join(dir, "out.json")
|
|
mergeOutputConn = ""
|
|
mergeSkipTables = ""
|
|
mergeReportPath = ""
|
|
|
|
err := runMerge(nil, nil)
|
|
if err == nil {
|
|
t.Error("expected error when neither --source-path nor --from-list is provided")
|
|
}
|
|
}
|
|
|
|
func TestRunMerge_PgsqlOutputRejectsColumnTypeConflict(t *testing.T) {
|
|
saved := saveMergeState()
|
|
defer restoreMergeState(saved)
|
|
|
|
dir := t.TempDir()
|
|
targetFile := filepath.Join(dir, "target.json")
|
|
sourceFile := filepath.Join(dir, "source.json")
|
|
writeTestJSONWithSingleColumnType(t, targetFile, "users", "integer")
|
|
writeTestJSONWithSingleColumnType(t, sourceFile, "users", "uuid")
|
|
|
|
mergeTargetType = "json"
|
|
mergeTargetPath = targetFile
|
|
mergeTargetConn = ""
|
|
mergeSourceType = "json"
|
|
mergeSourcePath = sourceFile
|
|
mergeSourceConn = ""
|
|
mergeFromList = nil
|
|
mergeOutputType = "pgsql"
|
|
mergeOutputPath = ""
|
|
mergeOutputConn = "postgres://relspec:secret@localhost/testdb"
|
|
mergeSkipTables = ""
|
|
mergeReportPath = ""
|
|
|
|
err := runMerge(nil, nil)
|
|
if err == nil {
|
|
t.Fatal("expected pgsql output merge to fail on column type conflict")
|
|
}
|
|
if !strings.Contains(err.Error(), "column type conflicts detected") {
|
|
t.Fatalf("expected conflict summary in error, got: %v", err)
|
|
}
|
|
if !strings.Contains(err.Error(), "public.users.id") {
|
|
t.Fatalf("expected conflicting column path in error, got: %v", err)
|
|
}
|
|
}
|