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