add pointer property insert/update test
This commit is contained in:
parent
bb8b2f6dc8
commit
e01ede433e
|
@ -0,0 +1,223 @@
|
||||||
|
// Copyright 2017 The Xorm Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package xorm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// DatetimeFormat
|
||||||
|
DatetimeFormat = "2006-01-02 15:04:05"
|
||||||
|
// DateFormat
|
||||||
|
DateFormat = "2006-01-02"
|
||||||
|
// TimeFormat
|
||||||
|
TimeFormat = "15:04:05"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// TimeFormats
|
||||||
|
TimeFormats = []string{
|
||||||
|
DateFormat,
|
||||||
|
DatetimeFormat,
|
||||||
|
"2006-01-02T15:04:05",
|
||||||
|
"2006-01-02T15:04:05Z",
|
||||||
|
time.ANSIC,
|
||||||
|
time.UnixDate,
|
||||||
|
time.RubyDate,
|
||||||
|
time.RFC822,
|
||||||
|
time.RFC822Z,
|
||||||
|
time.RFC850,
|
||||||
|
time.RFC1123,
|
||||||
|
time.RFC1123Z,
|
||||||
|
time.RFC3339,
|
||||||
|
time.RFC3339Nano,
|
||||||
|
time.Kitchen,
|
||||||
|
time.Stamp,
|
||||||
|
time.StampMilli,
|
||||||
|
time.StampMicro,
|
||||||
|
time.StampNano,
|
||||||
|
"2006年01月02日",
|
||||||
|
"2006年1月2日",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// Time custom time
|
||||||
|
type Time time.Time
|
||||||
|
|
||||||
|
func (t Time) String() string {
|
||||||
|
return t.Origin().Format(time.RFC3339Nano)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t Time) MarshalJSON() ([]byte, error) {
|
||||||
|
ot := time.Time(t)
|
||||||
|
return json.Marshal(ot)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Time) UnmarshalJSON(b []byte) error {
|
||||||
|
var err error
|
||||||
|
var ot time.Time
|
||||||
|
var value string
|
||||||
|
if err = json.Unmarshal(b, &value); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, layout := range TimeFormats {
|
||||||
|
ot, err = time.ParseInLocation(layout, value, time.Local)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*t = Time(ot)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Origin origin time(time.Time)
|
||||||
|
func (t *Time) Origin() *time.Time {
|
||||||
|
if t != nil {
|
||||||
|
ot := time.Time(*t)
|
||||||
|
return &ot
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TimeFrom
|
||||||
|
func TimeFrom(t time.Time) Time {
|
||||||
|
return Time(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Time) FromDB(b []byte) error {
|
||||||
|
var err error
|
||||||
|
var ot time.Time
|
||||||
|
var value string
|
||||||
|
value = string(b)
|
||||||
|
if len(b) > 0 {
|
||||||
|
for _, layout := range TimeFormats {
|
||||||
|
ot, err = time.ParseInLocation(layout, value, time.Local)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*t = Time(ot)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (t *Time) ToDB() ([]byte, error) {
|
||||||
|
if t == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
str := t.String()
|
||||||
|
log.Printf("[Time.ToDB] t.2=%+v\n", str)
|
||||||
|
if str == "" {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return []byte(str), nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON 统一JSON处理
|
||||||
|
type JSON string
|
||||||
|
|
||||||
|
func (j *JSON) FromDB(b []byte) error {
|
||||||
|
if len(b) > 0 {
|
||||||
|
*j = JSON(string(b))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (j *JSON) ToDB() ([]byte, error) {
|
||||||
|
if j == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
str := string(*j)
|
||||||
|
if str == "" {
|
||||||
|
return []byte("{}"), nil
|
||||||
|
}
|
||||||
|
return []byte(str), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type PointerModel struct {
|
||||||
|
ID string `xorm:"varchar(20) pk unique 'id'" json:"id"`
|
||||||
|
Username string `xorm:"varchar(100) notnull" json:"username"`
|
||||||
|
Nickname *string `xorm:"varchar(50) null" json:"nickname"`
|
||||||
|
Like JSON `xorm:"jsonb default('{}')" json:"like"`
|
||||||
|
TJson *JSON `xorm:"json null" json:"t_json"`
|
||||||
|
TNumeric float64 `xorm:"numeric"`
|
||||||
|
Description string `xorm:"text" json:"description"`
|
||||||
|
FoundedDate *Time `xorm:"date null" json:"founded_date"`
|
||||||
|
FetchedAt *Time `xorm:"timestampz null" json:"fetched_at"`
|
||||||
|
StartTime Time `xorm:"timestampz null" json:"start_time"`
|
||||||
|
EndTime *Time `xorm:"timestamp null" json:"end_time"`
|
||||||
|
IsApproved bool `xorm:"default(false)" json:"is_approved"`
|
||||||
|
|
||||||
|
CreatedAt Time `xorm:"timestampz created notnull" json:"created_at"`
|
||||||
|
UpdatedAt Time `xorm:"updated timestampz notnull" json:"updated_at"`
|
||||||
|
DeletedAt *Time `xorm:"deleted timestampz" json:"deleted_at"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableName return table name
|
||||||
|
func (m PointerModel) TableName() string {
|
||||||
|
return "pointer_model"
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPointerModelInsertUpdate(t *testing.T) {
|
||||||
|
assert.NoError(t, prepareEngine())
|
||||||
|
assertSync(t, new(PointerModel))
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
fd := TimeFrom(now)
|
||||||
|
ct := TimeFrom(now)
|
||||||
|
et := TimeFrom(now.Add(time.Minute * 15))
|
||||||
|
id := strconv.FormatInt(now.UnixNano(), 10)
|
||||||
|
item := PointerModel{
|
||||||
|
ID: id,
|
||||||
|
Username: "pinter property insert test",
|
||||||
|
FoundedDate: &fd,
|
||||||
|
StartTime: et,
|
||||||
|
// EndTime: et,
|
||||||
|
CreatedAt: ct,
|
||||||
|
UpdatedAt: ct,
|
||||||
|
}
|
||||||
|
// insert
|
||||||
|
_, err := testEngine.Insert(&item)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("insert", err)
|
||||||
|
}
|
||||||
|
var result PointerModel
|
||||||
|
_, err = testEngine.ID(id).Get(&result)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("get", err)
|
||||||
|
}
|
||||||
|
assert.NotNil(t, result.FoundedDate)
|
||||||
|
assert.Nil(t, result.FetchedAt)
|
||||||
|
assert.Nil(t, result.EndTime)
|
||||||
|
t.Logf("[Get] insert result=%+v\n", result)
|
||||||
|
|
||||||
|
// update
|
||||||
|
result.FoundedDate = nil
|
||||||
|
result.FetchedAt = &fd
|
||||||
|
result.EndTime = &et
|
||||||
|
item.Username = "pointer property update test"
|
||||||
|
_, err = testEngine.Where("id=?", id).AllCols().Update(&result)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("update", err)
|
||||||
|
}
|
||||||
|
var upResult PointerModel
|
||||||
|
_, err = testEngine.ID(id).Get(&upResult)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("get", err)
|
||||||
|
}
|
||||||
|
assert.Nil(t, upResult.FoundedDate)
|
||||||
|
assert.NotNil(t, upResult.FetchedAt)
|
||||||
|
assert.NotNil(t, upResult.EndTime)
|
||||||
|
t.Logf("[Get] update result=%+v\n", upResult)
|
||||||
|
}
|
Loading…
Reference in New Issue