github.com/mailru/activerecord@v1.12.2/internal/pkg/generator/tmpl/octopus/mock.tmpl (about)

     1  package {{ .ARPkg }}
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/mailru/activerecord/pkg/activerecord"
     8  	"github.com/mailru/activerecord/pkg/octopus"
     9  {{- range $ind, $imp := .Imports }}
    10  	{{ if ne $imp.ImportName "" }}{{ $imp.ImportName }} {{ end }}"{{ $imp.Path }}"
    11  {{- end }}
    12  {{- range $i, $imp := addImport .FieldList }}
    13  	"{{ $imp }}"
    14  {{- end }}
    15  )
    16  
    17  {{ $pkgName := .ARPkg }}
    18  {{ $PublicStructName := .ARPkgTitle -}}
    19  {{ $fields := .FieldList }}
    20  {{ $procfields := .ProcOutFieldList }}
    21  {{ $procInLen := len .ProcInFieldList }}
    22  {{ $serializers := .Serializers -}}
    23  {{ $fidx := .FieldMap }}
    24  {{ $mutators := .Mutators -}}
    25  {{ $mutatorLen := len .Mutators }}
    26  
    27  {{ if $procfields }}
    28  func (obj *{{ $PublicStructName }}) MockSelectResponse() ([][]byte, error) {
    29  	tuple := [][]byte{}
    30  
    31  	var data []byte
    32  
    33  	var err error
    34  
    35  {{ range $ind, $fstruct := .ProcOutFieldList -}}
    36  	data, err = pack{{ $fstruct.Name }}([]byte{}, obj.Get{{ $fstruct.Name }}())
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  
    41  	tuple = append(tuple, data)
    42  {{ end }}
    43  	return tuple, nil
    44  }
    45  
    46  func MockCallRequest(ctx context.Context{{ if ne $procInLen 0 }}, params {{ $PublicStructName }}Params{{ end }}) []byte {
    47  	log := activerecord.Logger()
    48  	ctx = log.SetLoggerValueToContext(ctx, map[string]interface{}{ {{ if ne $procInLen 0 }}"MockCallRequest": params, {{ end }}"Proc": "{{ $PublicStructName }}"})
    49  
    50  	{{ if ne $procInLen 0 }}
    51  	args, err := params.arrayValues()
    52  	if err != nil {
    53  		activerecord.Logger().Fatal(ctx, fmt.Sprintf("Error call mock request by params: %s", err))
    54  	}
    55  	{{ end }}
    56  
    57  	return octopus.PackLua(procName{{ if ne $procInLen 0 }}, args...{{ end }})
    58  }
    59  
    60  func (obj *{{ $PublicStructName }}) RepoSelector(ctx context.Context) (any, error) {
    61  	data, err := Call(ctx{{ if ne $procInLen 0 }}, obj.params{{ end }})
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	if data == nil {
    67  		return nil, fmt.Errorf("call {{ $PublicStructName }} with params %v: %w", obj.params, activerecord.ErrNoData)
    68  	}
    69  
    70  	return data, err
    71  }
    72  
    73  func CallMockerLogger({{ if ne $procInLen 0 }}params {{ $PublicStructName }}Params, {{ end }}res {{ $PublicStructName }}List) func() (activerecord.MockerLogger, error) {
    74  return func() (activerecord.MockerLogger, error){
    75  
    76  		mockerName := "mocker{{ $PublicStructName }}ByParams"
    77  		mocker := "fixture.Get{{ $PublicStructName }}ProcedureMocker()"
    78  
    79          {{ if ne $procInLen 0 }}
    80          fixture := "ps := {{$PublicStructName}}Params{ \n"
    81          {{- range $ind, $fstruct := .ProcInFieldList }}
    82              fixture += "{{$fstruct.Name}}: params.{{$fstruct.Name}},\n"
    83          {{- end }}
    84          fixture += "}\n"
    85  		fixture += mocker
    86  		fixture += ".ByFixtureParams(ctx, ps)"
    87  		{{ else }}
    88  		fixture := mocker
    89  		fixture += ".ByFixture(ctx)"
    90  		{{ end }}
    91  
    92  		return activerecord.MockerLogger{MockerName: mockerName, Mockers: mocker, FixturesSelector: fixture, ResultName: "{{ $pkgName }}", Results: res}, nil
    93  	}
    94  }
    95  {{- end }}
    96  
    97  {{ if $fields }}
    98  func (obj *{{ $PublicStructName }}) MockSelectResponse() ([][]byte, error) {
    99  	tuple := [][]byte{}
   100  	
   101  	var data []byte
   102  
   103  	var err error
   104  
   105  {{ range $ind, $fstruct := .FieldList -}}
   106  	data, err = pack{{ $fstruct.Name }}([]byte{}, obj.Get{{ $fstruct.Name }}())
   107  	if err != nil {
   108  		return nil, err
   109  	}
   110  
   111  	tuple = append(tuple, data)
   112  
   113  {{ end }}
   114  	return tuple, nil
   115  }
   116  {{ if $fields }}
   117  {{ $pktype := "" }}
   118  {{ $pklenfld := 1 }}
   119  {{ $pkind := index .Indexes 0 }}
   120  {{ range $num, $ind := .Indexes -}}
   121  	{{ if $ind.Primary }}
   122  		{{ $pktype = $ind.Type }}
   123  		{{ $pklenfld = len $ind.Fields }}
   124  		{{ $pkind = $ind }}
   125  	{{ end }}
   126  	{{ $lenfld := len $ind.Fields -}}
   127  func (obj *{{ $PublicStructName }}) Mock{{ $ind.Selector }}Request(ctx context.Context, {{ if not $ind.Unique }}limiter activerecord.SelectorLimiter{{ end }}) []byte {
   128  	key := []{{ $ind.Type }}{
   129  		{{- $lenfld := len $ind.Fields -}}
   130  		{{ if ne $lenfld 1 -}}
   131  		{
   132  		{{- range $_, $fieldNum := $ind.Fields }}
   133  			{{- $ifield := index $fields $fieldNum }}
   134  			{{ $fi := index $fidx $ifield.Name -}}
   135  			{{ $fstruct := index $fields $fi -}}
   136  			{{ $serlen := len $fstruct.Serializer -}}
   137  			{{ $ifield.Name }}: obj.Get{{ $ifield.Name }}(),
   138  		{{- end }}
   139  		},
   140  		{{- else }}
   141  			{{- range $_, $fieldNum := $ind.Fields }}
   142  				{{- $ifield := index $fields $fieldNum }}
   143  				obj.Get{{ $ifield.Name }}(),
   144  			{{- end }}
   145  		{{- end }}
   146  	}
   147  	return obj.Mock{{ $ind.Selector }}sRequest(ctx, key, {{ if not $ind.Unique }}limiter{{ end }})
   148  }
   149  
   150  {{ if ne $lenfld 1 -}}
   151  	{{ range $numf, $ifld := $ind.Fields -}}
   152  		{{ $sfield := index $fields $ifld -}}
   153  		{{ $fi := index $fidx $sfield.Name }}
   154  		{{ $fstruct := index $fields $fi }}
   155  		{{ $serlen := len $fstruct.Serializer -}}
   156  		{{ if ne $serlen 0 -}}
   157  			{{ $sname := index $fstruct.Serializer 0 -}}
   158  			{{ $serializer := index $serializers $sname -}}
   159  			{{ $rtype := $serializer.Type -}}
   160  func serialize{{ $sfield.Name}}(ctx context.Context, v{{ $sfield.Name}} {{ $rtype }}) {{ $sfield.Format }} {
   161  	v, err := {{ $serializer.ImportName }}.{{ $serializer.Marshaler }}({{ $fstruct.Serializer.Params }} v{{ $sfield.Name}})
   162  	if err != nil {
   163  		activerecord.Logger().Fatal(ctx, err)
   164  	}
   165  	return v
   166  }
   167  		{{ end -}}
   168  	{{ end -}}
   169  {{ end -}}
   170  
   171  func (obj *{{ $PublicStructName }}) Mock{{ $ind.Selector }}sRequest(ctx context.Context, keys []{{ $ind.Type }}, {{ if not $ind.Unique }}limiter activerecord.SelectorLimiter{{ end }}) []byte {
   172  	log := activerecord.Logger()
   173  	ctx = log.SetLoggerValueToContext(ctx, map[string]interface{}{"Mock{{ $ind.Selector }}sRequest": keys, "Repo": "{{$PublicStructName}}" })
   174  	keysPacked := [][][]byte{}
   175  
   176  	var (
   177  		data []byte
   178  		err error
   179  	)
   180  	for _, key := range keys {
   181  		keysField := [][]byte{}
   182  
   183  		{{ if ne $lenfld 1 -}}
   184  			{{ range $numf, $ifld := $ind.Fields -}}
   185  				{{ $sfield := index $fields $ifld -}}
   186  				{{ $packerparam := packerParam $sfield.Format -}}
   187  				{{ $packparam := printf "key.%s" $sfield.Name -}}
   188  				{{ $fi := index $fidx $sfield.Name }}
   189  				{{ $fstruct := index $fields $fi }}
   190  				{{ $serlen := len $fstruct.Serializer -}}
   191  				data, err = pack{{ $sfield.Name }}([]byte{}, {{ $packparam }})
   192  				if err != nil {
   193  					log.Fatal(ctx, err)
   194  				}
   195  		
   196  				keysField = append(keysField, data)	
   197  			{{ end -}}
   198  		{{ else -}}
   199  
   200  			{{- range $_, $fieldNum := $ind.Fields }}
   201  				{{- $ifield := index $fields $fieldNum }}
   202  
   203  			data, err = pack{{ $ifield.Name }}([]byte{}, key)
   204  			if err != nil {
   205  				log.Fatal(ctx, err)
   206  				return nil
   207  			}
   208  	
   209  			keysField = append(keysField, data)	
   210  			{{- end }}
   211  		{{ end -}}
   212  
   213  
   214  
   215  		keysPacked = append(keysPacked, keysField)
   216  	}
   217  
   218  	log.Debug(ctx, fmt.Sprintf("Packed Keys: '% X'", keysPacked))
   219  	{{ if not $ind.Unique }}
   220  	return octopus.PackSelect(namespace, {{ $ind.Num }}, limiter.Offset(), limiter.Limit(), keysPacked)
   221  	{{ else }}
   222  	return octopus.PackSelect(namespace, {{ $ind.Num }}, 0, 0, keysPacked)
   223  	{{ end }}
   224  }
   225  
   226  func {{ $ind.Selector }}MockerLogger(keys []{{ $ind.Type }}, res {{ $PublicStructName }}List{{ if not $ind.Unique }}, limiter activerecord.SelectorLimiter{{ end }}) func() (activerecord.MockerLogger, error) {
   227  return func() (activerecord.MockerLogger, error){
   228  		fixturesKey := ""
   229  		for _, key := range keys {
   230  			{{ if ne $lenfld 1 -}}
   231  				fixturesKey += "{{ $pkgName }}.{{ $ind.Type }}{\n"
   232  				{{ range $numf, $ifld := $ind.Fields -}}
   233  					{{ $sfield := index $fields $ifld -}}
   234  					{{ $packerparam := packerParam $sfield.Format -}}
   235  					{{ $packparam := printf "key.%s" $sfield.Name -}}
   236  					{{ $serlen := len $sfield.Serializer }}
   237  					{{ if ne $serlen 0 }}
   238  						{{ $sname := index $sfield.Serializer 0 -}}
   239  						{{ $serializer := index $serializers $sname -}}
   240  						{{ $serparams := $sfield.Serializer.Params -}}
   241  						skey, err := {{ $serializer.ImportName }}.{{ $serializer.Marshaler }}({{ $serparams }}{{ $packparam }})
   242  						if err != nil {
   243  							return activerecord.MockerLogger{}, err
   244  						}
   245  						{{ $packparam = "skey" }}
   246  					{{ end }}
   247  
   248  					{{- $tostr := $packerparam.ToString }}
   249  					{{- $conv := index $tostr 0 }}
   250  					{{ if ne $conv " " }}
   251  			fixturesKey += "{{ $sfield.Name }}: " + {{ index $tostr 0 }}{{ $packparam }}{{ index $tostr 1 }} + ",\n"
   252  					{{ else }}
   253  			fixturesKey += "{{ $sfield.Name }}: \"" + {{ $packparam }} + "\",\n"
   254  					{{ end }}
   255  
   256  				{{ end -}}
   257  				fixturesKey += "},\n"
   258  			{{ else -}}
   259  				{{ $ifield := index $ind.Fields 0 -}}
   260  				{{ $sfield := index $fields $ifield -}}
   261  				{{ $packerparam := packerParam $sfield.Format -}}
   262  				{{- $tostr := $packerparam.ToString }}
   263  				{{- $conv := index $tostr 0 }}
   264  				{{ if ne $conv " " }}
   265  				fixturesKey += {{ index $tostr 0 }}key{{ index $tostr 1 }}
   266  				{{ else }}
   267  				fixturesKey += "\"" + key + "\""
   268  				{{ end }}
   269  				fixturesKey += ",\n"
   270  			{{ end -}}
   271  
   272  		}
   273  
   274  		mockerName := "mocker{{ $PublicStructName }}By{{ $ind.Name }}"
   275  		mocker := "fixture.Get{{ $PublicStructName }}By{{ $ind.Name }}Mocker("
   276  		{{ if not $ind.Unique }}
   277  		mocker += fmt.Sprintf("activerecord.NewLimitOffset(%d, %d)", limiter.Limit(), limiter.Offset())
   278  		mockerName += fmt.Sprintf("_%d_%d", limiter.Limit(), limiter.Offset())
   279  		{{ end }}
   280  		mocker += ")"
   281  
   282  		fixture := mockerName
   283  
   284  		if res != nil && len(res) != 0 {
   285  			pks := "[]{{ $pktype }}{\n"
   286  
   287  			for _, r := range res {
   288  				{{ if ne $pklenfld 1 }}
   289  				pks += "{"
   290  				{{- range $_, $fieldNum := $pkind.Fields }}
   291  					{{- $ifield := index $fields $fieldNum }}
   292  					{{ $packerparam := packerParam $ifield.Format }}
   293  					{{- $tostr := $packerparam.ToString }}
   294  					pks += "{{ $ifield.Name }}:" + {{ index $tostr 0 }}r.Get{{ $ifield.Name }}(){{ index $tostr 1 }} + ", "
   295  				{{ end }}
   296  				pks += "},"
   297  				{{ else }}
   298  				    {{ if $pkind.Fields }}
   299                          {{ $ifield := index $pkind.Fields 0 -}}
   300                          {{ $sfield := index $fields $ifield -}}
   301                          {{ $packerparam := packerParam $sfield.Format }}
   302                          {{- $tostr := $packerparam.ToString }}
   303                          {{- $conv := index $tostr 0 }}
   304                          {{ if ne $conv " " }}
   305                      pks += {{ index $tostr 0 }}r.Primary(){{ index $tostr 1 }} + ",\n"
   306                          {{ else }}
   307                      pks += "\"" + r.Primary() + "\",\n"
   308                          {{ end }}
   309  					{{ end }}
   310  				{{ end }}
   311  			}
   312  
   313  			pks += "}"
   314  
   315  			fixture += ".ByFixturePKWithKeys(ctx, " + pks + ", []{{ $ind.Type }}{" + fixturesKey + "})"
   316  		} else {
   317  			fixture += ".EmptyByKeys(ctx, " + fixturesKey + ")"
   318  		}
   319  
   320  		return activerecord.MockerLogger{MockerName: mockerName, Mockers: mocker, FixturesSelector: fixture, ResultName: "{{ $pkgName }}", Results: res}, nil
   321  	}
   322  }
   323  
   324  {{ end }}
   325  {{ end }}
   326  func (obj *{{ $PublicStructName }}) RepoSelector(ctx context.Context) (any, error) {
   327  	data, err := SelectByPrimary(ctx, obj.Primary())
   328  	if err != nil {
   329  		return nil, err
   330  	}
   331  	if data == nil {
   332  		return nil, fmt.Errorf("select {{ $PublicStructName }} with pk %v: %w", obj.Primary(), activerecord.ErrNoData)
   333  	}
   334  	return data, err
   335  }
   336  
   337  {{ range $ind, $fstruct := $fields -}}
   338  {{- range $i, $mut := $fstruct.Mutators -}}
   339  {{ $customMutator := index $mutators $mut -}}
   340  {{ if and (ne $customMutator.Update "") $customMutator.Name }}
   341  func (obj *{{ $PublicStructName }}) MockMutator{{$customMutator.Name}}Update(ctx context.Context) [][]byte {
   342  	log := activerecord.Logger()
   343  	ctx = log.SetLoggerValueToContext(ctx, map[string]interface{}{"MockMutator{{$customMutator.Name}}Update": obj.Mutators.{{ $customMutator.Name }}.UpdateOps, "Repo": "{{$PublicStructName}}" })
   344  
   345  	updateMutatorOps := make([][]byte, 0, len(obj.Mutators.{{ $customMutator.Name }}.UpdateOps))
   346  
   347  	for _, update := range obj.Mutators.{{ $customMutator.Name }}.UpdateOps {
   348  		switch update.Op {
   349  		case octopus.OpUpdate:
   350  			updateMutatorOps = append(updateMutatorOps, update.Value)
   351  		default:
   352  			continue
   353  		}
   354  	}
   355  
   356  	log.Debug(ctx, fmt.Sprintf("Update mutator packed tuple: '%X'\n", updateMutatorOps))
   357  
   358  	return updateMutatorOps
   359  }
   360  {{end}}
   361  {{end}}
   362  {{end}}
   363  
   364  func (obj *{{ $PublicStructName }}) MockUpdate(ctx context.Context) []byte {
   365      log := activerecord.Logger()
   366      ctx = log.SetLoggerValueToContext(ctx, map[string]interface{}{"MockUpdate": obj.BaseField.UpdateOps, "Repo": "{{$PublicStructName}}" })
   367  
   368      //todo repaired logic not implemented
   369  
   370      pk, err := obj.packPk()
   371      if err != nil {
   372          log.Fatal(ctx, err)
   373          return nil
   374      }
   375  
   376      w := octopus.PackUpdate(namespace, pk, obj.BaseField.UpdateOps)
   377  
   378      log.Debug(ctx, fmt.Sprintf("Update packed tuple: '%X'\n", w))
   379  
   380      return w
   381  }
   382  
   383  func (obj *{{ $PublicStructName }}) MockDelete(ctx context.Context) []byte {
   384      log := activerecord.Logger()
   385  
   386      ctx = log.SetLoggerValueToContext(ctx, map[string]interface{}{"MockDelete": obj.PrimaryString(), "Repo": "{{$PublicStructName}}"})
   387  
   388      pk, err := obj.packPk()
   389      if err != nil {
   390          log.Fatal(ctx, err)
   391          return nil
   392      }
   393  
   394      w := octopus.PackDelete(namespace, pk)
   395  
   396      log.Debug(ctx, fmt.Sprintf("Delete packed tuple: '%X'\n", w))
   397  
   398      return w
   399  }
   400  
   401  func (obj *{{ $PublicStructName }}) MockInsertOrReplace(ctx context.Context) []byte {
   402      return obj.mockInsertReplace(ctx, octopus.InsertModeInserOrReplace)
   403  }
   404  
   405  func (obj *{{ $PublicStructName }}) MockInsert(ctx context.Context) []byte {
   406      obj.BaseField.Exists = false
   407  
   408      return obj.mockInsertReplace(ctx, octopus.InsertModeInsert)
   409  }
   410  
   411  func (obj *{{ $PublicStructName }}) MockReplace(ctx context.Context) []byte {
   412      obj.BaseField.Exists = true
   413  
   414      return obj.mockInsertReplace(ctx, octopus.InsertModeReplace)
   415  }
   416  
   417  func (obj *{{ $PublicStructName }}) mockInsertReplace(ctx context.Context, insertMode octopus.InsertMode) []byte {
   418      log := activerecord.Logger()
   419      ctx = log.SetLoggerValueToContext(ctx, map[string]interface{}{"MockInsertReplacePrimary": obj.PrimaryString(), "MockInsertReplaceMode": insertMode, "Repo": "{{$PublicStructName}}" })
   420  
   421      var tuple [][]byte
   422      var data []byte
   423      var err error
   424  
   425  	{{ range $ind, $fstruct := .FieldList }}
   426      // {{ $fstruct.Name }}
   427  	data, err = pack{{ $fstruct.Name }}([]byte{}, obj.Get{{ $fstruct.Name }}())
   428  	if err != nil {
   429  		log.Fatal(ctx, err)
   430          return nil
   431  	}
   432  
   433  	tuple = append(tuple, data)
   434  	{{ end }}
   435  
   436  	if len(obj.BaseField.ExtraFields) > 0 {
   437  		tuple = append(tuple, obj.BaseField.ExtraFields...)
   438  	}
   439  
   440  	w := octopus.PackInsertReplace(namespace, insertMode, tuple)
   441  
   442  	log.Debug(ctx, fmt.Sprintf("insertReplace packed tuple: '%X'\n", w))
   443  
   444  	return w
   445  }
   446  {{- end }}