154 lines
3.3 KiB
Go
154 lines
3.3 KiB
Go
|
package mdb
|
||
|
|
||
|
/*Copyright (c) 2022, John David Lee
|
||
|
All rights reserved.
|
||
|
|
||
|
This source code is licensed under the BSD-style license found in the
|
||
|
LICENSE file in the root directory of this source tree.
|
||
|
*/
|
||
|
|
||
|
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)
|
||
|
}
|
||
|
})
|
||
|
}
|