This repository has been archived on 2022-07-30. You can view files and clone it, but cannot push or open issues/pull-requests.
mdb/collection_test.go

147 lines
3.1 KiB
Go

package mdb
import (
"errors"
"reflect"
"testing"
)
func TestCollection(t *testing.T) {
testWithDB(t, "insert on secondary", func(t *testing.T, db *DB) {
c := db.Users.c
c.primary = false
if _, err := c.Insert(User{}); !errors.Is(err, ErrReadOnly) {
t.Fatal(err)
}
})
testWithDB(t, "insert validation error", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{
ID: c.NextID(),
Email: "a@b.com",
}
if _, err := c.Insert(user); !errors.Is(err, ErrInvalidName) {
t.Fatal(err)
}
})
testWithDB(t, "insert duplicate", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{
ID: c.NextID(),
Name: "adsf",
Email: "a@b.com",
}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
if _, err := c.Insert(user); !errors.Is(err, ErrDuplicate) {
t.Fatal(err)
}
})
testWithDB(t, "update on secondary", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
c.primary = false
err := c.Update(user.ID, func(u User) (User, error) {
u.Name = "xxx"
return u, nil
})
if !errors.Is(err, ErrReadOnly) {
t.Fatal(err)
}
})
testWithDB(t, "update not found", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
err := c.Update(user.ID+1, func(u User) (User, error) {
u.Name = "xxx"
return u, nil
})
if !errors.Is(err, ErrNotFound) {
t.Fatal(err)
}
})
testWithDB(t, "update failed validation", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
err := c.Update(user.ID, func(u User) (User, error) {
u.Name = ""
return u, nil
})
if !errors.Is(err, ErrInvalidName) {
t.Fatal(err)
}
})
testWithDB(t, "delete on secondary", func(t *testing.T, db *DB) {
defer func() {
if err := recover(); err == nil {
t.Fatal("No panic")
}
}()
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
c.primary = false
c.Delete(1)
})
testWithDB(t, "delete not found", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
c.Delete(user.ID + 1) // Does nothing.
})
testWithDB(t, "get", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
u2, ok := c.Get(user.ID)
if !ok || !reflect.DeepEqual(user, u2) {
t.Fatal(ok, u2, user)
}
})
testWithDB(t, "get not found", func(t *testing.T, db *DB) {
c := db.Users.c
user := User{ID: c.NextID(), Name: "adsf", Email: "a@b.com"}
if _, err := c.Insert(user); err != nil {
t.Fatal(err)
}
u2, ok := c.Get(user.ID - 1)
if ok {
t.Fatal(ok, u2)
}
})
}