func (me *mysqlTest) TestDelete() { t := me.T() ds := me.db.From("entry") var e entry found, err := ds.Where(goqu.I("int").Eq(9)).Select("id").ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) _, err = ds.Where(goqu.I("id").Eq(e.Id)).Delete().Exec() assert.NoError(t, err) count, err := ds.Count() assert.NoError(t, err) assert.Equal(t, count, 9) var id uint32 found, err = ds.Where(goqu.I("id").Eq(e.Id)).ScanVal(&id) assert.NoError(t, err) assert.False(t, found) e = entry{} found, err = ds.Where(goqu.I("int").Eq(8)).Select("id").ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) assert.NotEqual(t, e.Id, 0) id = 0 _, err = ds.Where(goqu.I("id").Eq(e.Id)).Returning("id").Delete().ScanVal(&id) assert.Equal(t, err.Error(), "goqu: Adapter does not support RETURNING clause") }
func (me *postgresTest) TestDelete() { t := me.T() ds := me.db.From("entry") var e entry found, err := ds.Where(goqu.I("int").Eq(9)).Select("id").ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) _, err = ds.Where(goqu.I("id").Eq(e.Id)).Delete().Exec() assert.NoError(t, err) count, err := ds.Count() assert.NoError(t, err) assert.Equal(t, count, 9) var id uint32 found, err = ds.Where(goqu.I("id").Eq(e.Id)).ScanVal(&id) assert.NoError(t, err) assert.False(t, found) e = entry{} found, err = ds.Where(goqu.I("int").Eq(8)).Select("id").ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) assert.NotEqual(t, e.Id, 0) id = 0 _, err = ds.Where(goqu.I("id").Eq(e.Id)).Returning("id").Delete().ScanVal(&id) assert.NoError(t, err) assert.Equal(t, id, e.Id) }
func (me *postgresTest) TestInsertReturning() { t := me.T() ds := me.db.From("entry") now := time.Now() e := entry{Int: 10, Float: 1.000000, String: "1.000000", Time: now, Bool: true, Bytes: []byte("1.000000")} found, err := ds.Returning(goqu.Star()).Insert(e).ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) assert.True(t, e.Id > 0) var ids []uint32 assert.NoError(t, ds.Returning("id").Insert([]entry{ {Int: 11, Float: 1.100000, String: "1.100000", Time: now, Bool: false, Bytes: []byte("1.100000")}, {Int: 12, Float: 1.200000, String: "1.200000", Time: now, Bool: true, Bytes: []byte("1.200000")}, {Int: 13, Float: 1.300000, String: "1.300000", Time: now, Bool: false, Bytes: []byte("1.300000")}, {Int: 14, Float: 1.400000, String: "1.400000", Time: now, Bool: true, Bytes: []byte("1.400000")}, }).ScanVals(&ids)) assert.Len(t, ids, 4) for _, id := range ids { assert.True(t, id > 0) } var ints []int64 assert.NoError(t, ds.Returning("int").Insert( entry{Int: 15, Float: 1.500000, String: "1.500000", Time: now, Bool: false, Bytes: []byte("1.500000")}, entry{Int: 16, Float: 1.600000, String: "1.600000", Time: now, Bool: true, Bytes: []byte("1.600000")}, entry{Int: 17, Float: 1.700000, String: "1.700000", Time: now, Bool: false, Bytes: []byte("1.700000")}, entry{Int: 18, Float: 1.800000, String: "1.800000", Time: now, Bool: true, Bytes: []byte("1.800000")}, ).ScanVals(&ints)) assert.True(t, found) assert.Equal(t, ints, []int64{15, 16, 17, 18}) }
func (me *crudExecTest) TestScanStruct() { t := me.T() mDb, err := sqlmock.New() assert.NoError(t, err) sqlmock.ExpectQuery(`SELECT \* FROM "items"`). WillReturnError(fmt.Errorf("query error")) sqlmock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) sqlmock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name", "phone_number", "age"}).FromCSVString("111 Test Addr,Test1,111-111-1111,20")) sqlmock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) db := New("db-mock", mDb) exec := newCrudExec(db, nil, `SELECT * FROM "items"`) var slicePtr []testCrudActionItem var item testCrudActionItem found, err := exec.ScanStruct(item) assert.EqualError(t, err, "goqu: Type must be a pointer to a struct when calling ScanStruct") assert.False(t, found) found, err = exec.ScanStruct(&slicePtr) assert.EqualError(t, err, "goqu: Type must be a pointer to a struct when calling ScanStruct") assert.False(t, found) found, err = exec.ScanStruct(&item) assert.EqualError(t, err, "query error") assert.False(t, found) found, err = exec.ScanStruct(&item) assert.NoError(t, err) assert.True(t, found) assert.Equal(t, item.Address, "111 Test Addr") assert.Equal(t, item.Name, "Test1") var composed testComposedCrudActionItem found, err = exec.ScanStruct(&composed) assert.NoError(t, err) assert.True(t, found) assert.Equal(t, composed.Address, "111 Test Addr") assert.Equal(t, composed.Name, "Test1") assert.Equal(t, composed.PhoneNumber, "111-111-1111") assert.Equal(t, composed.Age, 20) var noTag testCrudActionNoTagsItem found, err = exec.ScanStruct(&noTag) assert.NoError(t, err) assert.True(t, found) assert.Equal(t, noTag.Address, "111 Test Addr") assert.Equal(t, noTag.Name, "Test1") }
func (me *datasetTest) TestPrepared() { t := me.T() ds := From("test") preparedDs := ds.Prepared(true) assert.True(t, preparedDs.isPrepared) assert.False(t, ds.isPrepared) //should apply the prepared to any datasets created from the root assert.True(t, preparedDs.Where(Ex{"a": 1}).isPrepared) }
func (me *databaseTest) TestScanStruct() { t := me.T() mDb, err := sqlmock.New() assert.NoError(t, err) sqlmock.ExpectQuery(`SELECT \* FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) sqlmock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) db := New("mock", mDb) var item testActionItem found, err := db.ScanStruct(&item, `SELECT * FROM "items" LIMIT 1`) assert.NoError(t, err) assert.True(t, found) assert.Equal(t, item.Address, "111 Test Addr") assert.Equal(t, item.Name, "Test1") _, err = db.ScanStruct(item, `SELECT * FROM "items" LIMIT 1`) assert.EqualError(t, err, "goqu: Type must be a pointer to a struct when calling ScanStruct") _, err = db.ScanStruct([]testActionItem{}, `SELECT * FROM "items" LIMIT 1`) assert.EqualError(t, err, "goqu: Type must be a pointer to a struct when calling ScanStruct") _, err = db.ScanStruct(&item, `SELECT "test" FROM "items" LIMIT 1`) assert.EqualError(t, err, `goqu: Unable to find corresponding field to column "test" returned by query`) }
func (me *datasetTest) TestScanStruct_WithPreparedStatements() { t := me.T() mDb, err := sqlmock.New() assert.NoError(t, err) sqlmock.ExpectQuery(`SELECT "address", "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT \?`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) sqlmock.ExpectQuery(`SELECT "test" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT \?`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) db := New("mock", mDb) var item dsTestActionItem found, err := db.From("items").Prepared(true).Where(Ex{"name": []string{"Bob", "Sally", "Billy"}, "address": "111 Test Addr"}).ScanStruct(&item) assert.NoError(t, err) assert.True(t, found) assert.Equal(t, item.Address, "111 Test Addr") assert.Equal(t, item.Name, "Test1") _, err = db.From("items").ScanStruct(item) assert.EqualError(t, err, "goqu: Type must be a pointer to a struct when calling ScanStruct") _, err = db.From("items").ScanStruct([]dsTestActionItem{}) assert.EqualError(t, err, "goqu: Type must be a pointer to a struct when calling ScanStruct") _, err = db.From("items"). Prepared(true). Select("test"). Where(Ex{"name": []string{"Bob", "Sally", "Billy"}, "address": "111 Test Addr"}). ScanStruct(&item) assert.EqualError(t, err, `goqu: Unable to find corresponding field to column "test" returned by query`) }
func (me *adapterTest) TestRegisterAdapter() { t := me.T() RegisterAdapter("test", func(ds *Dataset) Adapter { return NewDefaultAdapter(ds) }) assert.True(t, HasAdapter("test")) removeAdapter("test") }
func (me *postgresTest) TestUpdate() { t := me.T() ds := me.db.From("entry") var e entry found, err := ds.Where(goqu.I("int").Eq(9)).Select("id").ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) e.Int = 11 _, err = ds.Where(goqu.I("id").Eq(e.Id)).Update(e).Exec() assert.NoError(t, err) count, err := ds.Where(goqu.I("int").Eq(11)).Count() assert.NoError(t, err) assert.Equal(t, count, 1) var id uint32 found, err = ds.Where(goqu.I("int").Eq(11)).Returning("id").Update(map[string]interface{}{"int": 9}).ScanVal(&id) assert.NoError(t, err) assert.True(t, found) assert.Equal(t, id, e.Id) }
func (me *postgresTest) TestInsert() { t := me.T() ds := me.db.From("entry") now := time.Now() e := entry{Int: 10, Float: 1.000000, String: "1.000000", Time: now, Bool: true, Bytes: []byte("1.000000")} _, err := ds.Insert(e).Exec() assert.NoError(t, err) var insertedEntry entry found, err := ds.Where(goqu.I("int").Eq(10)).ScanStruct(&insertedEntry) assert.NoError(t, err) assert.True(t, found) assert.True(t, insertedEntry.Id > 0) entries := []entry{ {Int: 11, Float: 1.100000, String: "1.100000", Time: now, Bool: false, Bytes: []byte("1.100000")}, {Int: 12, Float: 1.200000, String: "1.200000", Time: now, Bool: true, Bytes: []byte("1.200000")}, {Int: 13, Float: 1.300000, String: "1.300000", Time: now, Bool: false, Bytes: []byte("1.300000")}, {Int: 14, Float: 1.400000, String: "1.400000", Time: now, Bool: true, Bytes: []byte("1.400000")}, } _, err = ds.Insert(entries).Exec() assert.NoError(t, err) var newEntries []entry assert.NoError(t, ds.Where(goqu.I("int").In([]uint32{11, 12, 13, 14})).ScanStructs(&newEntries)) assert.Len(t, newEntries, 4) _, err = ds.Insert( entry{Int: 15, Float: 1.500000, String: "1.500000", Time: now, Bool: false, Bytes: []byte("1.500000")}, entry{Int: 16, Float: 1.600000, String: "1.600000", Time: now, Bool: true, Bytes: []byte("1.600000")}, entry{Int: 17, Float: 1.700000, String: "1.700000", Time: now, Bool: false, Bytes: []byte("1.700000")}, entry{Int: 18, Float: 1.800000, String: "1.800000", Time: now, Bool: true, Bytes: []byte("1.800000")}, ).Exec() assert.NoError(t, err) newEntries = newEntries[0:0] assert.NoError(t, ds.Where(goqu.I("int").In([]uint32{15, 16, 17, 18})).ScanStructs(&newEntries)) assert.Len(t, newEntries, 4) }
func (me *adapterTest) TestNewAdapter() { t := me.T() RegisterAdapter("test", func(ds *Dataset) Adapter { return NewDefaultAdapter(ds) }) assert.True(t, HasAdapter("test")) adapter := NewAdapter("test", From("test")) assert.NotNil(t, adapter) removeAdapter("test") adapter = NewAdapter("test", From("test")) assert.NotNil(t, adapter) }
func (me *mysqlTest) TestUpdate() { t := me.T() ds := me.db.From("entry") var e entry found, err := ds.Where(goqu.I("int").Eq(9)).Select("id").ScanStruct(&e) assert.NoError(t, err) assert.True(t, found) e.Int = 11 _, err = ds.Where(goqu.I("id").Eq(e.Id)).Update(e).Exec() assert.NoError(t, err) count, err := ds.Where(goqu.I("int").Eq(11)).Count() assert.NoError(t, err) assert.Equal(t, count, 1) }
func (me *databaseTest) TestScanVal() { t := me.T() mDb, err := sqlmock.New() assert.NoError(t, err) sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("10")) db := New("mock", mDb) var id int64 found, err := db.ScanVal(&id, `SELECT "id" FROM "items"`) assert.NoError(t, err) assert.Equal(t, id, 10) assert.True(t, found) found, err = db.ScanVal([]int64{}, `SELECT "id" FROM "items"`) assert.EqualError(t, err, "goqu: Type must be a pointer when calling ScanVal") found, err = db.ScanVal(10, `SELECT "id" FROM "items"`) assert.EqualError(t, err, "goqu: Type must be a pointer when calling ScanVal") }
func (me *datasetTest) TestScanVal_WithPreparedStatement() { t := me.T() mDb, err := sqlmock.New() assert.NoError(t, err) sqlmock.ExpectQuery(`SELECT "id" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT ?`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("10")) db := New("mock", mDb) var id int64 found, err := db.From("items"). Prepared(true). Select("id"). Where(Ex{"name": []string{"Bob", "Sally", "Billy"}, "address": "111 Test Addr"}). ScanVal(&id) assert.NoError(t, err) assert.Equal(t, id, 10) assert.True(t, found) found, err = db.From("items").ScanVal([]int64{}) assert.EqualError(t, err, "goqu: Type must be a pointer when calling ScanVal") found, err = db.From("items").ScanVal(10) assert.EqualError(t, err, "goqu: Type must be a pointer when calling ScanVal") }
func (me *postgresTest) TestQuery() { t := me.T() var entries []entry ds := me.db.From("entry") assert.NoError(t, ds.Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 10) floatVal := float64(0) baseDate, err := time.Parse(time.RFC3339Nano, "2015-02-22T18:19:55.000000000-00:00") assert.NoError(t, err) baseDate = baseDate.UTC() for i, entry := range entries { f := fmt.Sprintf("%f", floatVal) assert.Equal(t, entry.Id, uint32(i+1)) assert.Equal(t, entry.Int, i) assert.Equal(t, fmt.Sprintf("%f", entry.Float), f) assert.Equal(t, entry.String, f) assert.Equal(t, entry.Bytes, []byte(f)) assert.Equal(t, entry.Bool, i%2 == 0) assert.Equal(t, entry.Time.Unix(), baseDate.Add(time.Duration(i)*time.Hour).Unix()) floatVal += float64(0.1) } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("bool").IsTrue()).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 5) assert.NoError(t, err) for _, entry := range entries { assert.True(t, entry.Bool) } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("int").Gt(4)).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 5) assert.NoError(t, err) for _, entry := range entries { assert.True(t, entry.Int > 4) } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("int").Gte(5)).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 5) assert.NoError(t, err) for _, entry := range entries { assert.True(t, entry.Int >= 5) } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("int").Lt(5)).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 5) assert.NoError(t, err) for _, entry := range entries { assert.True(t, entry.Int < 5) } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("int").Lte(4)).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 5) assert.NoError(t, err) for _, entry := range entries { assert.True(t, entry.Int <= 4) } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("string").Eq("0.100000")).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 1) assert.NoError(t, err) for _, entry := range entries { assert.Equal(t, entry.String, "0.100000") } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("string").Like("0.1%")).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 1) assert.NoError(t, err) for _, entry := range entries { assert.Equal(t, entry.String, "0.100000") } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("string").NotLike("0.1%")).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 9) assert.NoError(t, err) for _, entry := range entries { assert.NotEqual(t, entry.String, "0.100000") } entries = entries[0:0] assert.NoError(t, ds.Where(goqu.I("string").IsNull()).Order(goqu.I("id").Asc()).ScanStructs(&entries)) assert.Len(t, entries, 0) }
func (me *datasetAdapterTest) TestSupportsOrderByOnUpdate() { t := me.T() dsAdapter := me.GetDs("test").Adapter() assert.True(t, dsAdapter.SupportsLimitOnDelete()) }