package tests import ( "testing" "fmt" "reflect" "zedshaw.games/webapp/data" _ "github.com/mattn/go-sqlite3" sq "github.com/Masterminds/squirrel" ) func SelectTable(table string, the_type reflect.Type, limit uint64, offset uint64) ([]reflect.Value, error) { var results []reflect.Value sql_query, args, err := sq.Select("*").Limit(limit).Offset(offset).From(table).ToSql() if err != nil { return results, err } rows, err := data.DB.Queryx(sql_query, args...) if err != nil { return results, err } defer rows.Close() for rows.Next() { the_data := reflect.New(the_type) err = rows.StructScan(the_data.Interface()) if err != nil { return results, err } results = append(results, the_data.Elem()) } return results, rows.Err() } func Get(table string, the_type reflect.Type, id int64) (reflect.Value, error) { sql_query, args, err := sq.Select("*").From(table).Where("id", id).ToSql() if err != nil { return reflect.New(nil), err } the_data := reflect.New(the_type) err = data.DB.Get(the_data.Interface(), sql_query, args...) // BUG: not sure if Elem or returning the reflect.New is better return the_data.Elem(), err } func Delete(table string, id int64) error { sql_query, args, err := sq.Delete(table).Where("id", id).ToSql() if err != nil { return err } _, err = data.DB.Exec(sql_query, args...) return err } func Insert(table string, value reflect.Value) error { type_of := value.Type() field_num := value.NumField() var columns []string var values []interface{} for i := 0; i < field_num; i++ { field := value.Field(i) tag := type_of.Field(i).Tag.Get("db") if tag == "id" { continue } columns = append(columns, tag) values = append(values, field.Interface()) } builder := sq.Insert(table).Columns(columns...).Values(values...) sql_query, args, err := builder.ToSql() _, err = data.DB.Exec(sql_query, args...) return err } func Update(table string, value reflect.Value) error { builder := sq.Update(table) type_of := value.Type() field_num := value.NumField() for i := 0; i < field_num; i++ { field := value.Field(i) tag := type_of.Field(i).Tag.Get("db") // skip update of id to avoid replacing it if tag == "id" { continue } builder = builder.Set(tag, field.Interface()) } builder.Where("id", value.FieldByName("Id").Interface()) sql_query, args, err := builder.ToSql() _, err = data.DB.Exec(sql_query, args...) return err } func TestAdminIndexPage(t *testing.T) { models := data.Models() table := "user" model := models[table] fmt.Printf("\n------\ntable=%s; model=%s\n", table, model.Name()) fields := reflect.VisibleFields(model) for _, field := range fields { fmt.Println("\t", field.Name, field.Type, field.Tag) } for i := 0; i < 87; i++ { val := reflect.New(model).Elem() email := fmt.Sprintf("test%d@test.com", i) val.FieldByName("Email").SetString(email) val.FieldByName("Username").SetString(fmt.Sprintf("zed%d@zed.com", i)) val.FieldByName("Password").SetString("garbage") sql_query, args, err := sq.Delete(table).Where("email", email).ToSql() data.DB.Exec(sql_query, args...) err = Insert(table, val) if err != nil { fmt.Println("INSERT", err) } } all_rows, err := SelectTable(table, model, 20, 20 * 3) for i, row := range all_rows { fmt.Println("row", i, row) } if err != nil { fmt.Println("ERROR", err) } first_row := all_rows[0] result, err := Get(table, model, first_row.FieldByName("Id").Int()) if err != nil { fmt.Println("ERROR", err) } fmt.Println("TABLE: ", result) id := result.FieldByName("Id") result, err = Get(table, model, id.Int()) if err != nil { fmt.Println("ERROR", err) } fmt.Println("GET: ", result) username := result.FieldByName("Username") username.SetString("joeblow") err = Update(table, result) if err != nil { fmt.Println("ERROR", err) } username.SetString("zedshaw") err = Update(table, result) if err != nil { fmt.Println("ERROR", err) } // err = Delete(table, id.Int()) // if err != nil { fmt.Println("ERROR", err) } }