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  }