package commentservicelogic import ( "app-cloudep-tweeting-service/gen_result/pb/tweeting" model "app-cloudep-tweeting-service/internal/model/mongo" "app-cloudep-tweeting-service/internal/svc" "context" "errors" "testing" "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/mock/gomock" mocklib "app-cloudep-tweeting-service/internal/mock/lib" mockmodel "app-cloudep-tweeting-service/internal/mock/model" ) func TestGetComments(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() // 初始化 mock 依賴 mockCommentModel := mockmodel.NewMockCommentModel(ctrl) mockValidate := mocklib.NewMockValidate(ctrl) // 初始化服務上下文 svcCtx := &svc.ServiceContext{ CommentModel: mockCommentModel, Validate: mockValidate, } // 測試數據 getCommentsReq := &tweeting.GetCommentsReq{ PostId: "12345", PageSize: 10, PageIndex: 1, } mockComments := []*model.Comment{ { ID: primitive.NewObjectID(), PostID: "12345", UID: "54321", Content: "This is a comment", LikeCount: 10, DisLikeCount: 2, }, { ID: primitive.NewObjectID(), PostID: "12345", UID: "67890", Content: "This is another comment", LikeCount: 5, DisLikeCount: 1, }, } // 測試數據集 tests := []struct { name string input *tweeting.GetCommentsReq prepare func() expectErr bool }{ { name: "成功查詢評論", input: getCommentsReq, prepare: func() { mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(nil).Times(1) mockCommentModel.EXPECT().Find(gomock.Any(), gomock.Any()).Return(mockComments, int64(len(mockComments)), nil).Times(1) }, expectErr: false, }, { name: "查詢評論失敗", input: getCommentsReq, prepare: func() { mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(nil).Times(1) mockCommentModel.EXPECT().Find(gomock.Any(), gomock.Any()).Return(nil, int64(0), errors.New("find failed")).Times(1) }, expectErr: true, }, { name: "驗證失敗", input: getCommentsReq, prepare: func() { mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(errors.New("validation failed")).Times(1) }, expectErr: true, }, } // 執行測試 for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // 設置測試環境 tt.prepare() // 初始化 GetCommentsLogic logic := GetCommentsLogic{ svcCtx: svcCtx, ctx: context.TODO(), } // 執行 GetComments resp, err := logic.GetComments(tt.input) // 驗證結果 if tt.expectErr { assert.Error(t, err) assert.Nil(t, resp) } else { assert.NoError(t, err) assert.NotNil(t, resp) assert.Len(t, resp.Comments, len(mockComments)) } }) } }