253 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			253 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
|  * Copyright 2025 coze-dev Authors
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| package message
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/cloudwego/eino/schema"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"go.uber.org/mock/gomock"
 | |
| 
 | |
| 	"github.com/coze-dev/coze-studio/backend/api/model/crossdomain/message"
 | |
| 	"github.com/coze-dev/coze-studio/backend/domain/conversation/message/entity"
 | |
| 	"github.com/coze-dev/coze-studio/backend/domain/conversation/message/internal/dal/model"
 | |
| 	"github.com/coze-dev/coze-studio/backend/domain/conversation/message/repository"
 | |
| 	mock "github.com/coze-dev/coze-studio/backend/internal/mock/infra/contract/idgen"
 | |
| 	"github.com/coze-dev/coze-studio/backend/internal/mock/infra/contract/orm"
 | |
| )
 | |
| 
 | |
| // Test_NewListMessage tests the NewListMessage function
 | |
| func TestListMessage(t *testing.T) {
 | |
| 	ctx := context.Background()
 | |
| 
 | |
| 	mockDBGen := orm.NewMockDB()
 | |
| 
 | |
| 	mockDBGen.AddTable(&model.Message{}).
 | |
| 		AddRows(
 | |
| 			&model.Message{
 | |
| 				ID:             1,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 			},
 | |
| 			&model.Message{
 | |
| 				ID:             2,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 			},
 | |
| 		)
 | |
| 
 | |
| 	mockDB, err := mockDBGen.DB()
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	components := &Components{
 | |
| 		MessageRepo: repository.NewMessageRepo(mockDB, nil),
 | |
| 	}
 | |
| 
 | |
| 	resp, err := NewService(components).List(ctx, &entity.ListMeta{
 | |
| 		ConversationID: 1,
 | |
| 		Limit:          1,
 | |
| 		UserID:         "1",
 | |
| 	})
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, resp.Messages, 0)
 | |
| }
 | |
| 
 | |
| // Test_NewListMessage tests the NewListMessage function
 | |
