func TestSelectFirst(t *testing.T) { db, cleanup := prepareScoreDB(t) defer cleanup() var score Score err := db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(2).First(&score) assert.NoError(t, err) assert.Equal(t, 2, score.Value) err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(1).Reverse().First(&score) assert.NoError(t, err) assert.Equal(t, 18, score.Value) }
func TestSelectFindLimitSkip(t *testing.T) { db, cleanup := prepareScoreDB(t) defer cleanup() var scores []Score err := db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Limit(2).Skip(2).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 2) assert.Equal(t, 2, scores[0].Value) assert.Equal(t, 5, scores[1].Value) err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Limit(2).Skip(5).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 1) assert.Equal(t, 19, scores[0].Value) }
func TestSelectCount(t *testing.T) { db, cleanup := prepareScoreDB(t) defer cleanup() total, err := db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Count(&Score{}) assert.NoError(t, err) assert.Equal(t, 6, total) total, err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(2).Count(&Score{}) assert.NoError(t, err) assert.Equal(t, 4, total) total, err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(2).Limit(2).Count(&Score{}) assert.NoError(t, err) assert.Equal(t, 2, total) total, err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(5).Limit(2).Count(&Score{}) assert.NoError(t, err) assert.Equal(t, 1, total) }
func TestSelectDelete(t *testing.T) { db, cleanup := prepareScoreDB(t) defer cleanup() err := db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(2).Delete(&Score{}) assert.NoError(t, err) var scores []Score err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 2) assert.Equal(t, 0, scores[0].Value) assert.Equal(t, 1, scores[1].Value) for i := 0; i < 10; i++ { w := User{ID: i + 1, Name: fmt.Sprintf("John%d", i+1)} err = db.Save(&w) assert.NoError(t, err) } err = db.Select(q.Gte("ID", 5)).Delete(&User{}) assert.NoError(t, err) var user User err = db.One("Name", "John6", &user) assert.Error(t, err) assert.Equal(t, ErrNotFound, err) err = db.One("Name", "John4", &user) assert.NoError(t, err) }
func TestSelectFindSkip(t *testing.T) { db, cleanup := prepareScoreDB(t) defer cleanup() var scores []Score err := db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(4).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 2) assert.Equal(t, 18, scores[0].Value) assert.Equal(t, 19, scores[1].Value) err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(-10).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 6) assert.Equal(t, 0, scores[0].Value) scores = nil err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Skip(1000).Find(&scores) assert.Error(t, err) assert.True(t, ErrNotFound == err) assert.Len(t, scores, 0) }
func TestSelectFind(t *testing.T) { db, cleanup := prepareScoreDB(t) defer cleanup() var scores []Score var scoresPtr []*Score err := db.Select(q.Eq("Value", 5)).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 1) assert.Equal(t, 5, scores[0].Value) err = db.Select(q.Eq("Value", 5)).Find(&scoresPtr) assert.NoError(t, err) assert.Len(t, scoresPtr, 1) assert.Equal(t, 5, scoresPtr[0].Value) err = db.Select( q.Or( q.Eq("Value", 5), q.Eq("Value", 6), ), ).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 2) assert.Equal(t, 5, scores[0].Value) assert.Equal(t, 6, scores[1].Value) err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 6) assert.Equal(t, 0, scores[0].Value) assert.Equal(t, 1, scores[1].Value) assert.Equal(t, 2, scores[2].Value) assert.Equal(t, 5, scores[3].Value) assert.Equal(t, 18, scores[4].Value) assert.Equal(t, 19, scores[5].Value) err = db.Select(q.Or( q.Eq("Value", 5), q.Or( q.Lte("Value", 2), q.Gte("Value", 18), ), )).Reverse().Find(&scores) assert.NoError(t, err) assert.Len(t, scores, 6) assert.Equal(t, 19, scores[0].Value) assert.Equal(t, 18, scores[1].Value) assert.Equal(t, 5, scores[2].Value) assert.Equal(t, 2, scores[3].Value) assert.Equal(t, 1, scores[4].Value) assert.Equal(t, 0, scores[5].Value) }
func TestUpdateField(t *testing.T) { db, cleanup := createDB(t) defer cleanup() type User struct { ID int `storm:"id,increment"` Name string `storm:"index"` Age uint64 `storm:"index,increment"` DateOfBirth time.Time `storm:"index"` Group string Slug string `storm:"unique"` } var u User err := db.Save(&User{ID: 10, Name: "John", Age: 5, Group: "Staff", Slug: "john"}) assert.NoError(t, err) // nil err = db.UpdateField(nil, "", nil) assert.Equal(t, ErrStructPtrNeeded, err) // no id err = db.UpdateField(&User{}, "Name", "Jack") assert.Equal(t, ErrNoID, err) // Unknown user err = db.UpdateField(&User{ID: 11}, "Name", "Jack") assert.Equal(t, ErrNotFound, err) // Unknown field err = db.UpdateField(&User{ID: 11}, "Address", "Jack") assert.Equal(t, ErrNotFound, err) // Uncompatible value err = db.UpdateField(&User{ID: 10}, "Name", 50) assert.Equal(t, ErrIncompatibleValue, err) // actual user err = db.UpdateField(&User{ID: 10}, "Name", "Jack") assert.NoError(t, err) err = db.One("Name", "John", &u) assert.Equal(t, ErrNotFound, err) err = db.One("Name", "Jack", &u) assert.NoError(t, err) assert.Equal(t, "Jack", u.Name) // zero value err = db.UpdateField(&User{ID: 10}, "Name", "") assert.NoError(t, err) err = db.One("Name", "Jack", &u) assert.Equal(t, ErrNotFound, err) err = db.One("ID", 10, &u) assert.NoError(t, err) assert.Equal(t, "", u.Name) // zero value with int and increment err = db.UpdateField(&User{ID: 10}, "Age", uint64(0)) assert.NoError(t, err) err = db.Select(q.Eq("Age", uint64(5))).First(&u) assert.Equal(t, ErrNotFound, err) err = db.Select(q.Eq("Age", uint64(0))).First(&u) assert.NoError(t, err) }