github.com/seeker-insurance/kit@v0.0.13/db/null/zero/time_test.go (about)

     1  package zero
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  var (
    10  	timeString    = "2012-12-21T21:21:21Z"
    11  	timeJSON      = []byte(`"` + timeString + `"`)
    12  	zeroTimeStr   = "0001-01-01T00:00:00Z"
    13  	zeroTimeJSON  = []byte(`"0001-01-01T00:00:00Z"`)
    14  	blankTimeJSON = []byte(`null`)
    15  	timeValue, _  = time.Parse(time.RFC3339, timeString)
    16  	timeObject    = []byte(`{"Time":"2012-12-21T21:21:21Z","Valid":true}`)
    17  	nullObject    = []byte(`{"Time":"0001-01-01T00:00:00Z","Valid":false}`)
    18  	badObject     = []byte(`{"hello": "world"}`)
    19  )
    20  
    21  func TestUnmarshalTimeJSON(t *testing.T) {
    22  	var ti Time
    23  	err := json.Unmarshal(timeObject, &ti)
    24  	maybePanic(err)
    25  	assertTime(t, ti, "UnmarshalJSON() json")
    26  
    27  	var blank Time
    28  	err = json.Unmarshal(blankTimeJSON, &blank)
    29  	maybePanic(err)
    30  	assertNullTime(t, blank, "blank time json")
    31  
    32  	var zero Time
    33  	err = json.Unmarshal(zeroTimeJSON, &zero)
    34  	maybePanic(err)
    35  	assertNullTime(t, zero, "zero time json")
    36  
    37  	var fromObject Time
    38  	err = json.Unmarshal(timeObject, &fromObject)
    39  	maybePanic(err)
    40  	assertTime(t, fromObject, "map time json")
    41  
    42  	var null Time
    43  	err = json.Unmarshal(nullObject, &null)
    44  	maybePanic(err)
    45  	assertNullTime(t, null, "map null time json")
    46  
    47  	var nullFromObj Time
    48  	err = json.Unmarshal(nullObject, &nullFromObj)
    49  	maybePanic(err)
    50  	assertNullTime(t, nullFromObj, "null from object json")
    51  
    52  	var invalid Time
    53  	err = invalid.UnmarshalJSON(invalidJSON)
    54  	if _, ok := err.(*json.SyntaxError); !ok {
    55  		t.Errorf("expected json.SyntaxError, not %T", err)
    56  	}
    57  	assertNullTime(t, invalid, "invalid from object json")
    58  
    59  	var bad Time
    60  	err = json.Unmarshal(badObject, &bad)
    61  	if err == nil {
    62  		t.Errorf("expected error: bad object")
    63  	}
    64  	assertNullTime(t, bad, "bad from object json")
    65  
    66  	var wrongType Time
    67  	err = json.Unmarshal(intJSON, &wrongType)
    68  	if err == nil {
    69  		t.Errorf("expected error: wrong type JSON")
    70  	}
    71  	assertNullTime(t, wrongType, "wrong type object json")
    72  
    73  	var wrongString Time
    74  	err = json.Unmarshal(stringJSON, &wrongString)
    75  	if err == nil {
    76  		t.Errorf("expected error: wrong string JSON")
    77  	}
    78  	assertNullTime(t, wrongString, "wrong string object json")
    79  }
    80  
    81  func TestMarshalTime(t *testing.T) {
    82  	ti := TimeFrom(timeValue)
    83  	data, err := json.Marshal(ti)
    84  	maybePanic(err)
    85  	assertJSONEquals(t, data, string(timeJSON), "non-empty json marshal")
    86  
    87  	null := TimeFromPtr(nil)
    88  	data, err = json.Marshal(null)
    89  	maybePanic(err)
    90  	assertJSONEquals(t, data, string(zeroTimeJSON), "empty json marshal")
    91  }
    92  
    93  func TestUnmarshalTimeText(t *testing.T) {
    94  	ti := TimeFrom(timeValue)
    95  	txt, err := ti.MarshalText()
    96  	maybePanic(err)
    97  	assertJSONEquals(t, txt, timeString, "marshal text")
    98  
    99  	var unmarshal Time
   100  	err = unmarshal.UnmarshalText(txt)
   101  	maybePanic(err)
   102  	assertTime(t, unmarshal, "unmarshal text")
   103  
   104  	var null Time
   105  	err = null.UnmarshalText(nullJSON)
   106  	maybePanic(err)
   107  	assertNullTime(t, null, "unmarshal null text")
   108  	txt, err = null.MarshalText()
   109  	maybePanic(err)
   110  	assertJSONEquals(t, txt, zeroTimeStr, "marshal null text")
   111  
   112  	var invalid Time
   113  	err = invalid.UnmarshalText([]byte("hello world"))
   114  	if err == nil {
   115  		t.Error("expected error")
   116  	}
   117  	assertNullTime(t, invalid, "bad string")
   118  }
   119  
   120  func TestTimeFrom(t *testing.T) {
   121  	ti := TimeFrom(timeValue)
   122  	assertTime(t, ti, "TimeFrom() time.Time")
   123  
   124  	var nt time.Time
   125  	null := TimeFrom(nt)
   126  	assertNullTime(t, null, "TimeFrom() empty time.Time")
   127  }
   128  
   129  func TestTimeFromPtr(t *testing.T) {
   130  	ti := TimeFromPtr(&timeValue)
   131  	assertTime(t, ti, "TimeFromPtr() time")
   132  
   133  	null := TimeFromPtr(nil)
   134  	assertNullTime(t, null, "TimeFromPtr(nil)")
   135  }
   136  
   137  func TestTimeSetValid(t *testing.T) {
   138  	var ti time.Time
   139  	change := TimeFrom(ti)
   140  	assertNullTime(t, change, "SetValid()")
   141  	change.SetValid(timeValue)
   142  	assertTime(t, change, "SetValid()")
   143  }
   144  
   145  func TestTimePointer(t *testing.T) {
   146  	ti := TimeFrom(timeValue)
   147  	ptr := ti.Ptr()
   148  	if *ptr != timeValue {
   149  		t.Errorf("bad %s time: %#v ≠ %v\n", "pointer", ptr, timeValue)
   150  	}
   151  
   152  	var nt time.Time
   153  	null := TimeFrom(nt)
   154  	ptr = null.Ptr()
   155  	if ptr != nil {
   156  		t.Errorf("bad %s time: %#v ≠ %s\n", "nil pointer", ptr, "nil")
   157  	}
   158  }
   159  
   160  func TestTimeScan(t *testing.T) {
   161  	var ti Time
   162  	err := ti.Scan(timeValue)
   163  	maybePanic(err)
   164  	assertTime(t, ti, "scanned time")
   165  
   166  	var null Time
   167  	err = null.Scan(nil)
   168  	maybePanic(err)
   169  	assertNullTime(t, null, "scanned null")
   170  
   171  	var wrong Time
   172  	err = wrong.Scan(int64(42))
   173  	if err == nil {
   174  		t.Error("expected error")
   175  	}
   176  	assertNullTime(t, wrong, "scanned wrong")
   177  }
   178  
   179  func TestTimeValue(t *testing.T) {
   180  	ti := TimeFrom(timeValue)
   181  	v, err := ti.Value()
   182  	maybePanic(err)
   183  	if ti.Time != timeValue {
   184  		t.Errorf("bad time.Time value: %v ≠ %v", ti.Time, timeValue)
   185  	}
   186  
   187  	var nt time.Time
   188  	zero := TimeFrom(nt)
   189  	v, err = zero.Value()
   190  	maybePanic(err)
   191  	if v != nil {
   192  		t.Errorf("bad %s time.Time value: %v ≠ %v", "zero", v, nil)
   193  	}
   194  }
   195  
   196  func TestTimeIsZero(t *testing.T) {
   197  	str := TimeFrom(timeValue)
   198  	if str.IsZero() {
   199  		t.Errorf("IsZero() should be false")
   200  	}
   201  
   202  	zero := TimeFrom(time.Time{})
   203  	if !zero.IsZero() {
   204  		t.Errorf("IsZero() should be true")
   205  	}
   206  
   207  	null := TimeFromPtr(nil)
   208  	if !null.IsZero() {
   209  		t.Errorf("IsZero() should be true")
   210  	}
   211  }
   212  
   213  func assertTime(t *testing.T, ti Time, from string) {
   214  	if ti.Time != timeValue {
   215  		t.Errorf("bad %v time: %v ≠ %v\n", from, ti.Time, timeValue)
   216  	}
   217  	if !ti.Valid {
   218  		t.Error(from, "is invalid, but should be valid")
   219  	}
   220  }
   221  
   222  func assertNullTime(t *testing.T, ti Time, from string) {
   223  	if ti.Valid {
   224  		t.Error(from, "is valid, but should be invalid")
   225  	}
   226  }