github.com/paweljw/pop@v4.13.1+incompatible/model_test.go (about)

     1  package pop
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/gobuffalo/pop/testdata/models/a"
    11  	"github.com/gobuffalo/pop/testdata/models/b"
    12  )
    13  
    14  func Test_Model_TableName(t *testing.T) {
    15  	r := require.New(t)
    16  
    17  	m := Model{Value: User{}}
    18  	r.Equal(m.TableName(), "users")
    19  
    20  	m = Model{Value: &User{}}
    21  	r.Equal(m.TableName(), "users")
    22  
    23  	m = Model{Value: &Users{}}
    24  	r.Equal(m.TableName(), "users")
    25  
    26  	m = Model{Value: []User{}}
    27  	r.Equal(m.TableName(), "users")
    28  
    29  	m = Model{Value: &[]User{}}
    30  	r.Equal(m.TableName(), "users")
    31  
    32  	m = Model{Value: []*User{}}
    33  	r.Equal(m.TableName(), "users")
    34  
    35  }
    36  
    37  type tn struct{}
    38  
    39  func (tn) TableName() string {
    40  	return "this is my table name"
    41  }
    42  
    43  // A failing test case for #477
    44  func Test_TableNameCache(t *testing.T) {
    45  	r := assert.New(t)
    46  	r.Equal("usera", (&Model{Value: a.User{}}).TableName())
    47  	r.Equal("userb", (&Model{Value: b.User{}}).TableName())
    48  	r.Equal("usera", (&Model{Value: []a.User{}}).TableName())
    49  	r.Equal("userb", (&Model{Value: []b.User{}}).TableName())
    50  }
    51  
    52  func Test_TableName(t *testing.T) {
    53  	r := require.New(t)
    54  
    55  	cases := []interface{}{
    56  		tn{},
    57  		[]tn{},
    58  	}
    59  	for _, tc := range cases {
    60  		m := Model{Value: tc}
    61  		r.Equal("this is my table name", m.TableName())
    62  	}
    63  }
    64  
    65  type TimeTimestamp struct {
    66  	ID        int       `db:"id"`
    67  	CreatedAt time.Time `db:"created_at"`
    68  	UpdatedAt time.Time `db:"updated_at"`
    69  }
    70  
    71  type UnixTimestamp struct {
    72  	ID        int `db:"id"`
    73  	CreatedAt int `db:"created_at"`
    74  	UpdatedAt int `db:"updated_at"`
    75  }
    76  
    77  func Test_Touch_Time_Timestamp(t *testing.T) {
    78  	r := require.New(t)
    79  
    80  	m := Model{Value: &TimeTimestamp{}}
    81  
    82  	// Override time.Now()
    83  	t0, _ := time.Parse(time.RFC3339, "2019-07-14T00:00:00Z")
    84  	nowFunc = func() time.Time { return t0 }
    85  	defer func() { nowFunc = time.Now }()
    86  
    87  	m.touchCreatedAt()
    88  	m.touchUpdatedAt()
    89  	v := m.Value.(*TimeTimestamp)
    90  	r.Equal(t0, v.CreatedAt)
    91  	r.Equal(t0, v.UpdatedAt)
    92  }
    93  
    94  func Test_Touch_Time_Timestamp_With_Existing_Value(t *testing.T) {
    95  	r := require.New(t)
    96  
    97  	// Override time.Now()
    98  	t0, _ := time.Parse(time.RFC3339, "2019-07-14T00:00:00Z")
    99  	nowFunc = func() time.Time { return t0 }
   100  	defer func() { nowFunc = time.Now }()
   101  
   102  	createdAt := nowFunc().Add(-36 * time.Hour)
   103  
   104  	m := Model{Value: &TimeTimestamp{CreatedAt: createdAt}}
   105  	m.touchCreatedAt()
   106  	m.touchUpdatedAt()
   107  	v := m.Value.(*TimeTimestamp)
   108  	r.Equal(createdAt, v.CreatedAt)
   109  	r.Equal(t0, v.UpdatedAt)
   110  }
   111  
   112  func Test_Touch_Unix_Timestamp(t *testing.T) {
   113  	r := require.New(t)
   114  
   115  	m := Model{Value: &UnixTimestamp{}}
   116  
   117  	// Override time.Now()
   118  	t0, _ := time.Parse(time.RFC3339, "2019-07-14T00:00:00Z")
   119  	nowFunc = func() time.Time { return t0 }
   120  	defer func() { nowFunc = time.Now }()
   121  
   122  	m.touchCreatedAt()
   123  	m.touchUpdatedAt()
   124  	v := m.Value.(*UnixTimestamp)
   125  	r.Equal(int(t0.Unix()), v.CreatedAt)
   126  	r.Equal(int(t0.Unix()), v.UpdatedAt)
   127  }
   128  
   129  func Test_Touch_Unix_Timestamp_With_Existing_Value(t *testing.T) {
   130  	r := require.New(t)
   131  
   132  	// Override time.Now()
   133  	t0, _ := time.Parse(time.RFC3339, "2019-07-14T00:00:00Z")
   134  	nowFunc = func() time.Time { return t0 }
   135  	defer func() { nowFunc = time.Now }()
   136  
   137  	createdAt := int(time.Now().Add(-36 * time.Hour).Unix())
   138  
   139  	m := Model{Value: &UnixTimestamp{CreatedAt: createdAt}}
   140  	m.touchCreatedAt()
   141  	m.touchUpdatedAt()
   142  	v := m.Value.(*UnixTimestamp)
   143  	r.Equal(createdAt, v.CreatedAt)
   144  	r.Equal(int(t0.Unix()), v.UpdatedAt)
   145  }
   146  
   147  func Test_IDField(t *testing.T) {
   148  	r := require.New(t)
   149  
   150  	type testCustomID struct {
   151  		ID int `db:"custom_id"`
   152  	}
   153  	m := Model{Value: &testCustomID{ID: 1}}
   154  	r.Equal("custom_id", m.IDField())
   155  
   156  	type testNormalID struct {
   157  		ID int
   158  	}
   159  	m = Model{Value: &testNormalID{ID: 1}}
   160  	r.Equal("id", m.IDField())
   161  }