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  }