diff --git a/common/transaction/nodeRegistrationUpdate.go b/common/transaction/nodeRegistrationUpdate.go index 06ee3dad2..a64dfba70 100644 --- a/common/transaction/nodeRegistrationUpdate.go +++ b/common/transaction/nodeRegistrationUpdate.go @@ -143,29 +143,28 @@ ApplyUnconfirmed is func that for applying to unconfirmed Transaction `UpdateNod func (tx *UpdateNodeRegistration) ApplyUnconfirmed() error { var ( - err error - prevNodeRegistration *model.NodeRegistration effectiveBalanceToLock int64 + nodeReg model.NodeRegistration + err error + row *sql.Row ) // update sender balance by reducing his spendable balance of the tx fee + new balance to be lock - // (delta between old locked balance and updatee locked balance) + // (delta between old locked balance and update locked balance) if tx.Body.LockedBalance > 0 { - // get the latest noderegistration by owner (sender account) + // get the latest node registration by owner (sender account) qry, args := tx.NodeRegistrationQuery.GetNodeRegistrationByAccountAddress(tx.SenderAddress) - rows, err := tx.QueryExecutor.ExecuteSelect(qry, false, args...) + row, _ = tx.QueryExecutor.ExecuteSelectRow(qry, false, args...) + err = tx.NodeRegistrationQuery.Scan(&nodeReg, row) if err != nil { - return err - } - defer rows.Close() - nr, err := tx.NodeRegistrationQuery.BuildModel([]*model.NodeRegistration{}, rows) - if (err != nil) || len(nr) == 0 { + if err != sql.ErrNoRows { + return err + } return blocker.NewBlocker(blocker.AppErr, "NodeNotFoundWithAccountAddress") } - prevNodeRegistration = nr[0] // delta amount to be locked - effectiveBalanceToLock = tx.Body.LockedBalance - prevNodeRegistration.LockedBalance + effectiveBalanceToLock = tx.Body.GetLockedBalance() - nodeReg.GetLockedBalance() } accountBalanceSenderQ, accountBalanceSenderQArgs := tx.AccountBalanceQuery.AddAccountSpendableBalance( diff --git a/common/transaction/nodeRegistrationUpdate_test.go b/common/transaction/nodeRegistrationUpdate_test.go index 026a00f43..1b879c7e0 100644 --- a/common/transaction/nodeRegistrationUpdate_test.go +++ b/common/transaction/nodeRegistrationUpdate_test.go @@ -5,6 +5,7 @@ import ( "errors" "reflect" "regexp" + "strings" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -85,16 +86,11 @@ func (*mockExecutorValidateFailNodeDeleted) ExecuteSelect(qe string, tx bool, ar return nil, nil } -func (*mockExecutorValidateFailNodeNotFoundRU) ExecuteSelect(qe string, tx bool, args ...interface{}) (*sql.Rows, error) { +func (*mockExecutorValidateFailNodeNotFoundRU) ExecuteSelectRow(qe string, _ bool, _ ...interface{}) (*sql.Row, error) { db, mock, _ := sqlmock.New() defer db.Close() - if qe == "SELECT id, node_public_key, account_address, registration_height, node_address,"+ - " locked_balance, registration_status, latest, height FROM node_registry WHERE account_address = ? AND latest=1 "+ - "ORDER BY height DESC LIMIT 1" { - mock.ExpectQuery("").WillReturnRows(sqlmock.NewRows([]string{})) - return db.Query("") - } - return nil, nil + mock.ExpectQuery("SELECT").WillReturnRows(mock.NewRows(query.NewNodeRegistrationQuery().Fields)) + return db.QueryRow(qe), nil } func (*mockExecutorValidateFailNodeAlreadyRegisteredRU) ExecuteSelect(qe string, tx bool, args ...interface{}) (*sql.Rows, error) { @@ -306,22 +302,36 @@ func (*mockExecutorValidateSuccessRU) ExecuteSelect(qe string, tx bool, args ... func (*mockExecutorValidateSuccessRU) ExecuteSelectRow(qStr string, tx bool, args ...interface{}) (*sql.Row, error) { db, mock, _ := sqlmock.New() - mock.ExpectQuery(regexp.QuoteMeta(qStr)). - WillReturnRows(sqlmock.NewRows([]string{ - "account_address", - "block_height", - "spendable_balance", - "balance", - "pop_revenue", - "latest", - }).AddRow( + defer db.Close() + + var mockedRows *sqlmock.Rows + switch { + case strings.Contains(qStr, "account_balance"): + mockedRows = mock.NewRows(query.NewAccountBalanceQuery().Fields) + mockedRows.AddRow( senderAddress1, uint32(1), int64(1000000000000), int64(1000000000000), int64(100000000), true, - )) + ) + default: + mockedRows = mock.NewRows(query.NewNodeRegistrationQuery().Fields) + mockedRows.AddRow( + int64(10000), + nodePubKey1, + senderAddress1, + uint32(1), + "10.10.10.10", + int64(1000), + model.NodeRegistrationState_NodeRegistered, + true, + uint32(1), + ) + } + mock.ExpectQuery(regexp.QuoteMeta(qStr)). + WillReturnRows(mockedRows) return db.QueryRow(qStr), nil } diff --git a/common/transaction/removeNodeRegistration.go b/common/transaction/removeNodeRegistration.go index bbd8572c0..5ae51cb84 100644 --- a/common/transaction/removeNodeRegistration.go +++ b/common/transaction/removeNodeRegistration.go @@ -150,24 +150,29 @@ func (tx *RemoveNodeRegistration) UndoApplyUnconfirmed() error { // Validate validate node registration transaction and tx body func (tx *RemoveNodeRegistration) Validate(dbTx bool) error { var ( - nodeRegistrations []*model.NodeRegistration + nodeReg model.NodeRegistration + err error + row *sql.Row ) + // check for duplication - nodeRow, err := tx.QueryExecutor.ExecuteSelect(tx.NodeRegistrationQuery.GetNodeRegistrationByNodePublicKey(), dbTx, tx.Body.NodePublicKey) + row, err = tx.QueryExecutor.ExecuteSelectRow(tx.NodeRegistrationQuery.GetNodeRegistrationByNodePublicKey(), dbTx, tx.Body.GetNodePublicKey()) if err != nil { return err } - defer nodeRow.Close() - nodeRegistrations, err = tx.NodeRegistrationQuery.BuildModel(nodeRegistrations, nodeRow) - if (err != nil) || len(nodeRegistrations) == 0 { + err = tx.NodeRegistrationQuery.Scan(&nodeReg, row) + if err != nil { + if err != sql.ErrNoRows { + return err + } return blocker.NewBlocker(blocker.AppErr, "NodeNotRegistered") } - nr := nodeRegistrations[0] + // sender must be node owner - if tx.SenderAddress != nr.AccountAddress { + if tx.SenderAddress != nodeReg.GetAccountAddress() { return blocker.NewBlocker(blocker.AuthErr, "AccountNotNodeOwner") } - if nr.RegistrationStatus == uint32(model.NodeRegistrationState_NodeDeleted) { + if nodeReg.GetRegistrationStatus() == uint32(model.NodeRegistrationState_NodeDeleted) { return blocker.NewBlocker(blocker.AuthErr, "NodeAlreadyDeleted") } return nil diff --git a/common/transaction/removeNodeRegistration_test.go b/common/transaction/removeNodeRegistration_test.go index 6b9652ff4..cf4b14d50 100644 --- a/common/transaction/removeNodeRegistration_test.go +++ b/common/transaction/removeNodeRegistration_test.go @@ -114,81 +114,47 @@ func (*mockExecutorApplyUnconfirmedRemoveNodeRegistrationFail) ExecuteTransactio return errors.New("MockdeError") } -func (*mockExecutorValidateRemoveNodeRegistrationSuccess) ExecuteSelect(qe string, tx bool, - args ...interface{}) (*sql.Rows, error) { +func (*mockExecutorValidateRemoveNodeRegistrationSuccess) ExecuteSelectRow(qe string, _ bool, _ ...interface{}) (*sql.Row, error) { body, _ := GetFixturesForRemoveNoderegistration() db, mock, _ := sqlmock.New() defer db.Close() - if qe == "SELECT id, node_public_key, account_address, registration_height, node_address, locked_balance, registration_status,"+ - " latest, height FROM node_registry WHERE node_public_key = ? AND latest=1 ORDER BY height DESC LIMIT 1" { - mock.ExpectQuery("A").WillReturnRows(sqlmock.NewRows([]string{ - "NodeID", - "NodePublicKey", - "AccountAddress", - "RegistrationHeight", - "NodeAddress", - "LockedBalance", - "RegistrationStatus", - "Latest", - "Height", - }).AddRow( - 0, - body.NodePublicKey, - "BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN", - 1, - "10.10.10.10", - 1, - 1, - 1, - 1, - )) - return db.Query("A") - } - return nil, nil + mock.ExpectQuery("SELECT").WillReturnRows(mock.NewRows(query.NewNodeRegistrationQuery().Fields).AddRow( + 0, + body.NodePublicKey, + "BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN", + 1, + "10.10.10.10", + 1, + 1, + 1, + 1, + )) + + return db.QueryRow(qe), nil } -func (*mockExecutorValidateRemoveNodeRegistrationFailNodeAlreadyDeleted) ExecuteSelect(qe string, tx bool, - args ...interface{}) (*sql.Rows, error) { +func (*mockExecutorValidateRemoveNodeRegistrationFailNodeAlreadyDeleted) ExecuteSelectRow(qe string, _ bool, _ ...interface{}) (*sql.Row, error) { body, _ := GetFixturesForRemoveNoderegistration() db, mock, _ := sqlmock.New() defer db.Close() - if qe == "SELECT id, node_public_key, account_address, registration_height, node_address, locked_balance, registration_status,"+ - " latest, height FROM node_registry WHERE node_public_key = ? AND latest=1 ORDER BY height DESC LIMIT 1" { - mock.ExpectQuery("A").WillReturnRows(sqlmock.NewRows([]string{ - "NodeID", - "NodePublicKey", - "AccountAddress", - "RegistrationHeight", - "NodeAddress", - "LockedBalance", - "RegistrationStatus", - "Latest", - "Height", - }).AddRow( - 0, - body.NodePublicKey, - "BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN", - 1, - "10.10.10.10", - 1, - uint32(model.NodeRegistrationState_NodeDeleted), - 1, - 1, - )) - return db.Query("A") - } - return nil, nil + mock.ExpectQuery("SELECT").WillReturnRows(mock.NewRows(query.NewNodeRegistrationQuery().Fields).AddRow( + 0, + body.NodePublicKey, + "BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN", + 1, + "10.10.10.10", + 1, + uint32(model.NodeRegistrationState_NodeDeleted), + 1, + 1, + )) + return db.QueryRow(qe), nil } -func (*mockExecutorValidateRemoveNodeRegistrationFailGetRNode) ExecuteSelect(qe string, tx bool, - args ...interface{}) (*sql.Rows, error) { - if qe == "SELECT id, node_public_key, account_address, registration_height, node_address, locked_balance, registration_status,"+ - " latest, height FROM node_registry WHERE node_public_key = ? AND latest=1 ORDER BY height DESC LIMIT 1" { - return nil, errors.New("MockedError") - } - return nil, nil +func (*mockExecutorValidateRemoveNodeRegistrationFailGetRNode) ExecuteSelectRow(qe string, _ bool, _ ...interface{}) (*sql.Row, error) { + return nil, errors.New("MockedError") } func (*mockExecutorApplyConfirmedRemoveNodeRegistrationSuccess) ExecuteSelectRow(qe string, _ bool, _ ...interface{}) (*sql.Row, error) {