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  }