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  }