238 lines
5 KiB
Go
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())
|
|
}
|