| func TestCreateMessage(t *testing.T) {
 | |
| 	ctx := context.Background()
 | |
| 
 | |
| 	ctrl := gomock.NewController(t)
 | |
| 	idGen := mock.NewMockIDGenerator(ctrl)
 | |
| 	idGen.EXPECT().GenID(gomock.Any()).DoAndReturn(func(_ context.Context) (int64, error) {
 | |
| 		newID := time.Now().UnixNano()
 | |
| 		return newID, nil
 | |
| 	}).AnyTimes()
 | |
| 	mockDBGen := orm.NewMockDB()
 | |
| 	mockDBGen.AddTable(&model.Message{})
 | |
| 	mockDB, err := mockDBGen.DB()
 | |
| 
 | |
| 	// redisCli := redis.New()
 | |
| 	// idGen, _ := idgen.New(redisCli)
 | |
| 	// mockDB, err := mysql.New()
 | |
| 
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	components := &Components{
 | |
| 		MessageRepo: repository.NewMessageRepo(mockDB, idGen),
 | |
| 	}
 | |
| 	imageInput := &message.FileData{
 | |
| 		Url:  "https://xxxxx.xxxx/image",
 | |
| 		Name: "test_img",
 | |
| 		URI:  "",
 | |
| 	}
 | |
| 	fileInput := &message.FileData{
 | |
| 		Url:  "https://xxxxx.xxxx/file",
 | |
| 		Name: "test_file",
 | |
| 		URI:  "",
 | |
| 	}
 | |
| 	content := []*message.InputMetaData{
 | |
| 		{
 | |
| 			Type: message.InputTypeText,
 | |
| 			Text: "解析图片中的内容",
 | |
| 		},
 | |
| 		{
 | |
| 			Type: message.InputTypeImage,
 | |
| 			FileData: []*message.FileData{
 | |
| 				imageInput,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			Type: message.InputTypeFile,
 | |
| 			FileData: []*message.FileData{
 | |
| 				fileInput,
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 	service := NewService(components)
 | |
| 	insert := &entity.Message{
 | |
| 		ID:             7498710126354759680,
 | |
| 		ConversationID: 7496795464885338112,
 | |
| 		AgentID:        7366055842027922437,
 | |
| 		UserID:         "6666666",
 | |
| 		RunID:          7498710102375923712,
 | |
| 		Content:        "你是谁?",
 | |
| 		MultiContent:   content,
 | |
| 		Role:           schema.Assistant,
 | |
| 		MessageType:    message.MessageTypeFunctionCall,
 | |
| 		SectionID:      7496795464897921024,
 | |
| 		ModelContent:   "{\"role\":\"tool\",\"content\":\"tool call\"}",
 | |
| 		ContentType:    message.ContentTypeMix,
 | |
| 	}
 | |
| 	resp, err := service.Create(ctx, insert)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	assert.Equal(t, int64(7366055842027922437), resp.AgentID)
 | |
| 	assert.Equal(t, "你是谁?", resp.Content)
 | |
| }
 | |
| 
 | |
| func TestEditMessage(t *testing.T) {
 | |
| 	ctx := context.Background()
 | |
| 	mockDBGen := orm.NewMockDB()
 | |
| 
 | |
| 	mockDBGen.AddTable(&model.Message{}).
 | |
| 		AddRows(
 | |
| 			&model.Message{
 | |
| 				ID:             1,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 				RunID:          123,
 | |
| 			},
 | |
| 			&model.Message{
 | |
| 				ID:             2,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 				RunID:          124,
 | |
| 			},
 | |
| 		)
 | |
| 
 | |
| 	mockDB, err := mockDBGen.DB()
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	components := &Components{
 | |
| 		MessageRepo: repository.NewMessageRepo(mockDB, nil),
 | |
| 	}
 | |
| 
 | |
| 	imageInput := &message.FileData{
 | |
| 		Url:  "https://xxxxx.xxxx/image",
 | |
| 		Name: "test_img",
 | |
| 	}
 | |
| 	fileInput := &message.FileData{
 | |
| 		Url:  "https://xxxxx.xxxx/file",
 | |
| 		Name: "test_file",
 | |
| 	}
 | |
| 	content := []*message.InputMetaData{
 | |
| 		{
 | |
| 			Type: message.InputTypeText,
 | |
| 			Text: "解析图片中的内容",
 | |
| 		},
 | |
| 		{
 | |
| 			Type: message.InputTypeImage,
 | |
| 			FileData: []*message.FileData{
 | |
| 				imageInput,
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			Type: message.InputTypeFile,
 | |
| 			FileData: []*message.FileData{
 | |
| 				fileInput,
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	resp, err := NewService(components).Edit(ctx, &entity.Message{
 | |
| 		ID:           2,
 | |
| 		Content:      "test edit message",
 | |
| 		MultiContent: content,
 | |
| 	})
 | |
| 	_ = resp
 | |
| 
 | |
| 	msOne, err := NewService(components).GetByRunIDs(ctx, 1, []int64{124})
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	assert.Equal(t, int64(124), msOne[0].RunID)
 | |
| }
 | |
| 
 | |
| func TestGetByRunIDs(t *testing.T) {
 | |
| 	ctx := context.Background()
 | |
| 
 | |
| 	mockDBGen := orm.NewMockDB()
 | |
| 
 | |
| 	mockDBGen.AddTable(&model.Message{}).
 | |
| 		AddRows(
 | |
| 			&model.Message{
 | |
| 				ID:             1,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 				RunID:          123,
 | |
| 				Content:        "test content123",
 | |
| 			},
 | |
| 			&model.Message{
 | |
| 				ID:             2,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 				Content:        "test content124",
 | |
| 				RunID:          124,
 | |
| 			},
 | |
| 			&model.Message{
 | |
| 				ID:             3,
 | |
| 				ConversationID: 1,
 | |
| 				UserID:         "1",
 | |
| 				Content:        "test content124",
 | |
| 				RunID:          124,
 | |
| 			},
 | |
| 		)
 | |
| 	mockDB, err := mockDBGen.DB()
 | |
| 	assert.NoError(t, err)
 | |
| 	components := &Components{
 | |
| 		MessageRepo: repository.NewMessageRepo(mockDB, nil),
 | |
| 	}
 | |
| 
 | |
| 	resp, err := NewService(components).GetByRunIDs(ctx, 1, []int64{124})
 | |
| 
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	assert.Len(t, resp, 2)
 | |
| }
 |