...

Source file src/github.com/jackc/pgtype/uuid_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 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