github.com/condensat/bank-core@v0.1.0/database/query/ssmaddress_test.go (about) 1 // Copyright 2020 Condensat Tech. All rights reserved. 2 // Use of this source code is governed by a MIT 3 // license that can be found in the LICENSE file. 4 5 package query 6 7 import ( 8 "fmt" 9 "reflect" 10 "testing" 11 "time" 12 13 "github.com/condensat/bank-core/database/model" 14 "github.com/condensat/bank-core/database/query/tests" 15 ) 16 17 func TestAddSsmAddress(t *testing.T) { 18 const databaseName = "TestAddSsmAddress" 19 t.Parallel() 20 21 db := tests.Setup(databaseName, SsmAddressModel()) 22 defer tests.Teardown(db, databaseName) 23 24 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 25 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 26 27 type args struct { 28 address model.SsmAddress 29 info model.SsmAddressInfo 30 } 31 tests := []struct { 32 name string 33 args args 34 wantErr bool 35 }{ 36 {"default", args{}, true}, 37 38 {"valid", args{address, info}, false}, 39 } 40 for _, tt := range tests { 41 tt := tt // capture range variable 42 t.Run(tt.name, func(t *testing.T) { 43 got, err := AddSsmAddress(db, tt.args.address, tt.args.info) 44 if (err != nil) != tt.wantErr { 45 t.Errorf("AddSsmAddress() error = %v, wantErr %v", err, tt.wantErr) 46 return 47 } 48 if got == 0 != tt.wantErr { 49 t.Errorf("AddSsmAddress() = invalid id %v", got) 50 } 51 }) 52 } 53 } 54 55 func TestCountSsmAddress(t *testing.T) { 56 const databaseName = "TestCountSsmAddress" 57 t.Parallel() 58 59 db := tests.Setup(databaseName, SsmAddressModel()) 60 defer tests.Teardown(db, databaseName) 61 62 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 63 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 64 65 _, _ = AddSsmAddress(db, address, info) 66 type args struct { 67 chain model.SsmChain 68 fingerprint model.SsmFingerprint 69 } 70 tests := []struct { 71 name string 72 args args 73 want int 74 wantErr bool 75 }{ 76 {"default", args{}, 0, true}, 77 {"invalidchain", args{"", info.Fingerprint}, 0, true}, 78 {"invalidfingerprint", args{info.Chain, ""}, 0, true}, 79 80 {"zero", args{info.Chain, "other"}, 0, false}, 81 {"one", args{info.Chain, info.Fingerprint}, 1, false}, 82 } 83 for _, tt := range tests { 84 tt := tt // capture range variable 85 t.Run(tt.name, func(t *testing.T) { 86 got, err := CountSsmAddress(db, tt.args.chain, tt.args.fingerprint) 87 if (err != nil) != tt.wantErr { 88 t.Errorf("CountSsmAddress() error = %v, wantErr %v", err, tt.wantErr) 89 return 90 } 91 if got != tt.want { 92 t.Errorf("CountSsmAddress() = %v, want %v", got, tt.want) 93 } 94 }) 95 } 96 } 97 98 func TestCountSsmAddressByState(t *testing.T) { 99 const databaseName = "TestCountSsmAddressByState" 100 t.Parallel() 101 102 db := tests.Setup(databaseName, SsmAddressModel()) 103 defer tests.Teardown(db, databaseName) 104 105 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 106 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 107 108 refID, err := AddSsmAddress(db, address, info) 109 if err != nil { 110 t.Errorf("AddSsmAddress failed. %s", err) 111 return 112 } 113 114 _, err = UpdateSsmAddressState(db, refID, model.SsmAddressStatusUsed) 115 if err != nil { 116 t.Errorf("UpdateSsmAddressState failed. %s", err) 117 return 118 } 119 120 type args struct { 121 chain model.SsmChain 122 fingerprint model.SsmFingerprint 123 state model.SsmAddressStatus 124 } 125 tests := []struct { 126 name string 127 args args 128 want int 129 wantErr bool 130 }{ 131 {"default", args{}, 0, true}, 132 {"unused", args{info.Chain, info.Fingerprint, model.SsmAddressStatusUsed}, 1, false}, 133 } 134 for _, tt := range tests { 135 tt := tt // capture range variable 136 t.Run(tt.name, func(t *testing.T) { 137 got, err := CountSsmAddressByState(db, tt.args.chain, tt.args.fingerprint, tt.args.state) 138 if (err != nil) != tt.wantErr { 139 t.Errorf("CountSsmAddressByState() error = %v, wantErr %v", err, tt.wantErr) 140 return 141 } 142 if got != tt.want { 143 t.Errorf("CountSsmAddressByState() = %v, want %v", got, tt.want) 144 } 145 }) 146 } 147 } 148 149 func TestGetSsmAddress(t *testing.T) { 150 const databaseName = "TestGetSsmAddress" 151 t.Parallel() 152 153 db := tests.Setup(databaseName, SsmAddressModel()) 154 defer tests.Teardown(db, databaseName) 155 156 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 157 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 158 159 refID, _ := AddSsmAddress(db, address, info) 160 ref := model.SsmAddress{ 161 ID: refID, 162 PublicAddress: address.PublicAddress, 163 ScriptPubkey: address.ScriptPubkey, 164 BlindingKey: address.BlindingKey, 165 } 166 167 type args struct { 168 addressID model.SsmAddressID 169 } 170 tests := []struct { 171 name string 172 args args 173 want model.SsmAddress 174 wantErr bool 175 }{ 176 {"default", args{}, model.SsmAddress{}, true}, 177 178 {"ref", args{refID}, ref, false}, 179 } 180 for _, tt := range tests { 181 tt := tt // capture range variable 182 t.Run(tt.name, func(t *testing.T) { 183 got, err := GetSsmAddress(db, tt.args.addressID) 184 if (err != nil) != tt.wantErr { 185 t.Errorf("GetSsmAddress() error = %v, wantErr %v", err, tt.wantErr) 186 return 187 } 188 if !reflect.DeepEqual(got, tt.want) { 189 t.Errorf("GetSsmAddress() = %v, want %v", got, tt.want) 190 } 191 }) 192 } 193 } 194 195 func TestGetSsmAddressInfo(t *testing.T) { 196 const databaseName = "TestGetSsmAddressInfo" 197 t.Parallel() 198 199 db := tests.Setup(databaseName, SsmAddressModel()) 200 defer tests.Teardown(db, databaseName) 201 202 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 203 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 204 205 refID, _ := AddSsmAddress(db, address, info) 206 ref := model.SsmAddressInfo{ 207 SsmAddressID: refID, 208 Chain: info.Chain, 209 Fingerprint: info.Fingerprint, 210 HDPath: info.HDPath, 211 } 212 213 type args struct { 214 addressID model.SsmAddressID 215 } 216 tests := []struct { 217 name string 218 args args 219 want model.SsmAddressInfo 220 wantErr bool 221 }{ 222 {"default", args{}, model.SsmAddressInfo{}, true}, 223 224 {"ref", args{refID}, ref, false}, 225 } 226 for _, tt := range tests { 227 tt := tt // capture range variable 228 t.Run(tt.name, func(t *testing.T) { 229 got, err := GetSsmAddressInfo(db, tt.args.addressID) 230 if (err != nil) != tt.wantErr { 231 t.Errorf("GetSsmAddressInfo() error = %v, wantErr %v", err, tt.wantErr) 232 return 233 } 234 if !reflect.DeepEqual(got, tt.want) { 235 t.Errorf("GetSsmAddressInfo() = %v, want %v", got, tt.want) 236 } 237 }) 238 } 239 } 240 241 func TestNextSsmAddressID(t *testing.T) { 242 const databaseName = "TestNextSsmAddressID" 243 t.Parallel() 244 245 db := tests.Setup(databaseName, SsmAddressModel()) 246 defer tests.Teardown(db, databaseName) 247 248 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 249 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 250 nextID, _ := AddSsmAddress(db, address, info) 251 252 for i := 0; i < 10; i++ { 253 address.PublicAddress = model.SsmPublicAddress(fmt.Sprintf("foo_%d", i)) 254 _, _ = AddSsmAddress(db, address, info) 255 } 256 257 type args struct { 258 chain model.SsmChain 259 fingerprint model.SsmFingerprint 260 } 261 tests := []struct { 262 name string 263 args args 264 want model.SsmAddressID 265 wantErr bool 266 }{ 267 {"default", args{}, 0, true}, 268 {"none", args{"none", info.Fingerprint}, 0, true}, 269 270 {"next", args{info.Chain, info.Fingerprint}, nextID, false}, 271 } 272 for _, tt := range tests { 273 tt := tt // capture range variable 274 t.Run(tt.name, func(t *testing.T) { 275 got, err := NextSsmAddressID(db, tt.args.chain, tt.args.fingerprint) 276 if (err != nil) != tt.wantErr { 277 t.Errorf("NextSsmAddressInfo() error = %v, wantErr %v", err, tt.wantErr) 278 return 279 } 280 if !reflect.DeepEqual(got, tt.want) { 281 t.Errorf("NextSsmAddressInfo() = %v, want %v", got, tt.want) 282 } 283 }) 284 } 285 } 286 287 func TestGetSsmAddressByPublicAddress(t *testing.T) { 288 const databaseName = "TestGetSsmAddressByPublicAddress" 289 t.Parallel() 290 291 db := tests.Setup(databaseName, SsmAddressModel()) 292 defer tests.Teardown(db, databaseName) 293 294 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 295 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 296 297 refID, _ := AddSsmAddress(db, address, info) 298 ref := model.SsmAddress{ 299 ID: refID, 300 PublicAddress: address.PublicAddress, 301 ScriptPubkey: address.ScriptPubkey, 302 BlindingKey: address.BlindingKey, 303 } 304 305 type args struct { 306 publicAddress model.SsmPublicAddress 307 } 308 tests := []struct { 309 name string 310 args args 311 want model.SsmAddress 312 wantErr bool 313 }{ 314 {"default", args{}, model.SsmAddress{}, true}, 315 316 {"ref", args{address.PublicAddress}, ref, false}, 317 } 318 for _, tt := range tests { 319 tt := tt // capture range variable 320 t.Run(tt.name, func(t *testing.T) { 321 got, err := GetSsmAddressByPublicAddress(db, tt.args.publicAddress) 322 if (err != nil) != tt.wantErr { 323 t.Errorf("GetSsmAddressByPublicAddress() error = %v, wantErr %v", err, tt.wantErr) 324 return 325 } 326 if !reflect.DeepEqual(got, tt.want) { 327 t.Errorf("GetSsmAddressByPublicAddress() = %v, want %v", got, tt.want) 328 } 329 }) 330 } 331 } 332 333 func TestGetSsmAddressState(t *testing.T) { 334 const databaseName = "TestGetSsmAddressState" 335 t.Parallel() 336 337 db := tests.Setup(databaseName, SsmAddressModel()) 338 defer tests.Teardown(db, databaseName) 339 340 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 341 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 342 343 refID, _ := AddSsmAddress(db, address, info) 344 refUnused := model.SsmAddressState{ 345 ID: 0, 346 SsmAddressID: refID, 347 State: model.SsmAddressStatusUnused, 348 } 349 350 type args struct { 351 addressID model.SsmAddressID 352 } 353 tests := []struct { 354 name string 355 args args 356 want model.SsmAddressState 357 wantErr bool 358 }{ 359 {"default", args{}, model.SsmAddressState{}, true}, 360 361 {"ref", args{refID}, refUnused, false}, 362 } 363 for _, tt := range tests { 364 tt := tt // capture range variable 365 t.Run(tt.name, func(t *testing.T) { 366 got, err := GetSsmAddressState(db, tt.args.addressID) 367 if (err != nil) != tt.wantErr { 368 t.Errorf("GetSsmAddressState() error = %v, wantErr %v", err, tt.wantErr) 369 return 370 } 371 372 got.ID = 0 373 got.Timestamp = time.Time{} 374 if !reflect.DeepEqual(got, tt.want) { 375 t.Errorf("GetSsmAddressState() = %v, want %v", got, tt.want) 376 } 377 }) 378 } 379 } 380 381 func TestUpdateSsmAddressState(t *testing.T) { 382 const databaseName = "TestUpdateSsmAddressState" 383 t.Parallel() 384 385 db := tests.Setup(databaseName, SsmAddressModel()) 386 defer tests.Teardown(db, databaseName) 387 388 address := model.SsmAddress{ID: 0, PublicAddress: "foo", ScriptPubkey: "bar", BlindingKey: "foobar"} 389 info := model.SsmAddressInfo{SsmAddressID: 42, Chain: "chain", Fingerprint: "ffffffff", HDPath: "path"} 390 391 refID, _ := AddSsmAddress(db, address, info) 392 refUsed := model.SsmAddressState{ 393 ID: 0, 394 SsmAddressID: refID, 395 State: model.SsmAddressStatusUsed, 396 } 397 398 type args struct { 399 addressID model.SsmAddressID 400 status model.SsmAddressStatus 401 } 402 tests := []struct { 403 name string 404 args args 405 want model.SsmAddressState 406 wantErr bool 407 }{ 408 {"default", args{}, model.SsmAddressState{}, true}, 409 410 {"ref", args{refID, model.SsmAddressStatusUsed}, refUsed, false}, 411 } 412 for _, tt := range tests { 413 tt := tt // capture range variable 414 t.Run(tt.name, func(t *testing.T) { 415 got, err := UpdateSsmAddressState(db, tt.args.addressID, tt.args.status) 416 if (err != nil) != tt.wantErr { 417 t.Errorf("UpdateSsmAddressState() error = %v, wantErr %v", err, tt.wantErr) 418 return 419 } 420 421 got.ID = 0 422 got.Timestamp = time.Time{} 423 if !reflect.DeepEqual(got, tt.want) { 424 t.Errorf("UpdateSsmAddressState() = %v, want %v", got, tt.want) 425 } 426 }) 427 } 428 }