diff --git a/service/wechat/mock_wechatMessageManager.go b/service/wechat/mock_wechatMessageManager.go new file mode 100644 index 0000000..975964d --- /dev/null +++ b/service/wechat/mock_wechatMessageManager.go @@ -0,0 +1,27 @@ +// Code generated by mockery 2.7.4. DO NOT EDIT. + +package wechat + +import ( + message "github.com/silenceper/wechat/v2/officialaccount/message" + mock "github.com/stretchr/testify/mock" +) + +// mockWechatMessageManager is an autogenerated mock type for the wechatMessageManager type +type mockWechatMessageManager struct { + mock.Mock +} + +// Send provides a mock function with given fields: msg +func (_m *mockWechatMessageManager) Send(msg *message.CustomerMessage) error { + ret := _m.Called(msg) + + var r0 error + if rf, ok := ret.Get(0).(func(*message.CustomerMessage) error); ok { + r0 = rf(msg) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/service/wechat/wechat.go b/service/wechat/wechat.go index 383c6b3..46638c7 100644 --- a/service/wechat/wechat.go +++ b/service/wechat/wechat.go @@ -23,10 +23,15 @@ type Config struct { EncodingAESKey string } +// wechatMessageManager abstracts go-wechat's message.Manager for writing unit tests +type wechatMessageManager interface { + Send(msg *message.CustomerMessage) error +} + // Service encapsulates the WeChat client along with internal state for storing users. type Service struct { config Config - messageManager *message.Manager + messageManager wechatMessageManager userIDs []string } diff --git a/service/wechat/wechat_test.go b/service/wechat/wechat_test.go new file mode 100644 index 0000000..6ecbd52 --- /dev/null +++ b/service/wechat/wechat_test.go @@ -0,0 +1,52 @@ +package wechat + +import ( + "context" + "github.com/silenceper/wechat/v2/officialaccount/message" + "github.com/pkg/errors" + "github.com/stretchr/testify/require" + "testing" +) + +func TestAddReceivers(t *testing.T) { + assert := require.New(t) + + svc := &Service{ + userIDs: []string{}, + } + userIDs := []string{"User1ID", "User2ID", "User3ID"} + svc.AddReceivers(userIDs...) + + assert.Equal(svc.userIDs, userIDs) +} + +func TestSend(t *testing.T) { + assert := require.New(t) + + svc := &Service{ + userIDs: []string{}, + } + + // test wechat message manager returning error + mockMsgManager := new(mockWechatMessageManager) + mockMsgManager.On("Send", message.NewCustomerTextMessage("UserID1", "subject\nmessage")). + Return(errors.New("some error")) + svc.messageManager = mockMsgManager + svc.AddReceivers("UserID1") + ctx := context.Background() + err := svc.Send(ctx, "subject", "message") + assert.NotNil(err) + mockMsgManager.AssertExpectations(t) + + // test success and multiple receivers + mockMsgManager = new(mockWechatMessageManager) + mockMsgManager.On("Send", message.NewCustomerTextMessage("UserID1", "subject\nmessage")). + Return(nil) + mockMsgManager.On("Send", message.NewCustomerTextMessage("UserID2", "subject\nmessage")). + Return(nil) + svc.messageManager = mockMsgManager + svc.AddReceivers("UserID1", "UserID2") + err = svc.Send(ctx, "subject", "message") + assert.Nil(err) + mockMsgManager.AssertExpectations(t) +}