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  }