github.com/mailru/activerecord@v1.12.2/internal/pkg/parser/fieldobject_w_test.go (about) 1 package parser 2 3 import ( 4 "go/ast" 5 "reflect" 6 "testing" 7 8 "github.com/mailru/activerecord/internal/pkg/ds" 9 "github.com/mailru/activerecord/pkg/octopus" 10 ) 11 12 func TestParseFieldsObject(t *testing.T) { 13 rp := ds.NewRecordPackage() 14 15 err := rp.AddField(ds.FieldDeclaration{ 16 Name: "BarID", 17 Format: octopus.Int, 18 PrimaryKey: false, 19 Mutators: []string{}, 20 Size: 0, 21 Serializer: []string{}, 22 ObjectLink: "", 23 }) 24 if err != nil { 25 t.Errorf("can't prepare test data: %s", err) 26 return 27 } 28 29 wantRp := ds.NewRecordPackage() 30 wantRp.FieldsMap["BarID"] = len(wantRp.Fields) 31 wantRp.Fields = append(wantRp.Fields, ds.FieldDeclaration{ 32 Name: "BarID", 33 Format: octopus.Int, 34 PrimaryKey: false, 35 Mutators: []string{}, 36 Size: 0, 37 Serializer: []string{}, 38 ObjectLink: "Bar", 39 }) 40 wantRp.FieldsObjectMap["Bar"] = ds.FieldObject{ 41 Name: "Bar", 42 Key: "ID", 43 ObjectName: "bar", 44 Field: "BarID", 45 Unique: true, 46 } 47 48 type args struct { 49 dst *ds.RecordPackage 50 fieldsobject []*ast.Field 51 } 52 tests := []struct { 53 name string 54 args args 55 wantErr bool 56 want *ds.RecordPackage 57 }{ 58 { 59 name: "simple field object", 60 args: args{ 61 dst: rp, 62 fieldsobject: []*ast.Field{ 63 { 64 Names: []*ast.Ident{{Name: "Bar"}}, 65 Type: &ast.Ident{Name: "bool"}, 66 Tag: &ast.BasicLit{Value: "`" + `ar:"key:ID;object:bar;field:BarID"` + "`"}, 67 }, 68 }, 69 }, 70 wantErr: false, 71 want: wantRp, 72 }, 73 { 74 name: "invalid ident type", 75 args: args{ 76 dst: rp, 77 fieldsobject: []*ast.Field{ 78 { 79 Names: []*ast.Ident{{Name: "Bar"}}, 80 Type: &ast.Ident{Name: "map[string]bool"}, 81 Tag: &ast.BasicLit{Value: "`" + `ar:"key:ID;object:bar;field:BarID"` + "`"}, 82 }, 83 }, 84 }, 85 wantErr: true, // Ожидаем ошибку 86 want: wantRp, // Состояние с прошлого прогона не должно поменяться 87 }, 88 { 89 name: "invalid not slice type", 90 args: args{ 91 dst: rp, 92 fieldsobject: []*ast.Field{ 93 { 94 Names: []*ast.Ident{{Name: "Bar"}}, 95 Type: &ast.ArrayType{Len: &ast.Ident{}, Elt: &ast.Ident{Name: "int"}}, 96 Tag: &ast.BasicLit{Value: "`" + `ar:"key:ID;object:bar;field:BarID"` + "`"}, 97 }, 98 }, 99 }, 100 wantErr: true, // Ожидаем ошибку 101 want: wantRp, // Состояние с прошлого прогона не должно поменяться 102 }, 103 { 104 name: "invalid slice type", 105 args: args{ 106 dst: rp, 107 fieldsobject: []*ast.Field{ 108 { 109 Names: []*ast.Ident{{Name: "Bar"}}, 110 Type: &ast.ArrayType{Elt: &ast.Ident{Name: "int"}}, 111 Tag: &ast.BasicLit{Value: "`" + `ar:"key:ID;object:bar;field:BarID"` + "`"}, 112 }, 113 }, 114 }, 115 wantErr: true, // Ожидаем ошибку 116 want: wantRp, // Состояние с прошлого прогона не должно поменяться 117 }, 118 { 119 name: "invalid type", 120 args: args{ 121 dst: rp, 122 fieldsobject: []*ast.Field{ 123 { 124 Names: []*ast.Ident{{Name: "Bar"}}, 125 Type: &ast.MapType{}, 126 Tag: &ast.BasicLit{Value: "`" + `ar:"key:ID;object:bar;field:BarID"` + "`"}, 127 }, 128 }, 129 }, 130 wantErr: true, // Ожидаем ошибку 131 want: wantRp, // Состояние с прошлого прогона не должно поменяться 132 }, 133 } 134 for _, tt := range tests { 135 t.Run(tt.name, func(t *testing.T) { 136 if err := ParseFieldsObject(tt.args.dst, tt.args.fieldsobject); (err != nil) != tt.wantErr { 137 t.Errorf("ParseFieldsObject() error = %v, wantErr %v", err, tt.wantErr) 138 return 139 } 140 141 if !reflect.DeepEqual(tt.args.dst, tt.want) { 142 t.Errorf("ParseFieldsObject() Fields = %+v, wantFields %+v", tt.args.dst, tt.want) 143 } 144 }) 145 } 146 }