go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/db/invocation_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 db
     9  
    10  import (
    11  	"context"
    12  	"testing"
    13  	"time"
    14  
    15  	. "go.charczuk.com/sdk/assert"
    16  	"go.charczuk.com/sdk/uuid"
    17  )
    18  
    19  func Test_Invocation_Create_Get(t *testing.T) {
    20  	tx, err := defaultDB().BeginTx(context.Background())
    21  	ItsNil(t, err)
    22  	defer func() { _ = tx.Rollback() }()
    23  
    24  	err = createUpsertObjectTable(tx)
    25  	ItsNil(t, err)
    26  
    27  	obj := &upsertObj{
    28  		UUID:      uuid.V4(),
    29  		Timestamp: time.Now().UTC(),
    30  		Category:  uuid.V4().String(),
    31  	}
    32  	i := defaultDB().Invoke(OptTx(tx))
    33  	err = i.Create(obj)
    34  	ItsNil(t, err)
    35  	ItsEqual(t, "upsert_object_create", i.label)
    36  
    37  	var verify upsertObj
    38  	i = defaultDB().Invoke(OptTx(tx))
    39  	found, err := i.Get(&verify, obj.UUID)
    40  	ItsNil(t, err)
    41  	ItsEqual(t, true, found)
    42  	ItsEqual(t, verify.UUID, obj.UUID)
    43  	ItsEqual(t, "upsert_object_get", i.label)
    44  
    45  	// Perform same get, but set a label on the invocation
    46  	verify = upsertObj{}
    47  	i = defaultDB().Invoke(OptTx(tx), OptLabel("bespoke_upsert"))
    48  	found, err = i.Get(&verify, obj.UUID)
    49  	ItsNil(t, err)
    50  	ItsEqual(t, true, found)
    51  	ItsEqual(t, verify.UUID, obj.UUID)
    52  	ItsEqual(t, "bespoke_upsert", i.label)
    53  }
    54  
    55  func Test_Invocation_Create_GetMany(t *testing.T) {
    56  	tx, err := defaultDB().BeginTx(context.Background())
    57  	ItsNil(t, err)
    58  	defer func() { _ = tx.Rollback() }()
    59  
    60  	err = createUpsertObjectTable(tx)
    61  	ItsNil(t, err)
    62  
    63  	objs := []upsertObj{
    64  		{
    65  			UUID:      uuid.V4(),
    66  			Timestamp: time.Now().UTC(),
    67  			Category:  uuid.V4().String(),
    68  		},
    69  		{
    70  			UUID:      uuid.V4(),
    71  			Timestamp: time.Now().UTC(),
    72  			Category:  uuid.V4().String(),
    73  		},
    74  		{
    75  			UUID:      uuid.V4(),
    76  			Timestamp: time.Now().UTC(),
    77  			Category:  uuid.V4().String(),
    78  		},
    79  		{
    80  			UUID:      uuid.V4(),
    81  			Timestamp: time.Now().UTC(),
    82  			Category:  uuid.V4().String(),
    83  		},
    84  		{
    85  			UUID:      uuid.V4(),
    86  			Timestamp: time.Now().UTC(),
    87  			Category:  uuid.V4().String(),
    88  		},
    89  	}
    90  	for index := range objs {
    91  		obj := &objs[index]
    92  		i := defaultDB().Invoke(OptTx(tx))
    93  		err = i.Create(obj)
    94  		ItsNil(t, err)
    95  	}
    96  
    97  	var fetched []upsertObj
    98  	i := defaultDB().Invoke(OptTx(tx))
    99  	err = i.GetMany(&fetched, objs[4].UUID, objs[1].UUID, objs[3].UUID, objs[0].UUID)
   100  	ItsNil(t, err)
   101  	ItsLen(t, fetched, 4)
   102  	ItsAny(t, fetched, func(v upsertObj) bool {
   103  		return v.UUID.Equal(objs[0].UUID)
   104  	})
   105  	ItsAny(t, fetched, func(v upsertObj) bool {
   106  		return v.UUID.Equal(objs[1].UUID)
   107  	})
   108  	ItsAny(t, fetched, func(v upsertObj) bool {
   109  		return v.UUID.Equal(objs[3].UUID)
   110  	})
   111  	ItsAny(t, fetched, func(v upsertObj) bool {
   112  		return v.UUID.Equal(objs[4].UUID)
   113  	})
   114  }
   115  
   116  func Test_Invocation_Get_notFound(t *testing.T) {
   117  	tx, err := defaultDB().BeginTx(context.Background())
   118  	ItsNil(t, err)
   119  	defer func() { _ = tx.Rollback() }()
   120  
   121  	err = createUpsertObjectTable(tx)
   122  	ItsNil(t, err)
   123  
   124  	obj := &upsertObj{
   125  		Timestamp: time.Now().UTC(),
   126  		Category:  uuid.V4().String(),
   127  	}
   128  	found, err := defaultDB().Invoke(OptTx(tx)).Get(obj, uuid.V4().String())
   129  	ItsNil(t, err)
   130  	ItsEqual(t, false, found)
   131  	ItsEqual(t, true, obj.UUID.IsZero())
   132  	ItsEqual(t, true, obj.Timestamp.IsZero())
   133  	ItsEqual(t, "", obj.Category)
   134  }
   135  
   136  func Test_Invocation_Delete(t *testing.T) {
   137  	tx, err := defaultDB().BeginTx(context.Background())
   138  	ItsNil(t, err)
   139  	defer func() { _ = tx.Rollback() }()
   140  
   141  	err = createUpsertObjectTable(tx)
   142  	ItsNil(t, err)
   143  
   144  	obj := &upsertObj{
   145  		UUID:      uuid.V4(),
   146  		Timestamp: time.Now().UTC(),
   147  		Category:  uuid.V4().String(),
   148  	}
   149  	err = defaultDB().Invoke(OptTx(tx)).Create(obj)
   150  	ItsNil(t, err)
   151  
   152  	var verify upsertObj
   153  	_, err = defaultDB().Invoke(OptTx(tx)).Get(&verify, obj.UUID)
   154  	ItsNil(t, err)
   155  	ItsEqual(t, obj.Category, verify.Category)
   156  
   157  	deleted, err := defaultDB().Invoke(OptTx(tx)).Delete(obj)
   158  	ItsNil(t, err)
   159  	ItsEqual(t, true, deleted)
   160  }
   161  
   162  func Test_Invocation_Delete_notFound(t *testing.T) {
   163  	tx, err := defaultDB().BeginTx(context.Background())
   164  	ItsNil(t, err)
   165  	defer func() { _ = tx.Rollback() }()
   166  
   167  	err = createUpsertObjectTable(tx)
   168  	ItsNil(t, err)
   169  
   170  	obj := &upsertObj{
   171  		UUID:      uuid.V4(),
   172  		Timestamp: time.Now().UTC(),
   173  		Category:  uuid.V4().String(),
   174  	}
   175  	deleted, err := defaultDB().Invoke(OptTx(tx)).Delete(obj)
   176  	ItsNil(t, err)
   177  	ItsEqual(t, false, deleted)
   178  }
   179  
   180  func Test_Invocation_Update(t *testing.T) {
   181  	tx, err := defaultDB().BeginTx(context.Background())
   182  	ItsNil(t, err)
   183  	defer func() { _ = tx.Rollback() }()
   184  
   185  	err = createUpsertObjectTable(tx)
   186  	ItsNil(t, err)
   187  
   188  	obj := &upsertObj{
   189  		UUID:      uuid.V4(),
   190  		Timestamp: time.Now().UTC(),
   191  		Category:  uuid.V4().String(),
   192  	}
   193  	err = defaultDB().Invoke(OptTx(tx)).Create(obj)
   194  	ItsNil(t, err)
   195  
   196  	var verify upsertObj
   197  	_, err = defaultDB().Invoke(OptTx(tx)).Get(&verify, obj.UUID)
   198  	ItsNil(t, err)
   199  	ItsEqual(t, obj.Category, verify.Category)
   200  
   201  	obj.Category = "test"
   202  
   203  	updated, err := defaultDB().Invoke(OptTx(tx)).Update(obj)
   204  	ItsNil(t, err)
   205  	ItsEqual(t, true, updated)
   206  
   207  	_, err = defaultDB().Invoke(OptTx(tx)).Get(&verify, obj.UUID)
   208  	ItsNil(t, err)
   209  	ItsEqual(t, obj.Category, verify.Category)
   210  }
   211  
   212  func Test_Invocation_Upsert(t *testing.T) {
   213  	tx, err := defaultDB().BeginTx(context.Background())
   214  	ItsNil(t, err)
   215  	defer func() { _ = tx.Rollback() }()
   216  
   217  	err = createUpsertObjectTable(tx)
   218  	ItsNil(t, err)
   219  
   220  	obj := &upsertObj{
   221  		UUID:      uuid.V4(),
   222  		Timestamp: time.Now().UTC(),
   223  		Category:  uuid.V4().String(),
   224  	}
   225  	err = defaultDB().Invoke(OptTx(tx)).Upsert(obj)
   226  	ItsNil(t, err)
   227  
   228  	var verify upsertObj
   229  	_, err = defaultDB().Invoke(OptTx(tx)).Get(&verify, obj.UUID)
   230  	ItsNil(t, err)
   231  	ItsEqual(t, obj.Category, verify.Category)
   232  
   233  	obj.Category = "test"
   234  
   235  	err = defaultDB().Invoke(OptTx(tx)).Upsert(obj)
   236  	ItsNil(t, err)
   237  
   238  	_, err = defaultDB().Invoke(OptTx(tx)).Get(&verify, obj.UUID)
   239  	ItsNil(t, err)
   240  	ItsEqual(t, obj.Category, verify.Category)
   241  }
   242  
   243  func Test_Invocation_Exists(t *testing.T) {
   244  	tx, err := defaultDB().BeginTx(context.Background())
   245  	ItsNil(t, err)
   246  	defer func() { _ = tx.Rollback() }()
   247  
   248  	err = seedObjects(10, tx)
   249  	ItsNil(t, err)
   250  
   251  	var first benchObj
   252  	_, err = defaultDB().Invoke(OptTx(tx)).Query("select * from bench_object").First(func(r Rows) error {
   253  		return first.Populate(r)
   254  	})
   255  	ItsNil(t, err)
   256  	ItsEqual(t, 1, first.ID)
   257  
   258  	exists, err := defaultDB().Invoke(OptTx(tx)).Exists(&first)
   259  	ItsNil(t, err)
   260  	ItsEqual(t, true, exists)
   261  
   262  	var invalid benchObj
   263  	exists, err = defaultDB().Invoke(OptTx(tx)).Exists(&invalid)
   264  	ItsNil(t, err)
   265  	ItsEqual(t, false, exists)
   266  }