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 }}