gorm/callbacks/helper_test.go
2023-03-20 17:53:20 +01:00

194 lines
5.9 KiB
Go

package callbacks
import (
"reflect"
"testing"
)
type unsupportedMockStruct struct {
ExportedField string
unexportedField string
ExportedSliceField []string
unexportedSliceField []string
ExportedMapField map[string]string
unexportedMapField map[string]string
}
type supportedMockStruct struct {
ExportedField string
ExportedSliceField []string
ExportedMapField map[string]string
}
func TestDeepCopy(t *testing.T) {
t.Run("struct", func(t *testing.T) {
t.Run("supported", func(t *testing.T) {
srcStruct := supportedMockStruct{
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
}
dstStruct := supportedMockStruct{}
if err := deepCopy(srcStruct, &dstStruct); err != nil {
t.Errorf("deepCopy returned an unexpected error %+v", err)
}
if !reflect.DeepEqual(srcStruct, dstStruct) {
t.Errorf("deepCopy failed to copy structure: got %+v, want %+v", dstStruct, srcStruct)
}
})
t.Run("unsupported", func(t *testing.T) {
srcStruct := unsupportedMockStruct{
ExportedField: "exported field",
unexportedField: "unexported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
unexportedSliceField: []string{"1st elem of an unexported slice field", "2nd elem of an unexported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
unexportedMapField: map[string]string{
"key1": "unexported map elem",
"key2": "unexported map elem",
},
}
dstStruct := unsupportedMockStruct{}
if err := deepCopy(srcStruct, &dstStruct); err == nil {
t.Error("deepCopy was expected to fail copying an structure with unexported fields")
}
})
})
t.Run("map", func(t *testing.T) {
t.Run("map[string]string", func(t *testing.T) {
srcMap := map[string]string{
"key1": "value1",
"key2": "value2",
}
dstMap := make(map[string]string)
if err := deepCopy(srcMap, &dstMap); err != nil {
t.Errorf("deepCopy returned an unexpected error %+v", err)
}
if !reflect.DeepEqual(srcMap, dstMap) {
t.Errorf("deepCopy failed to copy map: got %+v, want %+v", dstMap, srcMap)
}
})
t.Run("map[string]struct", func(t *testing.T) {
srcMap := map[string]supportedMockStruct{
"key1": {
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
},
"key2": {
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
},
}
dstMap := make(map[string]supportedMockStruct)
if err := deepCopy(srcMap, &dstMap); err != nil {
t.Errorf("deepCopy returned an unexpected error %+v", err)
}
if !reflect.DeepEqual(srcMap, dstMap) {
t.Errorf("deepCopy failed to copy map: got %+v, want %+v", dstMap, srcMap)
}
})
})
t.Run("slice", func(t *testing.T) {
t.Run("[]string", func(t *testing.T) {
srcSlice := []string{"A", "B", "C"}
dstSlice := make([]string, len(srcSlice))
if err := deepCopy(srcSlice, &dstSlice); err != nil {
t.Errorf("deepCopy returned an unexpected error %+v", err)
}
if !reflect.DeepEqual(srcSlice, dstSlice) {
t.Errorf("deepCopy failed to copy slice: got %+v, want %+v", dstSlice, srcSlice)
}
})
t.Run("[]struct", func(t *testing.T) {
srcSlice := []supportedMockStruct{
{
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
}, {
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
}, {
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
},
}
dstSlice := make([]supportedMockStruct, len(srcSlice))
if err := deepCopy(srcSlice, &dstSlice); err != nil {
t.Errorf("deepCopy returned an unexpected error %+v", err)
}
if !reflect.DeepEqual(srcSlice, dstSlice) {
t.Errorf("deepCopy failed to copy slice: got %+v, want %+v", dstSlice, srcSlice)
}
})
})
t.Run("pointer", func(t *testing.T) {
srcStruct := &supportedMockStruct{
ExportedField: "exported field",
ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"},
ExportedMapField: map[string]string{
"key1": "exported map elem",
"key2": "exported map elem",
},
}
dstStruct := &supportedMockStruct{}
if err := deepCopy(srcStruct, dstStruct); err != nil {
t.Errorf("deepCopy returned an unexpected error %+v", err)
}
if !reflect.DeepEqual(srcStruct, dstStruct) {
t.Errorf("deepCopy failed to copy structure: got %+v, want %+v", dstStruct, srcStruct)
}
})
t.Run("mismatched", func(t *testing.T) {
src := "a string"
dst := 123
if err := deepCopy(src, &dst); err == nil {
t.Error("deepCopy did not return an error when provided mismatched types")
}
})
}