Files
ragflow/internal/dao/chat_session_test.go
Haruko386 67ce0c896d feat[Go]: implement /api/v1/agents/<agent_id>/sessions (#15705)
### What problem does this PR solve?

As Title
Codes were tested by Postman

### Type of change

- [x] New Feature (non-breaking change which adds functionality)
2026-06-08 16:26:27 +08:00

141 lines
4.0 KiB
Go

//
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
// 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 dao
import (
"encoding/json"
"testing"
"time"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
"ragflow/internal/entity"
)
func setupChatSessionDAOTestDB(t *testing.T) *gorm.DB {
t.Helper()
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
TranslateError: true,
})
if err != nil {
t.Fatalf("failed to open sqlite: %v", err)
}
if err := db.AutoMigrate(&entity.API4Conversation{}); err != nil {
t.Fatalf("failed to migrate: %v", err)
}
return db
}
func createAgentSessionForDAOTest(t *testing.T, db *gorm.DB, id, agentID, userID string, updateTime int64) {
t.Helper()
updateDate := time.UnixMilli(updateTime).Local()
session := &entity.API4Conversation{
ID: id,
DialogID: agentID,
UserID: userID,
Message: json.RawMessage(`[{"role":"assistant","content":"hello"}]`),
Reference: json.RawMessage(`[]`),
BaseModel: entity.BaseModel{
CreateTime: &updateTime,
CreateDate: &updateDate,
UpdateTime: &updateTime,
UpdateDate: &updateDate,
},
}
if err := db.Create(session).Error; err != nil {
t.Fatalf("failed to create session %s: %v", id, err)
}
}
func TestChatSessionDAOListAgentSessionsOrdersByUpdateTimeDesc(t *testing.T) {
db := setupChatSessionDAOTestDB(t)
pushDB(t, db)
createAgentSessionForDAOTest(t, db, "session-old", "agent-1", "user-1", 1000)
createAgentSessionForDAOTest(t, db, "session-new", "agent-1", "user-1", 3000)
createAgentSessionForDAOTest(t, db, "session-middle", "agent-1", "user-1", 2000)
createAgentSessionForDAOTest(t, db, "session-other-agent", "agent-2", "user-1", 9999)
total, sessions, err := NewChatSessionDAO().ListAgentSessions(ListAgentSessionsParams{
AgentID: "agent-1",
Page: 1,
PageSize: 10,
OrderBy: "update_time",
Desc: true,
})
if err != nil {
t.Fatalf("ListAgentSessions failed: %v", err)
}
if total != 3 {
t.Fatalf("expected total 3, got %d", total)
}
if len(sessions) != 3 {
t.Fatalf("expected 3 sessions, got %d", len(sessions))
}
wantIDs := []string{"session-new", "session-middle", "session-old"}
for i, wantID := range wantIDs {
if sessions[i].ID != wantID {
t.Fatalf("session[%d]: expected %s, got %s", i, wantID, sessions[i].ID)
}
if sessions[i].DialogID != "agent-1" {
t.Fatalf("session[%d]: expected agent-1, got %s", i, sessions[i].DialogID)
}
}
}
func TestChatSessionDAOListAgentSessionsFiltersAndPaginates(t *testing.T) {
db := setupChatSessionDAOTestDB(t)
pushDB(t, db)
createAgentSessionForDAOTest(t, db, "session-1", "agent-1", "user-1", 1000)
createAgentSessionForDAOTest(t, db, "session-2", "agent-1", "user-1", 2000)
createAgentSessionForDAOTest(t, db, "session-3", "agent-1", "user-1", 3000)
createAgentSessionForDAOTest(t, db, "session-other-user", "agent-1", "user-2", 4000)
total, sessions, err := NewChatSessionDAO().ListAgentSessions(ListAgentSessionsParams{
AgentID: "agent-1",
UserID: "user-1",
Page: 2,
PageSize: 1,
OrderBy: "update_time",
Desc: false,
})
if err != nil {
t.Fatalf("ListAgentSessions failed: %v", err)
}
if total != 3 {
t.Fatalf("expected total 3 after user filter, got %d", total)
}
if len(sessions) != 1 {
t.Fatalf("expected one paginated session, got %d", len(sessions))
}
if sessions[0].ID != "session-2" {
t.Fatalf("expected second ascending session session-2, got %s", sessions[0].ID)
}
if sessions[0].UserID != "user-1" {
t.Fatalf("expected user-1, got %s", sessions[0].UserID)
}
}