github.com/seeker-insurance/kit@v0.0.13/db/null/string_test.go (about) 1 package null 2 3 import ( 4 "encoding/json" 5 "testing" 6 ) 7 8 var ( 9 stringJSON = []byte(`"test"`) 10 blankStringJSON = []byte(`""`) 11 nullStringJSON = []byte(`{"String":"test","Valid":true}`) 12 13 nullJSON = []byte(`null`) 14 invalidJSON = []byte(`:)`) 15 ) 16 17 type stringInStruct struct { 18 Test String `json:"test,omitempty"` 19 } 20 21 func TestStringFrom(t *testing.T) { 22 str := StringFrom("test") 23 assertStr(t, str, "StringFrom() string") 24 25 zero := StringFrom("") 26 if !zero.Valid { 27 t.Error("StringFrom(0)", "is invalid, but should be valid") 28 } 29 } 30 31 func TestStringFromPtr(t *testing.T) { 32 s := "test" 33 sptr := &s 34 str := StringFromPtr(sptr) 35 assertStr(t, str, "StringFromPtr() string") 36 37 null := StringFromPtr(nil) 38 assertNullStr(t, null, "StringFromPtr(nil)") 39 } 40 41 func TestUnmarshalString(t *testing.T) { 42 var str String 43 err := json.Unmarshal(stringJSON, &str) 44 maybePanic(err) 45 assertStr(t, str, "string json") 46 47 var ns String 48 err = json.Unmarshal(nullStringJSON, &ns) 49 maybePanic(err) 50 assertStr(t, ns, "sql.NullString json") 51 52 var blank String 53 err = json.Unmarshal(blankStringJSON, &blank) 54 maybePanic(err) 55 if !blank.Valid { 56 t.Error("blank string should be valid") 57 } 58 59 var null String 60 err = json.Unmarshal(nullJSON, &null) 61 maybePanic(err) 62 assertNullStr(t, null, "null json") 63 64 var badType String 65 err = json.Unmarshal(boolJSON, &badType) 66 if err == nil { 67 panic("err should not be nil") 68 } 69 assertNullStr(t, badType, "wrong type json") 70 71 var invalid String 72 err = invalid.UnmarshalJSON(invalidJSON) 73 if _, ok := err.(*json.SyntaxError); !ok { 74 t.Errorf("expected json.SyntaxError, not %T", err) 75 } 76 assertNullStr(t, invalid, "invalid json") 77 } 78 79 func TestTextUnmarshalString(t *testing.T) { 80 var str String 81 err := str.UnmarshalText([]byte("test")) 82 maybePanic(err) 83 assertStr(t, str, "UnmarshalText() string") 84 85 var null String 86 err = null.UnmarshalText([]byte("")) 87 maybePanic(err) 88 assertNullStr(t, null, "UnmarshalText() empty string") 89 } 90 91 func TestMarshalString(t *testing.T) { 92 str := StringFrom("test") 93 data, err := json.Marshal(str) 94 maybePanic(err) 95 assertJSONEquals(t, data, `"test"`, "non-empty json marshal") 96 data, err = str.MarshalText() 97 maybePanic(err) 98 assertJSONEquals(t, data, "test", "non-empty text marshal") 99 100 // empty values should be encoded as an empty string 101 zero := StringFrom("") 102 data, err = json.Marshal(zero) 103 maybePanic(err) 104 assertJSONEquals(t, data, `""`, "empty json marshal") 105 data, err = zero.MarshalText() 106 maybePanic(err) 107 assertJSONEquals(t, data, "", "string marshal text") 108 109 null := StringFromPtr(nil) 110 data, err = json.Marshal(null) 111 maybePanic(err) 112 assertJSONEquals(t, data, `null`, "null json marshal") 113 data, err = null.MarshalText() 114 maybePanic(err) 115 assertJSONEquals(t, data, "", "string marshal text") 116 } 117 118 // Tests omitempty... broken until Go 1.4 119 // func TestMarshalStringInStruct(t *testing.T) { 120 // obj := stringInStruct{Test: StringFrom("")} 121 // data, err := json.Marshal(obj) 122 // maybePanic(err) 123 // assertJSONEquals(t, data, `{}`, "null string in struct") 124 // } 125 126 func TestStringPointer(t *testing.T) { 127 str := StringFrom("test") 128 ptr := str.Ptr() 129 if *ptr != "test" { 130 t.Errorf("bad %s string: %#v ≠ %s\n", "pointer", ptr, "test") 131 } 132 133 null := NewString("", false) 134 ptr = null.Ptr() 135 if ptr != nil { 136 t.Errorf("bad %s string: %#v ≠ %s\n", "nil pointer", ptr, "nil") 137 } 138 } 139 140 func TestStringIsZero(t *testing.T) { 141 str := StringFrom("test") 142 if str.IsZero() { 143 t.Errorf("IsZero() should be false") 144 } 145 146 blank := StringFrom("") 147 if blank.IsZero() { 148 t.Errorf("IsZero() should be false") 149 } 150 151 empty := NewString("", true) 152 if empty.IsZero() { 153 t.Errorf("IsZero() should be false") 154 } 155 156 null := StringFromPtr(nil) 157 if !null.IsZero() { 158 t.Errorf("IsZero() should be true") 159 } 160 } 161 162 func TestStringSetValid(t *testing.T) { 163 change := NewString("", false) 164 assertNullStr(t, change, "SetValid()") 165 change.SetValid("test") 166 assertStr(t, change, "SetValid()") 167 } 168 169 func TestStringScan(t *testing.T) { 170 var str String 171 err := str.Scan("test") 172 maybePanic(err) 173 assertStr(t, str, "scanned string") 174 175 var null String 176 err = null.Scan(nil) 177 maybePanic(err) 178 assertNullStr(t, null, "scanned null") 179 } 180 181 func TestStringValueOrZero(t *testing.T) { 182 valid := NewString("test", true) 183 if valid.ValueOrZero() != "test" { 184 t.Error("unexpected ValueOrZero", valid.ValueOrZero()) 185 } 186 187 invalid := NewString("test", false) 188 if invalid.ValueOrZero() != "" { 189 t.Error("unexpected ValueOrZero", invalid.ValueOrZero()) 190 } 191 } 192 193 func TestStringAuto(t *testing.T) { 194 valid := NewStringAuto("test") 195 if valid.ValueOrZero() != "test" { 196 t.Error("unexpected ValueOrZero", valid.ValueOrZero()) 197 } 198 199 invalid := NewStringAuto("") 200 if invalid.Valid { 201 t.Error("unexpected valid", invalid.Valid) 202 } 203 } 204 205 func maybePanic(err error) { 206 if err != nil { 207 panic(err) 208 } 209 } 210 211 func assertStr(t *testing.T, s String, from string) { 212 if s.String != "test" { 213 t.Errorf("bad %s string: %s ≠ %s\n", from, s.String, "test") 214 } 215 if !s.Valid { 216 t.Error(from, "is invalid, but should be valid") 217 } 218 } 219 220 func assertNullStr(t *testing.T, s String, from string) { 221 if s.Valid { 222 t.Error(from, "is valid, but should be invalid") 223 } 224 } 225 226 func assertJSONEquals(t *testing.T, data []byte, cmp string, from string) { 227 if string(data) != cmp { 228 t.Errorf("bad %s data: %s ≠ %s\n", from, data, cmp) 229 } 230 }