go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/db/dbloader/loader_test.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package dbloader 9 10 import ( 11 "context" 12 "testing" 13 14 "go.charczuk.com/sdk/assert" 15 "go.charczuk.com/sdk/db" 16 "go.charczuk.com/sdk/testutil" 17 "go.charczuk.com/sdk/uuid" 18 ) 19 20 type mockValue struct { 21 Key string 22 Value string 23 } 24 25 func Test_Loader(t *testing.T) { 26 mockedValues := map[string]mockValue{ 27 "one": {"one", "one-value"}, 28 "two": {"two", "two-value"}, 29 "three": {"three", "three-value"}, 30 "four": {"four", "four-value"}, 31 } 32 l := Loader[string, mockValue]{ 33 Resolver: func(_ context.Context, keys ...string) (map[string]mockValue, error) { 34 output := make(map[string]mockValue) 35 for _, key := range keys { 36 value, ok := mockedValues[key] 37 if ok { 38 output[key] = value 39 } 40 } 41 return output, nil 42 }, 43 } 44 45 b := l.New() 46 47 one := b.Load("one") 48 two := b.Load("two") 49 four := b.Load("four") 50 err := b.Resolve(context.Background()) 51 52 assert.ItsNil(t, err) 53 54 assert.ItsEqual(t, "one-value", one.Value) 55 assert.ItsEqual(t, "two-value", two.Value) 56 assert.ItsEqual(t, "four-value", four.Value) 57 } 58 59 func Test_LoaderFor(t *testing.T) { 60 tx, err := testutil.DefaultDB().BeginTx(context.Background()) 61 assert.ItsNil(t, err) 62 defer tx.Rollback() 63 64 // create some types 65 var typeIDs []uuid.UUID 66 for x := 0; x < 4; x++ { 67 id := uuid.V4() 68 typeIDs = append(typeIDs, id) 69 err = testutil.DefaultDB().Invoke(db.OptTx(tx)).Create(loaderForObjType{ 70 ID: id, 71 Name: id.String(), 72 }) 73 assert.ItsNil(t, err) 74 } 75 76 // create some objects 77 // var objectIDs []uuid.UUID 78 for x := 0; x < 32; x++ { 79 id := uuid.V4() 80 // objectIDs = append(objectIDs, id) 81 err = testutil.DefaultDB().Invoke(db.OptTx(tx)).Create(loaderForObj{ 82 ID: id, 83 Name: id.String(), 84 TypeID: typeIDs[x%len(typeIDs)], 85 }) 86 assert.ItsNil(t, err) 87 } 88 89 loaderForObjMeta := db.TypeMetaFor(loaderForObj{}) 90 var foundObjs []loaderForObj 91 l := LoaderFor[uuid.UUID, loaderForObjType](testutil.DefaultDB(), db.OptTx(tx)) 92 b := l.New() 93 err = testutil.DefaultDB().Invoke(db.OptTx(tx), db.OptLabel("test_fetch_all_with_foreign")).Query("select * from loader_for_obj").Each(func(r db.Rows) error { 94 var obj loaderForObj 95 if err := db.PopulateByName(&obj, r, loaderForObjMeta); err != nil { 96 return err 97 } 98 obj.Type = b.Load(obj.TypeID) 99 foundObjs = append(foundObjs, obj) 100 return nil 101 }) 102 assert.ItsNil(t, err) 103 assert.ItsNone(t, foundObjs, func(o loaderForObj) bool { return !o.Type.ID.IsZero() }) 104 105 err = b.Resolve(context.Background()) 106 assert.ItsNil(t, err) 107 assert.ItsNone(t, foundObjs, func(o loaderForObj) bool { return o.Type.ID.IsZero() }) 108 }