github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/introduce/client_test.go (about)

     1  /*
     2  Copyright SecureKey Technologies Inc. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package introduce
     8  
     9  import (
    10  	"errors"
    11  	"fmt"
    12  	"testing"
    13  
    14  	"github.com/golang/mock/gomock"
    15  	"github.com/stretchr/testify/require"
    16  
    17  	"github.com/hyperledger/aries-framework-go/pkg/client/outofband"
    18  	"github.com/hyperledger/aries-framework-go/pkg/didcomm/common/service"
    19  	"github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/introduce"
    20  	mocksintroduce "github.com/hyperledger/aries-framework-go/pkg/internal/gomocks/client/introduce"
    21  )
    22  
    23  const expectedPIID = "piid"
    24  
    25  func TestNew(t *testing.T) {
    26  	const errMsg = "test err"
    27  
    28  	ctrl := gomock.NewController(t)
    29  	defer ctrl.Finish()
    30  
    31  	t.Run("get service error", func(t *testing.T) {
    32  		provider := mocksintroduce.NewMockProvider(ctrl)
    33  		provider.EXPECT().Service(gomock.Any()).Return(nil, errors.New(errMsg))
    34  		_, err := New(provider)
    35  		require.EqualError(t, err, errMsg)
    36  	})
    37  
    38  	t.Run("cast service error", func(t *testing.T) {
    39  		provider := mocksintroduce.NewMockProvider(ctrl)
    40  		provider.EXPECT().Service(gomock.Any()).Return(nil, nil)
    41  		_, err := New(provider)
    42  		require.EqualError(t, err, "cast service to Introduce Service failed")
    43  	})
    44  }
    45  
    46  func TestClient_Actions(t *testing.T) {
    47  	ctrl := gomock.NewController(t)
    48  	defer ctrl.Finish()
    49  
    50  	t.Run("Success", func(t *testing.T) {
    51  		provider := mocksintroduce.NewMockProvider(ctrl)
    52  
    53  		svc := mocksintroduce.NewMockProtocolService(ctrl)
    54  		expected := []introduce.Action{{PIID: "1"}, {PIID: "2"}}
    55  		svc.EXPECT().Actions().Return(expected, nil)
    56  
    57  		provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
    58  		client, err := New(provider)
    59  		require.NoError(t, err)
    60  
    61  		actions, err := client.Actions()
    62  		require.NoError(t, err)
    63  		// client Actions is an array of new type of Action, the test can't check for value equality since client Action
    64  		// is, even though it's anp service Action, is considered a different type therefore fails quality checks. Simply
    65  		// check for set values instead.
    66  		require.Equal(t, len(expected), len(actions))
    67  		require.Equal(t, expected[0].PIID, actions[0].PIID)
    68  		require.Equal(t, expected[1].PIID, actions[1].PIID)
    69  	})
    70  }
    71  
    72  func TestClient_SendProposal(t *testing.T) {
    73  	ctrl := gomock.NewController(t)
    74  	defer ctrl.Finish()
    75  
    76  	t.Run("Success", func(t *testing.T) {
    77  		provider := mocksintroduce.NewMockProvider(ctrl)
    78  
    79  		svc := mocksintroduce.NewMockProtocolService(ctrl)
    80  		svc.EXPECT().
    81  			HandleOutbound(gomock.Any(), "firstMyDID", "firstTheirDID").
    82  			DoAndReturn(func(msg service.DIDCommMsg, myDID, theirDID string) (string, error) {
    83  				require.Equal(t, msg.Type(), introduce.ProposalMsgType)
    84  				require.NotEmpty(t, msg.Metadata())
    85  
    86  				return expectedPIID, nil
    87  			})
    88  		svc.EXPECT().
    89  			HandleOutbound(gomock.Any(), "secondMyDID", "secondTheirDID").
    90  			DoAndReturn(func(msg service.DIDCommMsg, myDID, theirDID string) (string, error) {
    91  				require.Equal(t, msg.Type(), introduce.ProposalMsgType)
    92  				require.NotEmpty(t, msg.Metadata())
    93  
    94  				return expectedPIID, nil
    95  			})
    96  
    97  		provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
    98  		client, err := New(provider)
    99  		require.NoError(t, err)
   100  
   101  		piid, err := client.SendProposal(&Recipient{
   102  			MyDID:    "firstMyDID",
   103  			TheirDID: "firstTheirDID",
   104  		}, &Recipient{
   105  			MyDID:    "secondMyDID",
   106  			TheirDID: "secondTheirDID",
   107  		})
   108  		require.Equal(t, expectedPIID, piid)
   109  		require.NoError(t, err)
   110  	})
   111  
   112  	t.Run("Error", func(t *testing.T) {
   113  		const errMsg = "test error"
   114  
   115  		provider := mocksintroduce.NewMockProvider(ctrl)
   116  
   117  		svc := mocksintroduce.NewMockProtocolService(ctrl)
   118  		svc.EXPECT().
   119  			HandleOutbound(gomock.Any(), "firstMyDID", "firstTheirDID").
   120  			Return("", errors.New(errMsg))
   121  
   122  		provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   123  		client, err := New(provider)
   124  		require.NoError(t, err)
   125  
   126  		piid, err := client.SendProposal(&Recipient{
   127  			MyDID:    "firstMyDID",
   128  			TheirDID: "firstTheirDID",
   129  		}, &Recipient{})
   130  		require.Empty(t, piid)
   131  		require.Contains(t, fmt.Sprintf("%v", err), errMsg)
   132  	})
   133  }
   134  
   135  func TestClient_SendProposalWithOOBInvitation(t *testing.T) {
   136  	ctrl := gomock.NewController(t)
   137  	defer ctrl.Finish()
   138  
   139  	provider := mocksintroduce.NewMockProvider(ctrl)
   140  
   141  	svc := mocksintroduce.NewMockProtocolService(ctrl)
   142  	svc.EXPECT().
   143  		HandleOutbound(gomock.Any(), "firstMyDID", "firstTheirDID").
   144  		DoAndReturn(func(msg service.DIDCommMsg, myDID, theirDID string) (string, error) {
   145  			require.Equal(t, msg.Type(), introduce.ProposalMsgType)
   146  			require.NotEmpty(t, msg.Metadata())
   147  
   148  			return expectedPIID, nil
   149  		})
   150  
   151  	provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   152  	client, err := New(provider)
   153  	require.NoError(t, err)
   154  
   155  	req := &outofband.Invitation{}
   156  	piid, err := client.SendProposalWithOOBInvitation(req, &Recipient{
   157  		MyDID:    "firstMyDID",
   158  		TheirDID: "firstTheirDID",
   159  	})
   160  	require.Equal(t, expectedPIID, piid)
   161  	require.NoError(t, err)
   162  }
   163  
   164  func TestClient_SendRequest(t *testing.T) {
   165  	ctrl := gomock.NewController(t)
   166  	defer ctrl.Finish()
   167  
   168  	provider := mocksintroduce.NewMockProvider(ctrl)
   169  
   170  	svc := mocksintroduce.NewMockProtocolService(ctrl)
   171  	svc.EXPECT().
   172  		HandleOutbound(gomock.Any(), "firstMyDID", "firstTheirDID").
   173  		DoAndReturn(func(msg service.DIDCommMsg, myDID, theirDID string) (string, error) {
   174  			require.Equal(t, msg.Type(), introduce.RequestMsgType)
   175  			require.Empty(t, msg.Metadata())
   176  
   177  			return expectedPIID, nil
   178  		})
   179  
   180  	provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   181  	client, err := New(provider)
   182  	require.NoError(t, err)
   183  
   184  	piid, err := client.SendRequest(&PleaseIntroduceTo{}, "firstMyDID", "firstTheirDID")
   185  	require.Equal(t, expectedPIID, piid)
   186  	require.NoError(t, err)
   187  }
   188  
   189  func TestClient_AcceptProposalWithOOBRequest(t *testing.T) {
   190  	t.Run("continues the process instance with the request", func(t *testing.T) {
   191  		expectedPIID := "abc123"
   192  		ctrl := gomock.NewController(t)
   193  		defer ctrl.Finish()
   194  
   195  		provider := mocksintroduce.NewMockProvider(ctrl)
   196  		svc := mocksintroduce.NewMockProtocolService(ctrl)
   197  		svc.EXPECT().ActionContinue(
   198  			gomock.AssignableToTypeOf(""),
   199  			gomock.AssignableToTypeOf(introduce.WithOOBInvitation(nil)),
   200  		).DoAndReturn(
   201  			func(piid string, opt introduce.Opt) error {
   202  				require.Equal(t, expectedPIID, piid)
   203  				require.NotNil(t, opt)
   204  
   205  				return nil
   206  			},
   207  		)
   208  		provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   209  
   210  		client, err := New(provider)
   211  		require.NoError(t, err)
   212  
   213  		err = client.AcceptProposalWithOOBInvitation(expectedPIID, &outofband.Invitation{})
   214  		require.NoError(t, err)
   215  	})
   216  }
   217  
   218  func TestClient_AcceptProposal(t *testing.T) {
   219  	t.Run("continues the process instance", func(t *testing.T) {
   220  		const expectedPIID = "abc123"
   221  
   222  		ctrl := gomock.NewController(t)
   223  		defer ctrl.Finish()
   224  
   225  		svc := mocksintroduce.NewMockProtocolService(ctrl)
   226  		svc.EXPECT().ActionContinue(gomock.Eq(expectedPIID), gomock.Nil()).Return(nil)
   227  
   228  		provider := mocksintroduce.NewMockProvider(ctrl)
   229  		provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   230  
   231  		client, err := New(provider)
   232  		require.NoError(t, err)
   233  
   234  		require.NoError(t, client.AcceptProposal(expectedPIID))
   235  	})
   236  }
   237  
   238  func TestClient_AcceptRequestWithPublicOOBRequest(t *testing.T) {
   239  	t.Run("continues the process instance with the public request", func(t *testing.T) {
   240  		expectedPIID := "abc123"
   241  		ctrl := gomock.NewController(t)
   242  		defer ctrl.Finish()
   243  
   244  		provider := mocksintroduce.NewMockProvider(ctrl)
   245  		svc := mocksintroduce.NewMockProtocolService(ctrl)
   246  		svc.EXPECT().ActionContinue(
   247  			gomock.AssignableToTypeOf(""),
   248  			gomock.AssignableToTypeOf(introduce.WithPublicOOBInvitation(nil, nil)),
   249  		).DoAndReturn(
   250  			func(piid string, opt introduce.Opt) error {
   251  				require.Equal(t, expectedPIID, piid)
   252  				require.NotNil(t, opt)
   253  
   254  				return nil
   255  			},
   256  		)
   257  		provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   258  
   259  		client, err := New(provider)
   260  		require.NoError(t, err)
   261  
   262  		err = client.AcceptRequestWithPublicOOBInvitation(expectedPIID, &outofband.Invitation{}, &To{})
   263  		require.NoError(t, err)
   264  	})
   265  }
   266  
   267  func TestClient_DeclineProposal(t *testing.T) {
   268  	ctrl := gomock.NewController(t)
   269  	defer ctrl.Finish()
   270  
   271  	provider := mocksintroduce.NewMockProvider(ctrl)
   272  
   273  	svc := mocksintroduce.NewMockProtocolService(ctrl)
   274  	svc.EXPECT().ActionStop("PIID", errors.New("the reason")).Return(nil)
   275  
   276  	provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   277  	client, err := New(provider)
   278  	require.NoError(t, err)
   279  
   280  	require.NoError(t, client.DeclineProposal("PIID", "the reason"))
   281  }
   282  
   283  func TestClient_DeclineRequest(t *testing.T) {
   284  	ctrl := gomock.NewController(t)
   285  	defer ctrl.Finish()
   286  
   287  	provider := mocksintroduce.NewMockProvider(ctrl)
   288  
   289  	svc := mocksintroduce.NewMockProtocolService(ctrl)
   290  	svc.EXPECT().ActionStop("PIID", errors.New("the reason")).Return(nil)
   291  
   292  	provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   293  	client, err := New(provider)
   294  	require.NoError(t, err)
   295  
   296  	require.NoError(t, client.DeclineRequest("PIID", "the reason"))
   297  }
   298  
   299  func TestClient_AcceptProblemReport(t *testing.T) {
   300  	ctrl := gomock.NewController(t)
   301  	defer ctrl.Finish()
   302  
   303  	provider := mocksintroduce.NewMockProvider(ctrl)
   304  
   305  	svc := mocksintroduce.NewMockProtocolService(ctrl)
   306  	svc.EXPECT().ActionContinue("PIID", gomock.Any()).Return(nil)
   307  
   308  	provider.EXPECT().Service(gomock.Any()).Return(svc, nil)
   309  	client, err := New(provider)
   310  	require.NoError(t, err)
   311  
   312  	require.NoError(t, client.AcceptProblemReport("PIID"))
   313  }