github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/issuecredential/rfc0593/middleware_test.go (about) 1 /* 2 Copyright SecureKey Technologies Inc. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package rfc0593_test 8 9 import ( 10 "encoding/json" 11 "errors" 12 "testing" 13 14 "github.com/google/uuid" 15 "github.com/stretchr/testify/require" 16 17 "github.com/hyperledger/aries-framework-go/pkg/client/issuecredential/rfc0593" 18 "github.com/hyperledger/aries-framework-go/pkg/didcomm/common/service" 19 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/decorator" 20 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/issuecredential" 21 mockprovider "github.com/hyperledger/aries-framework-go/pkg/mock/provider" 22 mockstorage "github.com/hyperledger/aries-framework-go/pkg/mock/storage" 23 ) 24 25 func TestMiddleware(t *testing.T) { 26 t.Run("saves options from request-credential", func(t *testing.T) { 27 store := &mockstorage.MockStore{Store: make(map[string]mockstorage.DBEntry)} 28 mw, err := rfc0593.NewMiddleware(&mockProvider{sp: &mockstorage.MockStoreProvider{Store: store}}) 29 require.NoError(t, err) 30 31 expected := randomCredSpec(t) 32 attachID := uuid.New().String() 33 34 thid := uuid.New().String() 35 msg := service.NewDIDCommMsgMap(&issuecredential.RequestCredentialV2{ 36 Type: issuecredential.RequestCredentialMsgTypeV2, 37 Formats: []issuecredential.Format{{ 38 AttachID: attachID, 39 Format: rfc0593.ProofVCDetailFormat, 40 }}, 41 RequestsAttach: []decorator.Attachment{{ 42 ID: attachID, 43 Data: decorator.AttachmentData{ 44 JSON: expected, 45 }, 46 }}, 47 }) 48 msg.SetID(thid) 49 50 nextCalled := false 51 52 next := &mockHandler{ 53 handleFunc: func(md issuecredential.Metadata) error { 54 nextCalled = true 55 56 return nil 57 }, 58 } 59 60 err = mw(next).Handle(&mockMetadata{ 61 msg: msg, 62 }) 63 require.NoError(t, err) 64 65 raw, err := store.Get(thid) 66 require.NoError(t, err) 67 68 result := &rfc0593.CredentialSpecOptions{} 69 70 err = json.Unmarshal(raw, result) 71 require.NoError(t, err) 72 require.Equal(t, expected.Options, result) 73 require.True(t, nextCalled) 74 }) 75 76 t.Run("forwards to next for other messages", func(t *testing.T) { 77 mw, err := rfc0593.NewMiddleware(agent(t)) 78 require.NoError(t, err) 79 80 msg := service.NewDIDCommMsgMap(&issuecredential.ProposeCredentialV2{ 81 Type: issuecredential.ProposeCredentialMsgTypeV2, 82 Formats: []issuecredential.Format{{ 83 AttachID: "123", 84 Format: rfc0593.ProofVCDetailFormat, 85 }}, 86 FiltersAttach: []decorator.Attachment{{ 87 ID: "123", 88 Data: decorator.AttachmentData{ 89 JSON: randomCredSpec(t), 90 }, 91 }}, 92 }) 93 require.NoError(t, err) 94 95 nextCalled := false 96 97 next := &mockHandler{ 98 handleFunc: func(md issuecredential.Metadata) error { 99 nextCalled = true 100 101 return nil 102 }, 103 } 104 105 err = mw(next).Handle(&mockMetadata{ 106 msg: msg, 107 }) 108 require.NoError(t, err) 109 require.True(t, nextCalled) 110 }) 111 112 t.Run("forwards to next is RFC0593 is not applicable", func(t *testing.T) { 113 mw, err := rfc0593.NewMiddleware(agent(t)) 114 require.NoError(t, err) 115 116 msg := service.NewDIDCommMsgMap(&issuecredential.RequestCredentialV2{ 117 Type: issuecredential.RequestCredentialMsgTypeV2, 118 Formats: []issuecredential.Format{{ 119 AttachID: "123", 120 Format: "SOME_OTHER_FORMAT", 121 }}, 122 RequestsAttach: []decorator.Attachment{{ 123 ID: "123", 124 Data: decorator.AttachmentData{ 125 JSON: randomCredSpec(t), 126 }, 127 }}, 128 }) 129 require.NoError(t, err) 130 131 nextCalled := false 132 133 next := &mockHandler{ 134 handleFunc: func(md issuecredential.Metadata) error { 135 nextCalled = true 136 137 return nil 138 }, 139 } 140 141 err = mw(next).Handle(&mockMetadata{ 142 msg: msg, 143 }) 144 require.NoError(t, err) 145 require.True(t, nextCalled) 146 }) 147 148 t.Run("error if cannot save to storage", func(t *testing.T) { 149 expected := errors.New("test") 150 151 provider := &mockProvider{ 152 sp: &mockstorage.MockStoreProvider{ 153 Store: &mockstorage.MockStore{ 154 ErrPut: expected, 155 }, 156 }, 157 } 158 mw, err := rfc0593.NewMiddleware(provider) 159 require.NoError(t, err) 160 161 msg := service.NewDIDCommMsgMap(&issuecredential.RequestCredentialV2{ 162 Type: issuecredential.RequestCredentialMsgTypeV2, 163 Formats: []issuecredential.Format{{ 164 AttachID: "123", 165 Format: rfc0593.ProofVCDetailFormat, 166 }}, 167 RequestsAttach: []decorator.Attachment{{ 168 ID: "123", 169 Data: decorator.AttachmentData{ 170 JSON: randomCredSpec(t), 171 }, 172 }}, 173 }) 174 msg.SetID(uuid.New().String()) 175 176 err = mw(nil).Handle(&mockMetadata{ 177 msg: msg, 178 }) 179 require.ErrorIs(t, err, expected) 180 }) 181 182 t.Run("error if cannot open store", func(t *testing.T) { 183 expected := errors.New("test") 184 185 provider := &mockProvider{ 186 sp: &mockstorage.MockStoreProvider{ 187 ErrOpenStoreHandle: expected, 188 }, 189 } 190 _, err := rfc0593.NewMiddleware(provider) 191 require.ErrorIs(t, err, expected) 192 }) 193 } 194 195 func TestRegisterMiddleware(t *testing.T) { 196 t.Run("registers middleware", func(t *testing.T) { 197 mw, err := rfc0593.NewMiddleware(agent(t)) 198 require.NoError(t, err) 199 200 registered := false 201 202 provider := &mockprovider.Provider{ 203 ServiceMap: map[string]interface{}{ 204 issuecredential.Name: &mockIssueCredentialSvc{ 205 addMWFunc: func(middleware ...issuecredential.Middleware) { 206 registered = true 207 require.Len(t, middleware, 1) 208 }, 209 }, 210 }, 211 } 212 213 err = rfc0593.RegisterMiddleware(mw, provider) 214 require.NoError(t, err) 215 require.True(t, registered) 216 }) 217 218 t.Run("error if cannot lookup service", func(t *testing.T) { 219 expected := errors.New("test") 220 221 mw, err := rfc0593.NewMiddleware(agent(t)) 222 require.NoError(t, err) 223 224 provider := &mockprovider.Provider{ 225 ServiceErr: expected, 226 } 227 228 err = rfc0593.RegisterMiddleware(mw, provider) 229 require.ErrorIs(t, err, expected) 230 }) 231 232 t.Run("error if cannot cast service to API dependency", func(t *testing.T) { 233 mw, err := rfc0593.NewMiddleware(agent(t)) 234 require.NoError(t, err) 235 236 provider := &mockprovider.Provider{ 237 ServiceMap: map[string]interface{}{ 238 issuecredential.Name: struct{}{}, 239 }, 240 } 241 242 err = rfc0593.RegisterMiddleware(mw, provider) 243 require.EqualError(t, err, "unable to cast the issuecredential service to the required interface type") 244 }) 245 } 246 247 type mockMetadata struct { 248 msg service.DIDCommMsg 249 } 250 251 func (m *mockMetadata) Message() service.DIDCommMsg { 252 return m.msg 253 } 254 255 func (m *mockMetadata) OfferCredentialV2() *issuecredential.OfferCredentialV2 { 256 panic("implement me") 257 } 258 259 func (m *mockMetadata) ProposeCredentialV2() *issuecredential.ProposeCredentialV2 { 260 panic("implement me") 261 } 262 263 func (m *mockMetadata) IssueCredentialV2() *issuecredential.IssueCredentialV2 { 264 panic("implement me") 265 } 266 267 func (m *mockMetadata) RequestCredentialV2() *issuecredential.RequestCredentialV2 { 268 panic("implement me") 269 } 270 271 func (m *mockMetadata) CredentialNames() []string { 272 panic("implement me") 273 } 274 275 func (m *mockMetadata) StateName() string { 276 panic("implement me") 277 } 278 279 func (m *mockMetadata) Properties() map[string]interface{} { 280 panic("implement me") 281 } 282 283 type mockHandler struct { 284 handleFunc func(issuecredential.Metadata) error 285 } 286 287 func (m *mockHandler) Handle(md issuecredential.Metadata) error { 288 return m.handleFunc(md) 289 } 290 291 type mockIssueCredentialSvc struct { 292 addMWFunc func(...issuecredential.Middleware) 293 } 294 295 func (m *mockIssueCredentialSvc) AddMiddleware(middleware ...issuecredential.Middleware) { 296 m.addMWFunc(middleware...) 297 }