github.com/adecaro/fabric-ca@v2.0.0-alpha+incompatible/lib/server/idemix/creddbaccessor_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package idemix_test
     8  
     9  import (
    10  	"fmt"
    11  	"testing"
    12  	"time"
    13  
    14  	. "github.com/hyperledger/fabric-ca/lib/server/idemix"
    15  	dmocks "github.com/hyperledger/fabric-ca/lib/server/idemix/mocks"
    16  	"github.com/kisielk/sqlstruct"
    17  	"github.com/pkg/errors"
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  func TestInsertCredentialNilDB(t *testing.T) {
    22  	credRecord := getCredRecord()
    23  
    24  	var db *dmocks.FabricCADB
    25  	accessor := NewCredentialAccessor(db, 1)
    26  	err := accessor.InsertCredential(credRecord)
    27  	assert.Error(t, err)
    28  	assert.Equal(t, "Database is not set", err.Error())
    29  }
    30  
    31  func TestInsertCredential(t *testing.T) {
    32  	credRecord := getCredRecord()
    33  	result := new(dmocks.Result)
    34  	result.On("RowsAffected").Return(int64(1), nil)
    35  	db := new(dmocks.FabricCADB)
    36  	db.On("NamedExec", "InsertCredential", InsertCredentialSQL, credRecord).Return(result, nil)
    37  	db.On("Rebind", InsertCredentialSQL).Return(InsertCredentialSQL)
    38  	accessor := NewCredentialAccessor(nil, 1)
    39  	accessor.SetDB(db)
    40  	err := accessor.InsertCredential(credRecord)
    41  	assert.NoError(t, err)
    42  }
    43  
    44  func TestInsertCredentialNoRowsAffected(t *testing.T) {
    45  	credRecord := getCredRecord()
    46  	result := new(dmocks.Result)
    47  	result.On("RowsAffected").Return(int64(0), nil)
    48  	db := new(dmocks.FabricCADB)
    49  	db.On("NamedExec", "InsertCredential", InsertCredentialSQL, credRecord).Return(result, nil)
    50  	db.On("Rebind", InsertCredentialSQL).Return(InsertCredentialSQL)
    51  	accessor := NewCredentialAccessor(db, 1)
    52  	err := accessor.InsertCredential(credRecord)
    53  	assert.Error(t, err)
    54  	assert.Equal(t, "Failed to insert the credential record; no rows affected", err.Error())
    55  }
    56  
    57  func TestInsertCredentialTwoRowsAffected(t *testing.T) {
    58  	credRecord := getCredRecord()
    59  	result := new(dmocks.Result)
    60  	result.On("RowsAffected").Return(int64(2), nil)
    61  	db := new(dmocks.FabricCADB)
    62  	db.On("NamedExec", "InsertCredential", InsertCredentialSQL, credRecord).Return(result, nil)
    63  	db.On("Rebind", InsertCredentialSQL).Return(InsertCredentialSQL)
    64  	accessor := NewCredentialAccessor(db, 1)
    65  	err := accessor.InsertCredential(credRecord)
    66  	assert.Error(t, err)
    67  	assert.Contains(t, err.Error(), "Expected to affect 1 entry in credentials table but affected")
    68  }
    69  
    70  func TestInsertCredentialExecError(t *testing.T) {
    71  	credRecord := getCredRecord()
    72  	db := new(dmocks.FabricCADB)
    73  	db.On("NamedExec", "InsertCredential", InsertCredentialSQL, credRecord).Return(nil, errors.New("Exec error"))
    74  	db.On("Rebind", InsertCredentialSQL).Return(InsertCredentialSQL)
    75  	accessor := NewCredentialAccessor(db, 1)
    76  	err := accessor.InsertCredential(credRecord)
    77  	assert.Error(t, err)
    78  	assert.Contains(t, err.Error(), "Failed to insert credential into datastore")
    79  }
    80  
    81  func TestGetCredentialsByIDNilDB(t *testing.T) {
    82  	var db *dmocks.FabricCADB
    83  	accessor := NewCredentialAccessor(db, 1)
    84  	_, err := accessor.GetCredentialsByID("1")
    85  	assert.Error(t, err)
    86  	assert.Equal(t, "Database is not set", err.Error())
    87  }
    88  
    89  func TestGetCredentialsByIDSelectError(t *testing.T) {
    90  	db := new(dmocks.FabricCADB)
    91  	db.On("Rebind", SelectCredentialByIDSQL).Return(SelectCredentialByIDSQL)
    92  	crs := []CredRecord{}
    93  	q := fmt.Sprintf(SelectCredentialByIDSQL, sqlstruct.Columns(CredRecord{}))
    94  	f := getCredSelectFunc(t, true)
    95  	db.On("Select", "GetCredentialsByID", &crs, q, "foo").Return(f)
    96  	accessor := NewCredentialAccessor(db, 1)
    97  	_, err := accessor.GetCredentialsByID("foo")
    98  	assert.Error(t, err)
    99  }
   100  
   101  func TestGetCredentialsByID(t *testing.T) {
   102  	db := new(dmocks.FabricCADB)
   103  	db.On("Rebind", SelectCredentialByIDSQL).Return(SelectCredentialByIDSQL)
   104  	crs := []CredRecord{}
   105  	q := fmt.Sprintf(SelectCredentialByIDSQL, sqlstruct.Columns(CredRecord{}))
   106  	f := getCredSelectFunc(t, false)
   107  	db.On("Select", "GetCredentialsByID", &crs, q, "foo").Return(f)
   108  	accessor := NewCredentialAccessor(db, 1)
   109  	rcrs, err := accessor.GetCredentialsByID("foo")
   110  	assert.NoError(t, err)
   111  	assert.Equal(t, 1, len(rcrs))
   112  }
   113  
   114  func TestGetCredentialNilDB(t *testing.T) {
   115  	var db *dmocks.FabricCADB
   116  	accessor := NewCredentialAccessor(db, 1)
   117  	_, err := accessor.GetCredential("1")
   118  	assert.Error(t, err)
   119  	assert.Equal(t, "Database is not set", err.Error())
   120  }
   121  
   122  func TestGetCredentialSelectError(t *testing.T) {
   123  	db := new(dmocks.FabricCADB)
   124  	db.On("Rebind", SelectCredentialSQL).Return(SelectCredentialSQL)
   125  	cr := CredRecord{}
   126  	q := fmt.Sprintf(SelectCredentialSQL, sqlstruct.Columns(CredRecord{}))
   127  	db.On("Select", "GetCredential", &cr, q, "1").Return(errors.New("Select error"))
   128  	accessor := NewCredentialAccessor(db, 1)
   129  	_, err := accessor.GetCredential("1")
   130  	assert.Error(t, err)
   131  }
   132  
   133  func TestGetCredential(t *testing.T) {
   134  	db := new(dmocks.FabricCADB)
   135  	db.On("Rebind", SelectCredentialSQL).Return(SelectCredentialSQL)
   136  	cr := CredRecord{}
   137  	q := fmt.Sprintf(SelectCredentialSQL, sqlstruct.Columns(CredRecord{}))
   138  	db.On("Select", "GetCredential", &cr, q, "1").Return(nil)
   139  	accessor := NewCredentialAccessor(db, 1)
   140  	_, err := accessor.GetCredential("1")
   141  	assert.NoError(t, err)
   142  }
   143  
   144  func TestGetRevokedCredentialsNilDB(t *testing.T) {
   145  	var db *dmocks.FabricCADB
   146  	accessor := NewCredentialAccessor(db, 1)
   147  	_, err := accessor.GetRevokedCredentials()
   148  	assert.Error(t, err)
   149  	assert.Equal(t, "Database is not set", err.Error())
   150  }
   151  
   152  func TestGetRevokedCredentialsSelectError(t *testing.T) {
   153  	db := new(dmocks.FabricCADB)
   154  	db.On("Rebind", SelectRevokedCredentialSQL).Return(SelectRevokedCredentialSQL)
   155  	q := fmt.Sprintf(SelectRevokedCredentialSQL, sqlstruct.Columns(CredRecord{}))
   156  	cr := []CredRecord{}
   157  	db.On("Select", "GetRevokedCredentials", &cr, q).Return(errors.New("Failed to get revoked credentials"))
   158  	accessor := NewCredentialAccessor(db, 1)
   159  	_, err := accessor.GetRevokedCredentials()
   160  	assert.Error(t, err)
   161  }
   162  
   163  func TestGetRevokedCredentials(t *testing.T) {
   164  	db := new(dmocks.FabricCADB)
   165  	db.On("Rebind", SelectRevokedCredentialSQL).Return(SelectRevokedCredentialSQL)
   166  	q := fmt.Sprintf(SelectRevokedCredentialSQL, sqlstruct.Columns(CredRecord{}))
   167  	cr := []CredRecord{}
   168  	db.On("Select", "GetRevokedCredentials", &cr, q).Return(nil)
   169  	accessor := NewCredentialAccessor(db, 1)
   170  	_, err := accessor.GetRevokedCredentials()
   171  	assert.NoError(t, err)
   172  }
   173  
   174  func getCredSelectFunc(t *testing.T, isError bool) func(string, interface{}, string, ...interface{}) error {
   175  	return func(funcName string, dest interface{}, query string, args ...interface{}) error {
   176  		crs := dest.(*[]CredRecord)
   177  		cr := getCredRecord()
   178  		*crs = append(*crs, cr)
   179  		if isError {
   180  			return errors.New("Failed to get credentials from DB")
   181  		}
   182  		return nil
   183  	}
   184  }
   185  
   186  func getCredRecord() CredRecord {
   187  	return CredRecord{
   188  		ID:               "foo",
   189  		CALabel:          "",
   190  		Expiry:           time.Now(),
   191  		Level:            1,
   192  		Reason:           0,
   193  		Status:           "good",
   194  		RevocationHandle: "1",
   195  		Cred:             "blah",
   196  	}
   197  }