github.com/condensat/bank-core@v0.1.0/database/query/withdrawtarget_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  	"reflect"
     9  	"testing"
    10  
    11  	"github.com/condensat/bank-core/database/model"
    12  	"github.com/condensat/bank-core/database/query/tests"
    13  )
    14  
    15  func TestAddWithdrawTarget(t *testing.T) {
    16  	const databaseName = "TestAddWithdrawTarget"
    17  	t.Parallel()
    18  
    19  	db := tests.Setup(databaseName, WithdrawModel())
    20  	defer tests.Teardown(db, databaseName)
    21  
    22  	data := createTestAccountStateData(db)
    23  	a1 := data.Accounts[0]
    24  	a2 := data.Accounts[2]
    25  
    26  	ref, _ := AddWithdraw(db, a1.ID, a2.ID, 0.1, model.BatchModeNormal, "{}")
    27  
    28  	type args struct {
    29  		withdrawID model.WithdrawID
    30  		dataType   model.WithdrawTargetType
    31  		data       model.WithdrawTargetData
    32  	}
    33  	tests := []struct {
    34  		name    string
    35  		args    args
    36  		want    model.WithdrawTarget
    37  		wantErr bool
    38  	}{
    39  		{"default", args{}, model.WithdrawTarget{}, true},
    40  		{"invalid_type", args{ref.ID, "", "{}"}, model.WithdrawTarget{}, true},
    41  
    42  		{"valid_data", args{ref.ID, model.WithdrawTargetOnChain, ""}, createWithdrawTarget(ref.ID, model.WithdrawTargetOnChain, "{}"), false},
    43  		{"valid", args{ref.ID, model.WithdrawTargetOnChain, "{}"}, createWithdrawTarget(ref.ID, model.WithdrawTargetOnChain, "{}"), false},
    44  	}
    45  	for _, tt := range tests {
    46  		tt := tt // capture range variable
    47  		t.Run(tt.name, func(t *testing.T) {
    48  			got, err := AddWithdrawTarget(db, tt.args.withdrawID, tt.args.dataType, tt.args.data)
    49  			if (err != nil) != tt.wantErr {
    50  				t.Errorf("AddWithdrawTarget() error = %v, wantErr %v", err, tt.wantErr)
    51  				return
    52  			}
    53  
    54  			tt.want.ID = got.ID
    55  			if !reflect.DeepEqual(got, tt.want) {
    56  				t.Errorf("AddWithdrawTarget() = %v, want %v", got, tt.want)
    57  			}
    58  		})
    59  	}
    60  }
    61  
    62  func TestGetWithdrawTarget(t *testing.T) {
    63  	const databaseName = "TestGetWithdrawTarget"
    64  	t.Parallel()
    65  
    66  	db := tests.Setup(databaseName, WithdrawModel())
    67  	defer tests.Teardown(db, databaseName)
    68  
    69  	data := createTestAccountStateData(db)
    70  	a1 := data.Accounts[0]
    71  	a2 := data.Accounts[2]
    72  
    73  	withdraw, _ := AddWithdraw(db, a1.ID, a2.ID, 0.1, model.BatchModeNormal, "{}")
    74  
    75  	ref, _ := AddWithdrawTarget(db, withdraw.ID, model.WithdrawTargetOnChain, "{}")
    76  
    77  	type args struct {
    78  		ID model.WithdrawTargetID
    79  	}
    80  	tests := []struct {
    81  		name    string
    82  		args    args
    83  		want    model.WithdrawTarget
    84  		wantErr bool
    85  	}{
    86  		{"default", args{}, model.WithdrawTarget{}, true},
    87  		{"ref", args{ref.ID}, ref, false},
    88  	}
    89  	for _, tt := range tests {
    90  		tt := tt // capture range variable
    91  		t.Run(tt.name, func(t *testing.T) {
    92  			got, err := GetWithdrawTarget(db, tt.args.ID)
    93  			if (err != nil) != tt.wantErr {
    94  				t.Errorf("GetWithdrawTarget() error = %v, wantErr %v", err, tt.wantErr)
    95  				return
    96  			}
    97  			if !reflect.DeepEqual(got, tt.want) {
    98  				t.Errorf("GetWithdrawTarget() = %v, want %v", got, tt.want)
    99  			}
   100  		})
   101  	}
   102  }
   103  
   104  func TestGetWithdrawTargetByWithdrawID(t *testing.T) {
   105  	const databaseName = "TestGetWithdrawTargetByWithdrawID"
   106  	t.Parallel()
   107  
   108  	db := tests.Setup(databaseName, WithdrawModel())
   109  	defer tests.Teardown(db, databaseName)
   110  
   111  	data := createTestAccountStateData(db)
   112  	a1 := data.Accounts[0]
   113  	a2 := data.Accounts[2]
   114  
   115  	withdraw, _ := AddWithdraw(db, a1.ID, a2.ID, 0.1, model.BatchModeNormal, "{}")
   116  
   117  	ref, _ := AddWithdrawTarget(db, withdraw.ID, model.WithdrawTargetOnChain, "{}")
   118  
   119  	type args struct {
   120  		withdrawID model.WithdrawID
   121  	}
   122  	tests := []struct {
   123  		name    string
   124  		args    args
   125  		want    model.WithdrawTarget
   126  		wantErr bool
   127  	}{
   128  		{"default", args{}, model.WithdrawTarget{}, true},
   129  		{"ref", args{withdraw.ID}, ref, false},
   130  	}
   131  	for _, tt := range tests {
   132  		tt := tt // capture range variable
   133  		t.Run(tt.name, func(t *testing.T) {
   134  			got, err := GetWithdrawTargetByWithdrawID(db, tt.args.withdrawID)
   135  			if (err != nil) != tt.wantErr {
   136  				t.Errorf("GetWithdrawTargetByWithdrawID() error = %v, wantErr %v", err, tt.wantErr)
   137  				return
   138  			}
   139  			if !reflect.DeepEqual(got, tt.want) {
   140  				t.Errorf("GetWithdrawTargetByWithdrawID() = %v, want %v", got, tt.want)
   141  			}
   142  		})
   143  	}
   144  }
   145  
   146  func createWithdrawTarget(withdrawID model.WithdrawID, dataType model.WithdrawTargetType, data model.WithdrawTargetData) model.WithdrawTarget {
   147  	return model.WithdrawTarget{
   148  		WithdrawID: withdrawID,
   149  		Type:       dataType,
   150  		Data:       data,
   151  	}
   152  }
   153  
   154  func TestGetLastWithdrawTargetByStatus(t *testing.T) {
   155  	const databaseName = "TestGetLastWithdrawTargetByStatus"
   156  	t.Parallel()
   157  
   158  	db := tests.Setup(databaseName, WithdrawModel())
   159  	defer tests.Teardown(db, databaseName)
   160  
   161  	data := createTestAccountStateData(db)
   162  	a1 := data.Accounts[0]
   163  	a2 := data.Accounts[2]
   164  
   165  	w1, _ := AddWithdraw(db, a1.ID, a2.ID, 0.1, model.BatchModeNormal, "{}")
   166  	wt1 := model.FromOnChainData(w1.ID, "bitcoin", model.WithdrawTargetOnChainData{
   167  		WithdrawTargetCryptoData: model.WithdrawTargetCryptoData{
   168  			PublicKey: "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
   169  		},
   170  	})
   171  	{
   172  		wt1, _ = AddWithdrawTarget(db, w1.ID, wt1.Type, wt1.Data)
   173  		_, _ = AddWithdrawInfo(db, w1.ID, model.WithdrawStatusCreated, "{}")
   174  	}
   175  
   176  	// add
   177  	w2, _ := AddWithdraw(db, a1.ID, a2.ID, 0.1, model.BatchModeNormal, "{}")
   178  	wt2 := model.FromOnChainData(w2.ID, "bitcoin", model.WithdrawTargetOnChainData{
   179  		WithdrawTargetCryptoData: model.WithdrawTargetCryptoData{
   180  			PublicKey: "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
   181  		},
   182  	})
   183  	{
   184  		wt2, _ = AddWithdrawTarget(db, w2.ID, wt2.Type, wt2.Data)
   185  		_, _ = AddWithdrawInfo(db, w2.ID, model.WithdrawStatusCreated, "{}")
   186  		_, _ = AddWithdrawInfo(db, w2.ID, model.WithdrawStatusProcessing, "{}")
   187  	}
   188  	type args struct {
   189  		status model.WithdrawStatus
   190  	}
   191  	tests := []struct {
   192  		name    string
   193  		args    args
   194  		want    []model.WithdrawTarget
   195  		wantErr bool
   196  	}{
   197  		{"default", args{}, nil, true},
   198  		{"invalid_status", args{""}, nil, true},
   199  
   200  		{"empty_status", args{model.WithdrawStatusSettled}, nil, false},
   201  		{"created", args{model.WithdrawStatusCreated}, []model.WithdrawTarget{wt1}, false},       // do not return wt2
   202  		{"processing", args{model.WithdrawStatusProcessing}, []model.WithdrawTarget{wt2}, false}, // do not return wt1
   203  	}
   204  	for _, tt := range tests {
   205  		tt := tt // capture range variable
   206  		t.Run(tt.name, func(t *testing.T) {
   207  			got, err := GetLastWithdrawTargetByStatus(db, tt.args.status)
   208  			if (err != nil) != tt.wantErr {
   209  				t.Errorf("GetLastWithdrawTargetByStatus() error = %v, wantErr %v", err, tt.wantErr)
   210  				return
   211  			}
   212  			if !reflect.DeepEqual(got, tt.want) {
   213  				t.Errorf("GetLastWithdrawTargetByStatus() = %v, want %v", got, tt.want)
   214  			}
   215  		})
   216  	}
   217  }