coze-studio/backend/domain/knowledge/service/sheet_test.go

1032 lines
28 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 service
import (
"context"
"fmt"
"testing"
. "github.com/bytedance/mockey"
"github.com/smartystreets/goconvey/convey"
"go.uber.org/mock/gomock"
knowledgeModel "github.com/coze-dev/coze-studio/backend/api/model/crossdomain/knowledge"
"github.com/coze-dev/coze-studio/backend/domain/knowledge/entity"
"github.com/coze-dev/coze-studio/backend/domain/knowledge/internal/consts"
"github.com/coze-dev/coze-studio/backend/domain/knowledge/internal/convert"
"github.com/coze-dev/coze-studio/backend/domain/knowledge/internal/dal/model"
"github.com/coze-dev/coze-studio/backend/domain/knowledge/internal/mock/dal/dao"
"github.com/coze-dev/coze-studio/backend/infra/contract/document"
"github.com/coze-dev/coze-studio/backend/infra/contract/rdb"
rentity "github.com/coze-dev/coze-studio/backend/infra/contract/rdb/entity"
mrdb "github.com/coze-dev/coze-studio/backend/internal/mock/infra/contract/rdb"
"github.com/coze-dev/coze-studio/backend/pkg/lang/ptr"
)
func TestValidateTableSchema(t *testing.T) {
PatchConvey("test ValidateTableSchema", t, func() {
ctx := context.Background()
dst := &model.KnowledgeDocument{
TableInfo: &entity.TableInfo{
Columns: []*entity.TableColumn{
{
ID: 1,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 2,
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 1,
},
{
ID: 3,
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 2,
},
{
ID: 4,
Name: consts.RDBFieldID,
Type: document.TableColumnTypeInteger,
Description: "主键ID",
Indexing: false,
Sequence: -1,
},
},
},
}
ctrl := gomock.NewController(t)
mockRepo := dao.NewMockKnowledgeDocumentRepo(ctrl)
k := &knowledgeSVC{documentRepo: mockRepo}
PatchConvey("test with fail reasons", func() {
src := &rawSheet{
cols: []*entity.TableColumn{
{
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 1,
},
{
Name: "test_col_2",
Type: document.TableColumnTypeString,
Indexing: false,
Sequence: 2,
},
{
Name: "another_field",
Type: document.TableColumnTypeString,
Indexing: false,
Sequence: 3,
},
},
vals: [][]*document.ColumnData{
{
// 1. column not found
//{
// ColumnName: "test_col_1",
// Type: document.TableColumnTypeString,
// ValString: ptr.Of("hello"),
//},
{
// 2. indexing value is nil
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
},
{
// 3. type conversion failure
ColumnName: "test_col_2",
Type: document.TableColumnTypeString,
ValString: ptr.Of("azaz"),
},
{
ColumnName: "another_field",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
},
},
}
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{dst}, nil).Times(1)
Mock(GetMethod(k, "LoadSourceInfoSpecificSheet")).Return(src, nil).Build()
resp, err := k.ValidateTableSchema(ctx, &ValidateTableSchemaRequest{
DocumentID: 123,
SourceInfo: TableSourceInfo{
Uri: ptr.Of("zxcqwe"),
},
TableSheet: &entity.TableSheet{
SheetId: 0,
HeaderLineIdx: 0,
StartLineIdx: 1,
SheetName: "asd",
TotalRows: 0,
},
})
convey.So(err, convey.ShouldBeNil)
exp := map[string]string{
"test_col_1": "column not found in provided data",
"test_col_2": "column type invalid, expected=2, got=1",
"test_col_3": "column indexing requires value, but got none",
}
convey.So(resp.ColumnValidResult, convey.ShouldEqual, exp)
})
PatchConvey("test success", func() {
src := &rawSheet{
cols: []*entity.TableColumn{
{
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
Name: "test_col_3",
Type: document.TableColumnTypeNumber,
Indexing: true,
Sequence: 1,
},
{
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 2,
},
{
Name: "another_field",
Type: document.TableColumnTypeString,
Indexing: false,
Sequence: 3,
},
},
vals: [][]*document.ColumnData{
{
{
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnName: "test_col_3",
Type: document.TableColumnTypeNumber,
ValNumber: ptr.Of(1.0),
},
{
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(1)),
},
{
ColumnName: "another_field",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
},
},
}
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{dst}, nil).Times(1)
Mock(GetMethod(k, "LoadSourceInfoSpecificSheet")).Return(src, nil).Build()
resp, err := k.ValidateTableSchema(ctx, &ValidateTableSchemaRequest{
DocumentID: 123,
SourceInfo: TableSourceInfo{
Uri: ptr.Of("zxcqwe"),
},
TableSheet: &entity.TableSheet{
SheetId: 0,
HeaderLineIdx: 0,
StartLineIdx: 1,
SheetName: "asd",
TotalRows: 0,
},
})
convey.So(err, convey.ShouldBeNil)
convey.So(len(resp.ColumnValidResult), convey.ShouldBeZeroValue)
})
})
}
func TestFormatTableSchemaResponse(t *testing.T) {
PatchConvey("test FormatTableSchemaResponse", t, func() {
k := &knowledgeSVC{}
sheet := &entity.TableSheet{
SheetId: 0,
HeaderLineIdx: 0,
StartLineIdx: 1,
SheetName: "test1",
TotalRows: 21,
}
allSheets := []*entity.TableSheet{
sheet,
{
SheetId: 1,
HeaderLineIdx: 0,
StartLineIdx: 1,
SheetName: "test2",
TotalRows: 22,
},
}
tblMeta := []*entity.TableColumn{
{
ID: 1,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 2,
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 1,
},
{
ID: 3,
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 2,
},
}
data := [][]*document.ColumnData{
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnID: 2,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(22222)),
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
},
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("qqq"),
},
{
ColumnID: 2,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(4444)),
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("eee"),
},
},
}
r := &TableSchemaResponse{
TableSheet: sheet,
AllTableSheets: allSheets,
TableMeta: tblMeta,
PreviewData: data,
}
PatchConvey("test only schema", func() {
p := []*entity.TableColumn{
{
ID: 1,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 2,
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 0,
},
}
resp, err := k.FormatTableSchemaResponse(r, p, OnlySchema)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldNotBeNil)
convey.So(resp, convey.ShouldEqual, &TableSchemaResponse{
TableSheet: r.TableSheet,
AllTableSheets: r.AllTableSheets,
TableMeta: p,
})
})
PatchConvey("test prevTableMeta == nil && AllData", func() {
resp, err := k.FormatTableSchemaResponse(r, nil, AllData)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldNotBeNil)
convey.So(resp, convey.ShouldEqual, r)
})
PatchConvey("test prevTableMeta == nil && OnlyPreview", func() {
resp, err := k.FormatTableSchemaResponse(r, nil, OnlyPreview)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldNotBeNil)
convey.So(resp, convey.ShouldEqual, &TableSchemaResponse{
PreviewData: r.PreviewData,
})
})
PatchConvey("test align first import", func() {
p := []*entity.TableColumn{
{
ID: 0,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 0,
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 2,
},
{
ID: 0,
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 1,
},
{
ID: 0,
Name: "test_col_append_1",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 3,
},
}
rd := [][]*document.ColumnData{
{
{
ColumnID: 0,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnID: 0,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(22222)),
},
{
ColumnID: 0,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
},
{
{
ColumnID: 0,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("qqq"),
},
{
ColumnID: 0,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(4444)),
},
{
ColumnID: 0,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("eee"),
},
},
}
rr := &TableSchemaResponse{
TableSheet: sheet,
AllTableSheets: allSheets,
TableMeta: tblMeta,
PreviewData: rd,
}
resp, err := k.FormatTableSchemaResponse(rr, p, AllData)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldNotBeNil)
exp := [][]*document.ColumnData{
{
{
ColumnID: 0,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnID: 0,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
{
ColumnID: 0,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(22222)),
},
{
ColumnID: 0,
ColumnName: "test_col_append_1",
Type: document.TableColumnTypeInteger,
},
},
{
{
ColumnID: 0,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("qqq"),
},
{
ColumnID: 0,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("eee"),
},
{
ColumnID: 0,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(4444)),
},
{
ColumnID: 0,
ColumnName: "test_col_append_1",
Type: document.TableColumnTypeInteger,
},
},
}
convey.So(resp, convey.ShouldEqual, &TableSchemaResponse{
TableSheet: r.TableSheet,
AllTableSheets: r.AllTableSheets,
TableMeta: p,
PreviewData: exp,
})
})
PatchConvey("test align non-first import", func() {
p := []*entity.TableColumn{
{
ID: 1,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 0,
Name: "test_col_append_0",
Type: document.TableColumnTypeNumber,
Indexing: false,
Sequence: 1,
},
{
ID: 3,
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 2,
},
{
ID: 0,
Name: "test_col_append_1",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 3,
},
}
resp, err := k.FormatTableSchemaResponse(r, p, AllData)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldNotBeNil)
exp := [][]*document.ColumnData{
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnID: 0,
ColumnName: "test_col_append_0",
Type: document.TableColumnTypeNumber,
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
{
ColumnID: 0,
ColumnName: "test_col_append_1",
Type: document.TableColumnTypeInteger,
},
},
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("qqq"),
},
{
ColumnID: 0,
ColumnName: "test_col_append_0",
Type: document.TableColumnTypeNumber,
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("eee"),
},
{
ColumnID: 0,
ColumnName: "test_col_append_1",
Type: document.TableColumnTypeInteger,
},
},
}
convey.So(resp, convey.ShouldEqual, &TableSchemaResponse{
TableSheet: r.TableSheet,
AllTableSheets: r.AllTableSheets,
TableMeta: p,
PreviewData: exp,
})
})
})
}
func TestGetDocumentTableInfoByID(t *testing.T) {
PatchConvey("test GetDocumentTableInfoByID", t, func() {
ctx := context.Background()
docID := int64(123)
doc := &model.KnowledgeDocument{
ID: docID,
KnowledgeID: 333,
DocumentType: int32(knowledgeModel.DocumentTypeTable),
ParseRule: &model.DocumentParseRule{
ParsingStrategy: &entity.ParsingStrategy{
ExtractImage: false,
ExtractTable: false,
ImageOCR: false,
SheetID: 0,
HeaderLine: 0,
DataStartLine: 1,
RowsCount: 20,
},
ChunkingStrategy: nil,
},
TableInfo: &entity.TableInfo{
VirtualTableName: "virtual_tbl",
PhysicalTableName: "physical_tbl",
TableDesc: "desc",
Columns: []*entity.TableColumn{
{
ID: 1,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 2,
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 1,
},
{
ID: 3,
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 2,
},
{
ID: 4,
Name: consts.RDBFieldID,
Type: document.TableColumnTypeInteger,
Description: "主键ID",
Indexing: false,
Sequence: -1,
},
},
},
}
sheet := &entity.TableSheet{
SheetId: doc.ParseRule.ParsingStrategy.SheetID,
HeaderLineIdx: int64(doc.ParseRule.ParsingStrategy.HeaderLine),
StartLineIdx: int64(doc.ParseRule.ParsingStrategy.DataStartLine),
SheetName: doc.Name,
TotalRows: doc.SliceCount,
}
selectResp := &rdb.SelectDataResponse{
ResultSet: &rentity.ResultSet{
Columns: []string{
consts.RDBFieldID,
convert.ColumnIDToRDBField(doc.TableInfo.Columns[0].ID),
convert.ColumnIDToRDBField(doc.TableInfo.Columns[1].ID),
convert.ColumnIDToRDBField(doc.TableInfo.Columns[2].ID),
},
Rows: []map[string]interface{}{
{
consts.RDBFieldID: 12345,
convert.ColumnIDToRDBField(doc.TableInfo.Columns[0].ID): "hello",
convert.ColumnIDToRDBField(doc.TableInfo.Columns[1].ID): 222,
convert.ColumnIDToRDBField(doc.TableInfo.Columns[2].ID): "bye",
},
{
consts.RDBFieldID: 12346,
convert.ColumnIDToRDBField(doc.TableInfo.Columns[0].ID): "qaq",
convert.ColumnIDToRDBField(doc.TableInfo.Columns[1].ID): 333,
convert.ColumnIDToRDBField(doc.TableInfo.Columns[2].ID): "quq",
},
},
AffectedRows: 0,
},
Total: 2,
}
ctrl := gomock.NewController(t)
mockRepo := dao.NewMockKnowledgeDocumentRepo(ctrl)
mockRDB := mrdb.NewMockRDB(ctrl)
k := &knowledgeSVC{documentRepo: mockRepo, rdb: mockRDB}
PatchConvey("test MGetByID failed", func() {
expErr := fmt.Errorf("mock err")
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return(nil, expErr).Times(1)
resp, err := k.GetDocumentTableInfoByID(ctx, docID, false)
convey.ShouldContainSubstring(err.Error(), expErr.Error())
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test document not found", func() {
expErr := fmt.Errorf("[GetDocumentTableInfoByID] document not found, id=%d", docID)
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return(nil, nil).Times(1)
resp, err := k.GetDocumentTableInfoByID(ctx, docID, false)
convey.ShouldContainSubstring(err.Error(), expErr.Error())
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test document type invalid", func() {
d := &model.KnowledgeDocument{ID: docID, DocumentType: int32(knowledgeModel.DocumentTypeText)}
expErr := fmt.Errorf("[GetDocumentTableInfoByID] document type invalid, got=%d", d.DocumentType)
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{d}, nil).Times(1)
resp, err := k.GetDocumentTableInfoByID(ctx, docID, false)
convey.ShouldContainSubstring(err.Error(), expErr.Error())
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test not need data", func() {
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{doc}, nil).Times(1)
resp, err := k.GetDocumentTableInfoByID(ctx, docID, false)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldEqual, &TableSchemaResponse{
TableSheet: sheet,
AllTableSheets: []*entity.TableSheet{sheet},
TableMeta: doc.TableInfo.Columns[:3],
})
})
PatchConvey("test SelectData failed", func() {
expErr := fmt.Errorf("mock err")
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{doc}, nil).Times(1)
mockRDB.EXPECT().SelectData(gomock.Any(), gomock.Any()).Return(nil, expErr).Times(1)
resp, err := k.GetDocumentTableInfoByID(ctx, docID, true)
convey.ShouldContainSubstring(err.Error(), expErr.Error())
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test ParseRDBData failed", func() {
expErr := fmt.Errorf("mock err")
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{doc}, nil).Times(1)
mockRDB.EXPECT().SelectData(gomock.Any(), gomock.Any()).Return(selectResp, nil).Times(1)
Mock(GetMethod(k, "ParseRDBData")).Return(nil, expErr).Build()
resp, err := k.GetDocumentTableInfoByID(ctx, docID, true)
convey.ShouldContainSubstring(err.Error(), expErr.Error())
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test success", func() {
mockData := [][]*document.ColumnData{
{{ColumnID: 123123, ColumnName: "zxczxc", Type: document.TableColumnTypeString, ValString: ptr.Of("dddd")}},
}
mockRepo.EXPECT().MGetByID(gomock.Any(), gomock.Any()).Return([]*model.KnowledgeDocument{doc}, nil).Times(1)
mockRDB.EXPECT().SelectData(gomock.Any(), gomock.Any()).Return(selectResp, nil).Times(1)
Mock(GetMethod(k, "ParseRDBData")).Return(mockData, nil).Build()
resp, err := k.GetDocumentTableInfoByID(ctx, docID, true)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldEqual, &TableSchemaResponse{
TableSheet: sheet,
AllTableSheets: []*entity.TableSheet{sheet},
TableMeta: doc.TableInfo.Columns[:3],
PreviewData: mockData,
})
})
})
}
func TestParseRDBData(t *testing.T) {
PatchConvey("test ParseRDBData", t, func() {
cols := []*entity.TableColumn{
{
ID: 1,
Name: "test_col_1",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 0,
},
{
ID: 2,
Name: "test_col_2",
Type: document.TableColumnTypeInteger,
Indexing: false,
Sequence: 1,
},
{
ID: 3,
Name: "test_col_3",
Type: document.TableColumnTypeString,
Indexing: true,
Sequence: 2,
},
{
ID: 4,
Name: consts.RDBFieldID,
Type: document.TableColumnTypeInteger,
Description: "主键ID",
Indexing: false,
Sequence: -1,
},
}
rs := &rentity.ResultSet{
Columns: []string{
consts.RDBFieldID,
convert.ColumnIDToRDBField(cols[0].ID),
convert.ColumnIDToRDBField(cols[1].ID),
convert.ColumnIDToRDBField(cols[2].ID),
},
Rows: []map[string]interface{}{
{
consts.RDBFieldID: 12345,
convert.ColumnIDToRDBField(cols[0].ID): "hello",
convert.ColumnIDToRDBField(cols[1].ID): 222,
convert.ColumnIDToRDBField(cols[2].ID): "bye",
},
{
consts.RDBFieldID: 12346,
convert.ColumnIDToRDBField(cols[0].ID): "qaq",
convert.ColumnIDToRDBField(cols[1].ID): 333,
convert.ColumnIDToRDBField(cols[2].ID): "quq",
},
},
}
k := &knowledgeSVC{}
PatchConvey("test parse with column id", func() {
c := cols
PatchConvey("test column not found", func() {
nc := append(c, &entity.TableColumn{
ID: 9,
Name: "unknown_field",
Type: document.TableColumnTypeString,
})
resp, err := k.ParseRDBData(nc, rs)
convey.ShouldContainSubstring(err.Error(), "[ParseRDBData] column not found, col=unknown_field")
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test ParseAnyData failed", func() {
nrs := &rentity.ResultSet{
Columns: []string{
consts.RDBFieldID,
convert.ColumnIDToRDBField(cols[0].ID),
convert.ColumnIDToRDBField(cols[1].ID),
convert.ColumnIDToRDBField(cols[2].ID),
},
Rows: []map[string]interface{}{
{
consts.RDBFieldID: 12345,
convert.ColumnIDToRDBField(cols[0].ID): "hello",
convert.ColumnIDToRDBField(cols[1].ID): 222,
convert.ColumnIDToRDBField(cols[2].ID): 1.1,
},
},
}
resp, err := k.ParseRDBData(c, nrs)
convey.ShouldContainSubstring(err.Error(), "[ParseRDBData] invalid column type")
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test success", func() {
exp := [][]*document.ColumnData{
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnID: 2,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(222)),
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
{
ColumnID: 4,
ColumnName: consts.RDBFieldID,
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(12345)),
},
},
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("qaq"),
},
{
ColumnID: 2,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(333)),
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("quq"),
},
{
ColumnID: 4,
ColumnName: consts.RDBFieldID,
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(12346)),
},
},
}
resp, err := k.ParseRDBData(c, rs)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldEqual, exp)
})
})
PatchConvey("test parse without column id", func() {
c := cols[:len(cols)-1]
PatchConvey("test column not found", func() {
nc := append(c, &entity.TableColumn{
ID: 9,
Name: "unknown_field",
Type: document.TableColumnTypeString,
})
resp, err := k.ParseRDBData(nc, rs)
convey.ShouldContainSubstring(err.Error(), "[ParseRDBData] altering table, retry later, col=unknown_field")
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test ParseAnyData failed", func() {
nrs := &rentity.ResultSet{
Columns: []string{
consts.RDBFieldID,
convert.ColumnIDToRDBField(cols[0].ID),
convert.ColumnIDToRDBField(cols[1].ID),
convert.ColumnIDToRDBField(cols[2].ID),
},
Rows: []map[string]interface{}{
{
consts.RDBFieldID: 12345,
convert.ColumnIDToRDBField(cols[0].ID): "hello",
convert.ColumnIDToRDBField(cols[1].ID): 222,
convert.ColumnIDToRDBField(cols[2].ID): 1.1,
},
},
}
resp, err := k.ParseRDBData(c, nrs)
convey.ShouldContainSubstring(err.Error(), "[ParseRDBData] invalid column type")
convey.So(resp, convey.ShouldBeNil)
})
PatchConvey("test success", func() {
exp := [][]*document.ColumnData{
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("hello"),
},
{
ColumnID: 2,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(222)),
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("bye"),
},
},
{
{
ColumnID: 1,
ColumnName: "test_col_1",
Type: document.TableColumnTypeString,
ValString: ptr.Of("qaq"),
},
{
ColumnID: 2,
ColumnName: "test_col_2",
Type: document.TableColumnTypeInteger,
ValInteger: ptr.Of(int64(333)),
},
{
ColumnID: 3,
ColumnName: "test_col_3",
Type: document.TableColumnTypeString,
ValString: ptr.Of("quq"),
},
},
}
resp, err := k.ParseRDBData(c, rs)
convey.So(err, convey.ShouldBeNil)
convey.So(resp, convey.ShouldEqual, exp)
})
})
})
}