lundi 28 décembre 2020

how to create golang test code that needs to use the database?

I want to publish my first go library on GitHub

i created a scan_test.go which has many tests that connect to a postgresql database, it doesn't need any data, only a valid connection since it tests result of static query result for example select 1 union select 2.

so I to release the package and that the tests would work, how do I allow configuration for the database for the tests ? one idea that comes up is to use env variables? but what's the official way? how to properly create a test for my project?

example of my test file:

const (
    host     = "localhost"
    port     = 5432
    user     = "ufk"
    password = "your-password"
    dbname   = "mycw"
)
type StructInt struct {
    Moshe  int
    Moshe2 int
    Moshe3 []int
    Moshe4 []*int
    Moshe5 []string
}

func TestVarsInStructInJsonArrayWithOneColumn(t *testing.T) {
    if conn, err := GetDbConnection(); err != nil {
        t.Errorf("could not connect to database: %v", err)
    } else {
        sqlQuery := `select json_build_array(json_build_object('moshe',55,'moshe2',66,'moshe3','{10,11}'::int[],'moshe4','{50,51}'::int[],
    'moshe5','{kfir,moshe}'::text[]),
                        json_build_object('moshe',56,'moshe2',67,'moshe3','{41,42}'::int[],'moshe4','{21,22}'::int[],
                                          'moshe5','{kfirrrr,moshrre}'::text[])) as moshe;`
        var foo []StructInt
        if isEmpty, err := Query(context.Background(), conn, &foo, sqlQuery); err != nil {
            t.Errorf("failed test: %v", err)
        } else if isEmpty {
            log.Fatal("failed test with empty results")
        }
        if foo[0].Moshe != 55 {
            t.Errorf("int slice test failed 21 <> %v", foo[0].Moshe)
        }
        if foo[1].Moshe2 != 67 {
            t.Errorf("int slice failed with 82 <> %v", foo[1].Moshe2)
        }
        if len(foo[1].Moshe3) != 2 {
            t.Errorf("int silice failed, array size should be 2 <> %v", len(foo[1].Moshe3))
        }
        if foo[1].Moshe3[1] != 42 {
            t.Errorf("int slice failed, moshe3[0] not 2 <=> %v", foo[1].Moshe3[1])
        }

        if len(foo[1].Moshe4) != 2 {
            t.Errorf("int silice failed, array size should be 2 <> %v", len(foo[1].Moshe4))
        }
        if *foo[1].Moshe4[1] != 22 {
            t.Errorf("int slice failed, moshe4[1] not 4 <=> %v", foo[1].Moshe4[1])
        }

    }

}
func GetDbConnection() (*pgxpool.Pool, error) {
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)
    return pgxpool.Connect(context.Background(), psqlInfo)
}

thanks

Aucun commentaire:

Enregistrer un commentaire