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 }