github.com/movsb/taorm@v0.0.0-20201209183410-91bafb0b22a6/taorm/stmt_test.go (about)

     1  package taorm
     2  
     3  import (
     4  	"database/sql"
     5  	"database/sql/driver"
     6  	"testing"
     7  
     8  	_ "github.com/go-sql-driver/mysql"
     9  	"github.com/movsb/taorm/mimic"
    10  )
    11  
    12  type User struct {
    13  	ID   int64
    14  	Name string
    15  	Age  int
    16  }
    17  
    18  func (User) TableName() string {
    19  	return `users`
    20  }
    21  
    22  type Like struct {
    23  	ID     int64
    24  	UserID int64
    25  	LikeID int64
    26  }
    27  
    28  func (Like) TableName() string {
    29  	return `likes`
    30  }
    31  
    32  func TestSQLs(t *testing.T) {
    33  	db, err := sql.Open("mysql", "taorm:taorm@/taorm")
    34  	if err != nil {
    35  		t.Fatal(err)
    36  	}
    37  	tdb := NewDB(db)
    38  	tests := []struct {
    39  		want string
    40  		got  string
    41  	}{
    42  		{
    43  			"SELECT * FROM users",
    44  			tdb.From(User{}).FindSQL(),
    45  		},
    46  		{
    47  			"SELECT * FROM users",
    48  			tdb.From(User{ID: 28}).FindSQL(),
    49  		},
    50  		{
    51  			"INSERT INTO users (name,age) VALUES (tao,18)",
    52  			tdb.Model(User{
    53  				Name: "tao",
    54  				Age:  18,
    55  			}).CreateSQL(),
    56  		},
    57  		{
    58  			"UPDATE users SET age=20 WHERE (id=1)",
    59  			tdb.Model(User{
    60  				ID:   1,
    61  				Name: "tao",
    62  				Age:  18,
    63  			}).UpdateMapSQL(M{
    64  				"age": 20,
    65  			}),
    66  		},
    67  		{
    68  			"UPDATE users SET name=TAO,age=28 WHERE (id=1)",
    69  			tdb.Model(User{
    70  				ID:   1,
    71  				Name: "tao",
    72  				Age:  18,
    73  			}).UpdateModelSQL(User{
    74  				ID:   1,
    75  				Name: "TAO",
    76  				Age:  28,
    77  			}),
    78  		},
    79  		{
    80  			"UPDATE users SET age=age+1",
    81  			tdb.Model(User{
    82  				Age: 18,
    83  			}).UpdateMapSQL(M{
    84  				"age": Expr("age+?", 1),
    85  			}),
    86  		},
    87  		{
    88  			"DELETE FROM users WHERE (id=1)",
    89  			tdb.From(User{}).Where("id=?", 1).DeleteSQL(),
    90  		},
    91  		{
    92  			"DELETE FROM users WHERE (id=28)",
    93  			tdb.Model(User{ID: 28}).DeleteSQL(),
    94  		},
    95  		{
    96  			"SELECT COUNT(1) FROM users WHERE (age=28)",
    97  			tdb.From(User{}).Where("age=?", 28).CountSQL(),
    98  		},
    99  		{
   100  			"SELECT * FROM users WHERE (id=1 AND age=28)",
   101  			tdb.Raw("SELECT * FROM users WHERE (id=? AND age=?)", 1, 28).FindSQL(),
   102  		},
   103  		{
   104  			"SELECT * FROM users ORDER BY id",
   105  			tdb.From(User{}).OrderBy("id").FindSQL(),
   106  		},
   107  		{
   108  			"SELECT users.* FROM users INNER JOIN likes ON users.id = likes.user_id ORDER BY id",
   109  			tdb.From(User{}).OrderBy("id").InnerJoin(Like{}, "users.id = likes.user_id").FindSQL(),
   110  		},
   111  		{
   112  			"SELECT users.* FROM users INNER JOIN likes ON users.id = likes.user_id ORDER BY users.id",
   113  			tdb.From(User{}).OrderBy("users.id").InnerJoin(Like{}, "users.id = likes.user_id").FindSQL(),
   114  		},
   115  	}
   116  	for _, test := range tests {
   117  		if test.want != test.got {
   118  			t.Fatalf("not equal: \n    want: %s\n     got: %s\n", test.want, test.got)
   119  		}
   120  	}
   121  }
   122  
   123  func BenchmarkInsert(b *testing.B) {
   124  	user := User{
   125  		Name: "tao",
   126  		Age:  18,
   127  	}
   128  
   129  	db, err := sql.Open("mimic", "")
   130  	if err != nil {
   131  		b.Fatal(err)
   132  	}
   133  	defer db.Close()
   134  
   135  	taodb := NewDB(db)
   136  
   137  	for i := 0; i < b.N; i++ {
   138  		err := taodb.Model(&user).Create()
   139  		if err != nil {
   140  			b.Fatal(err)
   141  		}
   142  	}
   143  }
   144  
   145  func BenchmarkSelectAll(b *testing.B) {
   146  	mimic.SetRows([]string{"id", "name", "age"}, [][]driver.Value{
   147  		{int64(1), "tao", 100},
   148  		{int64(2), "qiao", 101},
   149  		{int64(3), "daniel", 102},
   150  	})
   151  
   152  	db, err := sql.Open("mimic", "")
   153  	if err != nil {
   154  		b.Fatal(err)
   155  	}
   156  	defer db.Close()
   157  
   158  	taodb := NewDB(db)
   159  
   160  	for i := 0; i < b.N; i++ {
   161  		var users []*User
   162  		err := taodb.From("users").Find(&users)
   163  		if err != nil {
   164  			b.Fatal(err)
   165  		}
   166  	}
   167  }
   168  
   169  func BenchmarkSelectComplex(b *testing.B) {
   170  	mimic.SetRows([]string{"id", "name", "age"}, [][]driver.Value{
   171  		{int64(1), "tao", 100},
   172  		{int64(2), "qiao", 101},
   173  		{int64(3), "daniel", 102},
   174  	})
   175  
   176  	db, err := sql.Open("mimic", "")
   177  	if err != nil {
   178  		b.Fatal(err)
   179  	}
   180  	defer db.Close()
   181  
   182  	taodb := NewDB(db)
   183  
   184  	type User struct {
   185  		ID   int64
   186  		Name string
   187  		Age  int
   188  	}
   189  
   190  	for i := 0; i < b.N; i++ {
   191  		var users []*User
   192  		err = taodb.From("users").Where("id > ?", 1).
   193  			Where("name <> ?", "thing").
   194  			Limit(1).
   195  			GroupBy("id").
   196  			Offset(1).
   197  			Select("id, name, color, uuid, identifier, cargo, manifest").
   198  			Find(&users)
   199  		if err != nil {
   200  			b.Fatal(err)
   201  		}
   202  	}
   203  }