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 }