github.com/Ali-iotechsys/sqlboiler/v4@v4.0.0-20221208124957-6aec9a5f1f71/drivers/sqlboiler-psql/driver/psql_test.go (about)

     1  // These tests assume there is a user sqlboiler_driver_user and a database
     2  // by the name of sqlboiler_driver_test that it has full R/W rights to.
     3  // In order to create this you can use the following steps from a root
     4  // psql account:
     5  //
     6  //   create role sqlboiler_driver_user login nocreatedb nocreaterole nocreateuser password 'sqlboiler';
     7  //   create database sqlboiler_driver_test owner = sqlboiler_driver_user;
     8  
     9  package driver
    10  
    11  import (
    12  	"bytes"
    13  	"encoding/json"
    14  	"flag"
    15  	"fmt"
    16  	"os"
    17  	"os/exec"
    18  	"testing"
    19  
    20  	"github.com/stretchr/testify/require"
    21  
    22  	"github.com/volatiletech/sqlboiler/v4/drivers"
    23  )
    24  
    25  var (
    26  	flagOverwriteGolden = flag.Bool("overwrite-golden", false, "Overwrite the golden file with the current execution results")
    27  
    28  	envHostname = drivers.DefaultEnv("DRIVER_HOSTNAME", "localhost")
    29  	envPort     = drivers.DefaultEnv("DRIVER_PORT", "5432")
    30  	envUsername = drivers.DefaultEnv("DRIVER_USER", "sqlboiler_driver_user")
    31  	envPassword = drivers.DefaultEnv("DRIVER_PASS", "sqlboiler")
    32  	envDatabase = drivers.DefaultEnv("DRIVER_DB", "sqlboiler_driver_test")
    33  )
    34  
    35  func TestAssemble(t *testing.T) {
    36  	b, err := os.ReadFile("testdatabase.sql")
    37  	if err != nil {
    38  		t.Fatal(err)
    39  	}
    40  
    41  	out := &bytes.Buffer{}
    42  	createDB := exec.Command("psql", "-h", envHostname, "-U", envUsername, envDatabase)
    43  	createDB.Env = append([]string{fmt.Sprintf("PGPASSWORD=%s", envPassword)}, os.Environ()...)
    44  	createDB.Stdout = out
    45  	createDB.Stderr = out
    46  	createDB.Stdin = bytes.NewReader(b)
    47  
    48  	if err := createDB.Run(); err != nil {
    49  		t.Logf("psql output:\n%s\n", out.Bytes())
    50  		t.Fatal(err)
    51  	}
    52  	t.Logf("psql output:\n%s\n", out.Bytes())
    53  
    54  	tests := []struct {
    55  		name       string
    56  		config     drivers.Config
    57  		goldenJson string
    58  	}{
    59  		{
    60  			name: "default",
    61  			config: drivers.Config{
    62  				"user":    envUsername,
    63  				"pass":    envPassword,
    64  				"dbname":  envDatabase,
    65  				"host":    envHostname,
    66  				"port":    envPort,
    67  				"sslmode": "disable",
    68  				"schema":  "public",
    69  			},
    70  			goldenJson: "psql.golden.json",
    71  		},
    72  		{
    73  			name: "enum_types",
    74  			config: drivers.Config{
    75  				"user":           envUsername,
    76  				"pass":           envPassword,
    77  				"dbname":         envDatabase,
    78  				"host":           envHostname,
    79  				"port":           envPort,
    80  				"sslmode":        "disable",
    81  				"schema":         "public",
    82  				"add-enum-types": true,
    83  			},
    84  			goldenJson: "psql.golden.enums.json",
    85  		},
    86  	}
    87  
    88  	for _, tt := range tests {
    89  		t.Run(tt.name, func(t *testing.T) {
    90  			p := PostgresDriver{}
    91  			info, err := p.Assemble(tt.config)
    92  			if err != nil {
    93  				t.Fatal(err)
    94  			}
    95  
    96  			got, err := json.MarshalIndent(info, "", "\t")
    97  			if err != nil {
    98  				t.Fatal(err)
    99  			}
   100  
   101  			if *flagOverwriteGolden {
   102  				if err = os.WriteFile(tt.goldenJson, got, 0664); err != nil {
   103  					t.Fatal(err)
   104  				}
   105  				t.Log("wrote:", string(got))
   106  				return
   107  			}
   108  
   109  			want, err := os.ReadFile(tt.goldenJson)
   110  			if err != nil {
   111  				t.Fatal(err)
   112  			}
   113  
   114  			require.JSONEq(t, string(want), string(got))
   115  		})
   116  	}
   117  }