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) } }) }