1
0
Fork 0
golang-github-pocketbase-dbx/model_query_test.go
Daniel Baumann 02cacc5b45
Adding upstream version 1.11.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-22 10:43:26 +02:00

238 lines
5 KiB
Go

package dbx
import (
"database/sql"
"testing"
"github.com/stretchr/testify/assert"
)
type Item struct {
ID2 int
Name string
}
func TestModelQuery_Insert(t *testing.T) {
db := getPreparedDB()
defer db.Close()
name := "test"
email := "test@example.com"
{
// inserting normally
customer := Customer{
Name: name,
Email: email,
}
err := db.Model(&customer).Insert()
if assert.Nil(t, err) {
assert.Equal(t, 4, customer.ID)
var c Customer
db.Select().From("customer").Where(HashExp{"ID": 4}).One(&c)
assert.Equal(t, name, c.Name)
assert.Equal(t, email, c.Email)
assert.Equal(t, 0, c.Status)
assert.False(t, c.Address.Valid)
}
}
{
// inserting with pointer-typed fields
customer := CustomerPtr{
Name: name,
Email: &email,
}
err := db.Model(&customer).Insert()
if assert.Nil(t, err) && assert.NotNil(t, customer.ID) {
assert.Equal(t, 5, *customer.ID)
var c CustomerPtr
db.Select().From("customer").Where(HashExp{"ID": 4}).One(&c)
assert.Equal(t, name, c.Name)
if assert.NotNil(t, c.Email) {
assert.Equal(t, email, *c.Email)
}
if assert.NotNil(t, c.Status) {
assert.Equal(t, 0, *c.Status)
}
assert.Nil(t, c.Address)
}
}
{
// inserting with null-typed fields
customer := CustomerNull{
Name: name,
Email: sql.NullString{email, true},
}
err := db.Model(&customer).Insert()
if assert.Nil(t, err) {
// potential todo: need to check if the field implements sql.Scanner
// assert.Equal(t, int64(6), customer.ID.Int64)
var c CustomerNull
db.Select().From("customer").Where(HashExp{"ID": 4}).One(&c)
assert.Equal(t, name, c.Name)
assert.Equal(t, email, c.Email.String)
if assert.NotNil(t, c.Status) {
assert.Equal(t, int64(0), c.Status.Int64)
}
assert.False(t, c.Address.Valid)
}
}
{
// inserting with embedded structures
customer := CustomerEmbedded{
Id: 100,
Email: &email,
InnerCustomer: InnerCustomer{
Name: &name,
Status: sql.NullInt64{1, true},
},
}
err := db.Model(&customer).Insert()
if assert.Nil(t, err) {
assert.Equal(t, 100, customer.Id)
var c CustomerEmbedded
db.Select().From("customer").Where(HashExp{"ID": 100}).One(&c)
assert.Equal(t, name, *c.Name)
assert.Equal(t, email, *c.Email)
if assert.NotNil(t, c.Status) {
assert.Equal(t, int64(1), c.Status.Int64)
}
assert.False(t, c.Address.Valid)
}
}
{
// inserting with include/exclude fields
customer := Customer{
Name: name,
Email: email,
Status: 1,
}
err := db.Model(&customer).Exclude("Name").Insert("Name", "Email")
if assert.Nil(t, err) {
assert.Equal(t, 101, customer.ID)
var c Customer
db.Select().From("customer").Where(HashExp{"ID": 101}).One(&c)
assert.Equal(t, "", c.Name)
assert.Equal(t, email, c.Email)
assert.Equal(t, 0, c.Status)
assert.False(t, c.Address.Valid)
}
}
var a int
assert.NotNil(t, db.Model(&a).Insert())
}
func TestModelQuery_Update(t *testing.T) {
db := getPreparedDB()
defer db.Close()
id := 2
name := "test"
email := "test@example.com"
{
// updating normally
customer := Customer{
ID: id,
Name: name,
Email: email,
}
err := db.Model(&customer).Update()
if assert.Nil(t, err) {
var c Customer
db.Select().From("customer").Where(HashExp{"ID": id}).One(&c)
assert.Equal(t, name, c.Name)
assert.Equal(t, email, c.Email)
assert.Equal(t, 0, c.Status)
}
}
{
// updating without primary keys
item2 := Item{
Name: name,
}
err := db.Model(&item2).Update()
assert.Equal(t, MissingPKError, err)
}
{
// updating all fields
customer := CustomerPtr{
ID: &id,
Name: name,
Email: &email,
}
err := db.Model(&customer).Update()
if assert.Nil(t, err) {
assert.Equal(t, id, *customer.ID)
var c CustomerPtr
db.Select().From("customer").Where(HashExp{"ID": id}).One(&c)
assert.Equal(t, name, c.Name)
if assert.NotNil(t, c.Email) {
assert.Equal(t, email, *c.Email)
}
assert.Nil(t, c.Status)
}
}
{
// updating selected fields only
id = 3
customer := CustomerPtr{
ID: &id,
Name: name,
Email: &email,
}
err := db.Model(&customer).Update("Name", "Email")
if assert.Nil(t, err) {
assert.Equal(t, id, *customer.ID)
var c CustomerPtr
db.Select().From("customer").Where(HashExp{"ID": id}).One(&c)
assert.Equal(t, name, c.Name)
if assert.NotNil(t, c.Email) {
assert.Equal(t, email, *c.Email)
}
if assert.NotNil(t, c.Status) {
assert.Equal(t, 2, *c.Status)
}
}
}
{
// updating non-struct
var a int
assert.NotNil(t, db.Model(&a).Update())
}
}
func TestModelQuery_Delete(t *testing.T) {
db := getPreparedDB()
defer db.Close()
customer := Customer{
ID: 2,
}
err := db.Model(&customer).Delete()
if assert.Nil(t, err) {
var m Customer
err := db.Select().From("customer").Where(HashExp{"ID": 2}).One(&m)
assert.NotNil(t, err)
}
{
// deleting without primary keys
item2 := Item{
Name: "",
}
err := db.Model(&item2).Delete()
assert.Equal(t, MissingPKError, err)
}
var a int
assert.NotNil(t, db.Model(&a).Delete())
}