...

Source file src/github.com/jackc/pgtype/text_test.go

Documentation: github.com/jackc/pgtype

     1  package pgtype_test
     2  
     3  import (
     4  	"bytes"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/jackc/pgtype"
     9  	"github.com/jackc/pgtype/testutil"
    10  )
    11  
    12  func TestTextTranscode(t *testing.T) {
    13  	for _, pgTypeName := range []string{"text", "varchar"} {
    14  		testutil.TestSuccessfulTranscode(t, pgTypeName, []interface{}{
    15  			&pgtype.Text{String: "", Status: pgtype.Present},
    16  			&pgtype.Text{String: "foo", Status: pgtype.Present},
    17  			&pgtype.Text{Status: pgtype.Null},
    18  		})
    19  	}
    20  }
    21  
    22  func TestTextSet(t *testing.T) {
    23  	successfulTests := []struct {
    24  		source interface{}
    25  		result pgtype.Text
    26  	}{
    27  		{source: "foo", result: pgtype.Text{String: "foo", Status: pgtype.Present}},
    28  		{source: _string("bar"), result: pgtype.Text{String: "bar", Status: pgtype.Present}},
    29  		{source: (*string)(nil), result: pgtype.Text{Status: pgtype.Null}},
    30  	}
    31  
    32  	for i, tt := range successfulTests {
    33  		var d pgtype.Text
    34  		err := d.Set(tt.source)
    35  		if err != nil {
    36  			t.Errorf("%d: %v", i, err)
    37  		}
    38  
    39  		if d != tt.result {
    40  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, d)
    41  		}
    42  	}
    43  }
    44  
    45  func TestTextAssignTo(t *testing.T) {
    46  	var s string
    47  	var ps *string
    48  
    49  	stringTests := []struct {
    50  		src      pgtype.Text
    51  		dst      interface{}
    52  		expected interface{}
    53  	}{
    54  		{src: pgtype.Text{String: "foo", Status: pgtype.Present}, dst: &s, expected: "foo"},
    55  		{src: pgtype.Text{Status: pgtype.Null}, dst: &ps, expected: ((*string)(nil))},
    56  	}
    57  
    58  	for i, tt := range stringTests {
    59  		err := tt.src.AssignTo(tt.dst)
    60  		if err != nil {
    61  			t.Errorf("%d: %v", i, err)
    62  		}
    63  
    64  		if dst := reflect.ValueOf(tt.dst).Elem().Interface(); dst != tt.expected {
    65  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
    66  		}
    67  	}
    68  
    69  	var buf []byte
    70  
    71  	bytesTests := []struct {
    72  		src      pgtype.Text
    73  		dst      *[]byte
    74  		expected []byte
    75  	}{
    76  		{src: pgtype.Text{String: "foo", Status: pgtype.Present}, dst: &buf, expected: []byte("foo")},
    77  		{src: pgtype.Text{Status: pgtype.Null}, dst: &buf, expected: nil},
    78  	}
    79  
    80  	for i, tt := range bytesTests {
    81  		err := tt.src.AssignTo(tt.dst)
    82  		if err != nil {
    83  			t.Errorf("%d: %v", i, err)
    84  		}
    85  
    86  		if bytes.Compare(*tt.dst, tt.expected) != 0 {
    87  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, tt.dst)
    88  		}
    89  	}
    90  
    91  	pointerAllocTests := []struct {
    92  		src      pgtype.Text
    93  		dst      interface{}
    94  		expected interface{}
    95  	}{
    96  		{src: pgtype.Text{String: "foo", Status: pgtype.Present}, dst: &ps, expected: "foo"},
    97  	}
    98  
    99  	for i, tt := range pointerAllocTests {
   100  		err := tt.src.AssignTo(tt.dst)
   101  		if err != nil {
   102  			t.Errorf("%d: %v", i, err)
   103  		}
   104  
   105  		if dst := reflect.ValueOf(tt.dst).Elem().Elem().Interface(); dst != tt.expected {
   106  			t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, dst)
   107  		}
   108  	}
   109  
   110  	errorTests := []struct {
   111  		src pgtype.Text
   112  		dst interface{}
   113  	}{
   114  		{src: pgtype.Text{Status: pgtype.Null}, dst: &s},
   115  	}
   116  
   117  	for i, tt := range errorTests {
   118  		err := tt.src.AssignTo(tt.dst)
   119  		if err == nil {
   120  			t.Errorf("%d: expected error but none was returned (%v -> %v)", i, tt.src, tt.dst)
   121  		}
   122  	}
   123  }
   124  
   125  func TestTextMarshalJSON(t *testing.T) {
   126  	successfulTests := []struct {
   127  		source pgtype.Text
   128  		result string
   129  	}{
   130  		{source: pgtype.Text{String: "", Status: pgtype.Null}, result: "null"},
   131  		{source: pgtype.Text{String: "a", Status: pgtype.Present}, result: "\"a\""},
   132  	}
   133  	for i, tt := range successfulTests {
   134  		r, err := tt.source.MarshalJSON()
   135  		if err != nil {
   136  			t.Errorf("%d: %v", i, err)
   137  		}
   138  
   139  		if string(r) != tt.result {
   140  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, string(r))
   141  		}
   142  	}
   143  }
   144  
   145  func TestTextUnmarshalJSON(t *testing.T) {
   146  	successfulTests := []struct {
   147  		source string
   148  		result pgtype.Text
   149  	}{
   150  		{source: "null", result: pgtype.Text{String: "", Status: pgtype.Null}},
   151  		{source: "\"a\"", result: pgtype.Text{String: "a", Status: pgtype.Present}},
   152  	}
   153  	for i, tt := range successfulTests {
   154  		var r pgtype.Text
   155  		err := r.UnmarshalJSON([]byte(tt.source))
   156  		if err != nil {
   157  			t.Errorf("%d: %v", i, err)
   158  		}
   159  
   160  		if r != tt.result {
   161  			t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
   162  		}
   163  	}
   164  }
   165  

View as plain text