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 }