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