package gpostgres import ( "context" "testing" "time" "github.com/ditointernet/go-assert" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite" ) type User struct { ID uint Name string CreatedAt time.Time } func TestFind(t *testing.T) { err := createTable() if err != nil { t.Fatal("could not create test table!") } t.Run("should return 0 results correctly", func(t *testing.T) { db := connectDB(t) defer db.Close() ctx := context.Background() c := Client{ db: db, tableName: "users", } u := User{} err := c.Find(ctx, &u, `SELECT * FROM users WHERE id=1;`) assert.Equal(t, err, nil) assert.Equal(t, User{}, u) }) t.Run("should return a user correctly", func(t *testing.T) { db := connectDB(t) defer db.Close() db.Create(&User{ Name: "Bia", }) ctx := context.Background() c := Client{ db: db, tableName: "users", } u := User{} err = c.Find(ctx, &u, `SELECT * FROM users WHERE name=?;`, "Bia") assert.Equal(t, err, nil) assert.Equal(t, "Bia", u.Name) assert.NotEqual(t, 0, u.ID) }) } func TestInsert(t *testing.T) { err := createTable() if err != nil { t.Fatal("could not create test table!") } t.Run("should ignore empty lists of users", func(t *testing.T) { db := connectDB(t) defer db.Close() ctx := context.Background() c := Client{ db: db, tableName: "users", } err = c.Insert(ctx) assert.Equal(t, err, nil) }) t.Run("should insert one user correctly", func(t *testing.T) { db := connectDB(t) defer db.Close() ctx := context.Background() c := Client{ db: db, tableName: "users", } u := User{ Name: "Fernanda", } err := c.Insert(ctx, &u) assert.Equal(t, err, nil) result := User{} it := c.db.Raw("SELECT * FROM users WHERE id=?", u.ID) it.Scan(&result) assert.Equal(t, it.Error, nil) assert.Equal(t, u.Name, result.Name) assert.Equal(t, u.CreatedAt.Format(time.RFC3339), result.CreatedAt.Format(time.RFC3339)) }) } func TestDelete(t *testing.T) { err := createTable() if err != nil { t.Fatal("could not create test table!") } t.Run("should ignore empty lists of users", func(t *testing.T) { db := connectDB(t) defer db.Close() ctx := context.Background() c := Client{ db: db, tableName: "users", } err = c.Delete(ctx) assert.Equal(t, err, nil) }) t.Run("should delete one user correctly", func(t *testing.T) { db := connectDB(t) defer db.Close() ctx := context.Background() c := Client{ db: db, tableName: "users", } u := User{ Name: "Fernanda", } err := c.Insert(ctx, &u) assert.Equal(t, err, nil) err = c.Delete(ctx, &u) assert.Equal(t, err, nil) result := User{} it := c.db.Raw("SELECT * FROM users WHERE id=?", u.ID) it.Scan(&result) assert.Equal(t, it.Error, nil) assert.Equal(t, uint(0), result.ID) assert.Equal(t, "", result.Name) }) } func createTable() error { db, err := gorm.Open("sqlite3", "/tmp/test.db") if err != nil { return err } defer db.Close() db.DropTableIfExists(&User{}) db.CreateTable(&User{}) return nil } func connectDB(t *testing.T) *gorm.DB { db, err := gorm.Open("sqlite3", "/tmp/test.db") if err != nil { t.Fatal(err.Error()) } return db }