package timelineservicelogic import ( "app-cloudep-tweeting-service/gen_result/pb/tweeting" "app-cloudep-tweeting-service/internal/domain/repository" mocklib "app-cloudep-tweeting-service/internal/mock/lib" mockRepo "app-cloudep-tweeting-service/internal/mock/repository" "app-cloudep-tweeting-service/internal/svc" "context" "errors" "testing" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" ) func TestAddPostLogic_AddPost(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() // 初始化 mock 依賴 mockTimelineRepo := mockRepo.NewMockTimelineRepository(ctrl) mockValidate := mocklib.NewMockValidate(ctrl) // 初始化服務上下文 svcCtx := &svc.ServiceContext{ TimelineRepo: mockTimelineRepo, Validate: mockValidate, } // 測試數據集 tests := []struct { name string input *tweeting.AddPostToTimelineReq prepare func() expectErr bool wantResp *tweeting.OKResp }{ { name: "成功加入貼文", input: &tweeting.AddPostToTimelineReq{ Uid: "user123", Posts: []*tweeting.PostTimelineItem{ {PostId: "post1", CreatedAt: 1627890123}, {PostId: "post2", CreatedAt: 1627890124}, }, }, prepare: func() { // 模擬驗證通過 mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(nil).Times(1) // 模擬成功加入貼文 mockTimelineRepo.EXPECT().AddPost(gomock.Any(), repository.AddPostRequest{ UID: "user123", PostItems: []repository.TimelineItem{ {PostID: "post1", Score: 1627890123}, {PostID: "post2", Score: 1627890124}, }, }).Return(nil).Times(1) }, expectErr: false, wantResp: &tweeting.OKResp{}, }, { name: "驗證失敗", input: &tweeting.AddPostToTimelineReq{ Uid: "", }, prepare: func() { // 模擬驗證失敗 mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(errors.New("validation failed")).Times(1) }, expectErr: true, wantResp: nil, }, { name: "沒有貼文資料", input: &tweeting.AddPostToTimelineReq{ Uid: "user123", Posts: []*tweeting.PostTimelineItem{}, }, prepare: func() { // 模擬驗證通過 mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(nil).Times(1) }, expectErr: false, wantResp: &tweeting.OKResp{}, }, { name: "加入貼文失敗", input: &tweeting.AddPostToTimelineReq{ Uid: "user123", Posts: []*tweeting.PostTimelineItem{ {PostId: "post1", CreatedAt: 1627890123}, }, }, prepare: func() { // 模擬驗證通過 mockValidate.EXPECT().ValidateAll(gomock.Any()).Return(nil).Times(1) // 模擬加入貼文失敗 mockTimelineRepo.EXPECT().AddPost(gomock.Any(), repository.AddPostRequest{ UID: "user123", PostItems: []repository.TimelineItem{ {PostID: "post1", Score: 1627890123}, }, }).Return(errors.New("repository error")).Times(1) }, expectErr: true, wantResp: nil, }, } // 執行測試 for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // 設置測試環境 tt.prepare() // 初始化 AddPostLogic logic := AddPostLogic{ svcCtx: svcCtx, ctx: context.TODO(), } // 執行 AddPost got, err := logic.AddPost(tt.input) // 驗證結果 if tt.expectErr { assert.Error(t, err) assert.Nil(t, got) } else { assert.NoError(t, err) assert.Equal(t, tt.wantResp, got) } }) } }