github.com/akkaraju-satvik/dbmap@v0.0.3-0.20240414054547-f818701a74f0/cmd/init_test.go (about) 1 package cmd 2 3 import ( 4 "database/sql" 5 "fmt" 6 "log" 7 "os" 8 "testing" 9 "time" 10 11 "github.com/ory/dockertest/v3" 12 ) 13 14 func TestInitializeProject(t *testing.T) { 15 // Set up test data 16 17 dir, err := os.MkdirTemp("", "test_init") 18 if err != nil { 19 t.Fatalf("Error creating temp directory: %s", err) 20 } 21 22 defer os.RemoveAll(dir) 23 24 if err = os.Chdir(dir); err != nil { 25 t.Fatalf("Error changing directory: %s", err) 26 } 27 28 pool, resource, port := createResource() 29 defer pool.Purge(resource) 30 31 migrationsDir := "test_migrations" 32 connection := "postgres://postgres:postgres@localhost:" + port + "/postgres?sslmode=disable" 33 34 // Call the function being tested 35 err = initializeProject(migrationsDir, connection) 36 if err != nil { 37 t.Fatalf("Error initializing project: %s", err) 38 } 39 40 } 41 42 func TestInitializeProjectError(t *testing.T) { 43 tests := []struct { 44 name string 45 migrationsDir string 46 test_id string 47 connection string 48 }{ 49 { 50 name: "Invalid connection string", 51 test_id: "invalid_connection_string", 52 migrationsDir: "test_migrations", 53 connection: "invalid_connection_string", 54 }, 55 { 56 name: "Empty connection string", 57 test_id: "empty_connection_string", 58 migrationsDir: "test_migrations", 59 connection: "", 60 }, 61 { 62 name: "SSL error", 63 test_id: "ssl_error", 64 migrationsDir: "test_migrations", 65 connection: "postgres://postgres:postgres@localhost:5432/postgres?sslmode=require", 66 }, 67 } 68 for _, tt := range tests { 69 t.Run(tt.name, func(t *testing.T) { 70 dir, err := os.MkdirTemp("", "test") 71 if err != nil { 72 t.Fatalf("Error creating temp directory: %s", err) 73 } 74 75 defer os.RemoveAll(dir) 76 77 if err = os.Chdir(dir); err != nil { 78 t.Fatalf("Error changing directory: %s", err) 79 } 80 81 migrationsDir := tt.migrationsDir 82 connection := tt.connection 83 84 err = initializeProject(migrationsDir, connection) 85 if err == nil { 86 t.Fatalf("Expected error initializing project: %s", err) 87 } 88 }) 89 } 90 } 91 92 func createResource() (*dockertest.Pool, *dockertest.Resource, string) { 93 pool, err := dockertest.NewPool("") 94 if err != nil { 95 log.Fatal(err) 96 } 97 resource, err := pool.Run("postgres", "15", []string{"POSTGRES_PASSWORD=postgres", "POSTGRES_USER=postgres", "POSTGRES_DB=postgres"}) 98 if err != nil { 99 log.Fatalf("Could not start resource: %s", err) 100 } 101 port := resource.GetPort("5432/tcp") 102 pool.MaxWait = 30 * time.Second 103 if err = pool.Retry(func() error { 104 dockerDB, err := sql.Open("postgres", fmt.Sprintf("postgres://postgres:postgres@localhost:%s/postgres?sslmode=disable", port)) 105 if err != nil { 106 return err 107 } 108 defer dockerDB.Close() 109 return dockerDB.Ping() 110 }); err != nil { 111 log.Fatalf("Could not connect to docker: %s", err) 112 } 113 return pool, resource, port 114 }