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 TestUUIDTranscode(t *testing.T) {
13 testutil.TestSuccessfulTranscode(t, "uuid", []interface{}{
14 &pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
15 &pgtype.UUID{Status: pgtype.Null},
16 })
17 }
18
19 type SomeUUIDWrapper struct {
20 SomeUUIDType
21 }
22
23 type SomeUUIDType [16]byte
24 type StringUUIDType string
25 type GetterUUIDType string
26
27 func (s StringUUIDType) String() string {
28 return string(s)
29 }
30
31 func (s GetterUUIDType) Get() interface{} {
32 return string(s)
33 }
34
35 func TestUUIDSet(t *testing.T) {
36 successfulTests := []struct {
37 source interface{}
38 result pgtype.UUID
39 }{
40 {
41 source: nil,
42 result: pgtype.UUID{Status: pgtype.Null},
43 },
44 {
45 source: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
46 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
47 },
48 {
49 source: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
50 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
51 },
52 {
53 source: SomeUUIDType{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
54 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
55 },
56 {
57 source: ([]byte)(nil),
58 result: pgtype.UUID{Status: pgtype.Null},
59 },
60 {
61 source: "00010203-0405-0607-0809-0a0b0c0d0e0f",
62 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
63 },
64 {
65 source: "000102030405060708090a0b0c0d0e0f",
66 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
67 },
68 {
69 source: StringUUIDType("00010203-0405-0607-0809-0a0b0c0d0e0f"),
70 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
71 }, {
72 source: GetterUUIDType("00010203-0405-0607-0809-0a0b0c0d0e0f"),
73 result: pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present},
74 },
75 }
76
77 for i, tt := range successfulTests {
78 var r pgtype.UUID
79 err := r.Set(tt.source)
80 if err != nil {
81 t.Errorf("%d: %v", i, err)
82 }
83
84 if r != tt.result {
85 t.Errorf("%d: expected %v to convert to %v, but it was %v", i, tt.source, tt.result, r)
86 }
87 }
88 }
89
90 func TestUUIDAssignTo(t *testing.T) {
91 {
92 src := pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present}
93 var dst [16]byte
94 expected := [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
95
96 err := src.AssignTo(&dst)
97 if err != nil {
98 t.Error(err)
99 }
100
101 if dst != expected {
102 t.Errorf("expected %v to assign %v, but result was %v", src, expected, dst)
103 }
104 }
105
106 {
107 src := pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present}
108 var dst []byte
109 expected := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
110
111 err := src.AssignTo(&dst)
112 if err != nil {
113 t.Error(err)
114 }
115
116 if bytes.Compare(dst, expected) != 0 {
117 t.Errorf("expected %v to assign %v, but result was %v", src, expected, dst)
118 }
119 }
120
121 {
122 src := pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present}
123 var dst SomeUUIDType
124 expected := [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
125
126 err := src.AssignTo(&dst)
127 if err != nil {
128 t.Error(err)
129 }
130
131 if dst != expected {
132 t.Errorf("expected %v to assign %v, but result was %v", src, expected, dst)
133 }
134 }
135
136 {
137 src := pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present}
138 var dst string
139 expected := "00010203-0405-0607-0809-0a0b0c0d0e0f"
140
141 err := src.AssignTo(&dst)
142 if err != nil {
143 t.Error(err)
144 }
145
146 if dst != expected {
147 t.Errorf("expected %v to assign %v, but result was %v", src, expected, dst)
148 }
149 }
150
151 {
152 src := pgtype.UUID{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present}
153 var dst SomeUUIDWrapper
154 expected := [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
155
156 err := src.AssignTo(&dst)
157 if err != nil {
158 t.Error(err)
159 }
160
161 if dst.SomeUUIDType != expected {
162 t.Errorf("expected %v to assign %v, but result was %v", src, expected, dst)
163 }
164 }
165 }
166
167 func TestUUID_MarshalJSON(t *testing.T) {
168 tests := []struct {
169 name string
170 src pgtype.UUID
171 want []byte
172 wantErr bool
173 }{
174 {
175 name: "first",
176 src: pgtype.UUID{
177 Bytes: [16]byte{29, 72, 90, 122, 109, 24, 69, 153, 140, 108, 52, 66, 86, 22, 136, 122},
178 Status: pgtype.Present,
179 },
180 want: []byte(`"1d485a7a-6d18-4599-8c6c-34425616887a"`),
181 wantErr: false,
182 },
183 {
184 name: "second",
185 src: pgtype.UUID{
186 Bytes: [16]byte{},
187 Status: pgtype.Undefined,
188 },
189 want: nil,
190 wantErr: true,
191 },
192 {
193 name: "third",
194 src: pgtype.UUID{
195 Bytes: [16]byte{},
196 Status: pgtype.Null,
197 },
198 want: []byte("null"),
199 wantErr: false,
200 },
201 }
202 for _, tt := range tests {
203 t.Run(tt.name, func(t *testing.T) {
204 got, err := tt.src.MarshalJSON()
205 if (err != nil) != tt.wantErr {
206 t.Errorf("MarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
207 return
208 }
209 if !reflect.DeepEqual(got, tt.want) {
210 t.Errorf("MarshalJSON() got = %v, want %v", got, tt.want)
211 }
212 })
213 }
214 }
215
216 func TestUUID_UnmarshalJSON(t *testing.T) {
217 tests := []struct {
218 name string
219 want *pgtype.UUID
220 src []byte
221 wantErr bool
222 }{
223 {
224 name: "first",
225 want: &pgtype.UUID{
226 Bytes: [16]byte{29, 72, 90, 122, 109, 24, 69, 153, 140, 108, 52, 66, 86, 22, 136, 122},
227 Status: pgtype.Present,
228 },
229 src: []byte(`"1d485a7a-6d18-4599-8c6c-34425616887a"`),
230 wantErr: false,
231 },
232 {
233 name: "second",
234 want: &pgtype.UUID{
235 Bytes: [16]byte{},
236 Status: pgtype.Null,
237 },
238 src: []byte("null"),
239 wantErr: false,
240 },
241 {
242 name: "third",
243 want: &pgtype.UUID{
244 Bytes: [16]byte{},
245 Status: pgtype.Undefined,
246 },
247 src: []byte("1d485a7a-6d18-4599-8c6c-34425616887a"),
248 wantErr: true,
249 },
250 }
251 for _, tt := range tests {
252 t.Run(tt.name, func(t *testing.T) {
253 got := &pgtype.UUID{}
254 if err := got.UnmarshalJSON(tt.src); (err != nil) != tt.wantErr {
255 t.Errorf("UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
256 }
257 if !reflect.DeepEqual(got, tt.want) {
258 t.Errorf("UnmarshalJSON() got = %v, want %v", got, tt.want)
259 }
260 })
261 }
262 }
263
View as plain text