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  }