Skip to content

Commit a7c076e

Browse files
committed
fix ut
1 parent a629df8 commit a7c076e

5 files changed

Lines changed: 1115 additions & 5 deletions

File tree

backend/modules/evaluation/application/convertor/experiment/expt.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ func toEvaluatorConfDO(mapping []*domain_expt.EvaluatorFieldMapping, runConfigMa
9090
}
9191
ec := make([]*entity.EvaluatorConf, 0, len(mapping))
9292
for _, fm := range mapping {
93+
if fm == nil {
94+
continue
95+
}
9396
esf := make([]*entity.FieldConf, 0, len(fm.GetFromEvalSet()))
9497
for _, fes := range fm.GetFromEvalSet() {
9598
esf = append(esf, &entity.FieldConf{

backend/modules/evaluation/application/convertor/experiment/expt_template.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,9 @@ func toEvaluatorFieldMappingDoForTemplate(mapping []*domain_expt.EvaluatorFieldM
290290
result := make([]*entity.EvaluatorConf, 0, len(mapping))
291291

292292
for _, fm := range mapping {
293+
if fm == nil {
294+
continue
295+
}
293296
esf := make([]*entity.FieldConf, 0, len(fm.GetFromEvalSet()))
294297
for _, fes := range fm.GetFromEvalSet() {
295298
esf = append(esf, &entity.FieldConf{

backend/modules/evaluation/application/convertor/experiment/expt_test.go

Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,3 +2105,299 @@ func TestCreateEvalTargetParamDTO2DOForTemplate(t *testing.T) {
21052105
assert.Nil(t, result.BotInfoType)
21062106
})
21072107
}
2108+
2109+
func TestEvalConfConvert_ConvertToEntity_SetScoreWeight(t *testing.T) {
2110+
converter := &EvalConfConvert{}
2111+
scoreWeight1 := 0.6
2112+
scoreWeight2 := 0.4
2113+
2114+
t.Run("设置ScoreWeight到EvaluatorConf", func(t *testing.T) {
2115+
cer := &expt.CreateExperimentRequest{
2116+
EvaluatorFieldMapping: []*domain_expt.EvaluatorFieldMapping{
2117+
domain_expt.NewEvaluatorFieldMapping(),
2118+
domain_expt.NewEvaluatorFieldMapping(),
2119+
},
2120+
}
2121+
cer.EvaluatorFieldMapping[0].SetEvaluatorVersionID(101)
2122+
cer.EvaluatorFieldMapping[1].SetEvaluatorVersionID(102)
2123+
cer.EvaluatorScoreWeights = map[int64]float64{
2124+
101: scoreWeight1,
2125+
102: scoreWeight2,
2126+
}
2127+
2128+
result, err := converter.ConvertToEntity(cer, nil)
2129+
assert.NoError(t, err)
2130+
assert.NotNil(t, result)
2131+
assert.NotNil(t, result.ConnectorConf.EvaluatorsConf)
2132+
assert.Len(t, result.ConnectorConf.EvaluatorsConf.EvaluatorConf, 2)
2133+
2134+
// 验证 ScoreWeight 被正确设置
2135+
for _, conf := range result.ConnectorConf.EvaluatorsConf.EvaluatorConf {
2136+
if conf.EvaluatorVersionID == 101 {
2137+
assert.NotNil(t, conf.ScoreWeight)
2138+
assert.Equal(t, scoreWeight1, *conf.ScoreWeight)
2139+
} else if conf.EvaluatorVersionID == 102 {
2140+
assert.NotNil(t, conf.ScoreWeight)
2141+
assert.Equal(t, scoreWeight2, *conf.ScoreWeight)
2142+
}
2143+
}
2144+
})
2145+
2146+
t.Run("权重为0或负数,不设置ScoreWeight", func(t *testing.T) {
2147+
cer := &expt.CreateExperimentRequest{
2148+
EvaluatorFieldMapping: []*domain_expt.EvaluatorFieldMapping{
2149+
domain_expt.NewEvaluatorFieldMapping(),
2150+
},
2151+
}
2152+
cer.EvaluatorFieldMapping[0].SetEvaluatorVersionID(101)
2153+
cer.EvaluatorScoreWeights = map[int64]float64{
2154+
101: 0.0, // 权重为0,不应该设置
2155+
}
2156+
2157+
result, err := converter.ConvertToEntity(cer, nil)
2158+
assert.NoError(t, err)
2159+
assert.NotNil(t, result)
2160+
if result.ConnectorConf.EvaluatorsConf != nil && len(result.ConnectorConf.EvaluatorsConf.EvaluatorConf) > 0 {
2161+
conf := result.ConnectorConf.EvaluatorsConf.EvaluatorConf[0]
2162+
// 权重为0,不应该设置 ScoreWeight
2163+
assert.Nil(t, conf.ScoreWeight)
2164+
}
2165+
})
2166+
2167+
t.Run("EvaluatorConf为nil,跳过", func(t *testing.T) {
2168+
cer := &expt.CreateExperimentRequest{
2169+
EvaluatorFieldMapping: []*domain_expt.EvaluatorFieldMapping{
2170+
nil, // nil项,应该跳过
2171+
},
2172+
EvaluatorScoreWeights: map[int64]float64{
2173+
101: scoreWeight1,
2174+
},
2175+
}
2176+
2177+
result, err := converter.ConvertToEntity(cer, nil)
2178+
assert.NoError(t, err)
2179+
assert.NotNil(t, result)
2180+
// nil项应该被跳过,不会导致panic
2181+
})
2182+
}
2183+
2184+
func TestToExptDTO_BuildEvaluatorIDVersionItemsFromVersionRef(t *testing.T) {
2185+
t.Run("从EvaluatorVersionRef构建EvaluatorIDVersionItems", func(t *testing.T) {
2186+
scoreWeight := 0.7
2187+
experiment := &entity.Experiment{
2188+
// 没有 Evaluators,使用 EvaluatorVersionRef
2189+
EvaluatorVersionRef: []*entity.ExptEvaluatorVersionRef{
2190+
{
2191+
EvaluatorID: 1,
2192+
EvaluatorVersionID: 101,
2193+
},
2194+
{
2195+
EvaluatorID: 2,
2196+
EvaluatorVersionID: 102,
2197+
},
2198+
{
2199+
EvaluatorID: 0, // 无效,应该跳过
2200+
EvaluatorVersionID: 103,
2201+
},
2202+
{
2203+
EvaluatorID: 3,
2204+
EvaluatorVersionID: 0, // 无效,应该跳过
2205+
},
2206+
},
2207+
EvalConf: &entity.EvaluationConfiguration{
2208+
ConnectorConf: entity.Connector{
2209+
EvaluatorsConf: &entity.EvaluatorsConf{
2210+
EvaluatorConf: []*entity.EvaluatorConf{
2211+
{
2212+
EvaluatorVersionID: 101,
2213+
ScoreWeight: &scoreWeight,
2214+
},
2215+
},
2216+
},
2217+
},
2218+
},
2219+
}
2220+
2221+
result := ToExptDTO(experiment)
2222+
assert.NotNil(t, result)
2223+
// 验证权重配置被正确填充到 ScoreWeightConfig
2224+
if result.ScoreWeightConfig != nil {
2225+
assert.Equal(t, scoreWeight, result.ScoreWeightConfig.EvaluatorScoreWeights[101])
2226+
}
2227+
// 验证 EvaluatorIDVersionList 被构建(从 evaluatorVersionIDs 构建)
2228+
assert.NotNil(t, result.EvaluatorIDVersionList)
2229+
})
2230+
2231+
t.Run("优先使用Evaluators,不使用EvaluatorVersionRef", func(t *testing.T) {
2232+
experiment := &entity.Experiment{
2233+
Evaluators: []*entity.Evaluator{
2234+
{
2235+
ID: 1,
2236+
PromptEvaluatorVersion: &entity.PromptEvaluatorVersion{
2237+
EvaluatorID: 1,
2238+
ID: 101,
2239+
},
2240+
EvaluatorType: entity.EvaluatorTypePrompt,
2241+
},
2242+
},
2243+
EvaluatorVersionRef: []*entity.ExptEvaluatorVersionRef{
2244+
{
2245+
EvaluatorID: 2,
2246+
EvaluatorVersionID: 102,
2247+
},
2248+
},
2249+
}
2250+
2251+
result := ToExptDTO(experiment)
2252+
assert.NotNil(t, result)
2253+
// 应该优先使用 Evaluators 的信息构建 EvaluatorIDVersionList
2254+
assert.NotNil(t, result.EvaluatorIDVersionList)
2255+
})
2256+
}
2257+
2258+
func TestToExptDTO_FillExptTemplateMeta(t *testing.T) {
2259+
t.Run("填充ExptTemplateMeta", func(t *testing.T) {
2260+
experiment := &entity.Experiment{
2261+
ExptTemplateMeta: &entity.ExptTemplateMeta{
2262+
ID: 100,
2263+
WorkspaceID: 200,
2264+
Name: "template_name",
2265+
Desc: "template_desc",
2266+
ExptType: entity.ExptType_Offline,
2267+
},
2268+
}
2269+
2270+
result := ToExptDTO(experiment)
2271+
assert.NotNil(t, result)
2272+
assert.NotNil(t, result.ExptTemplateMeta)
2273+
assert.Equal(t, int64(100), gptr.Indirect(result.ExptTemplateMeta.ID))
2274+
assert.Equal(t, int64(200), gptr.Indirect(result.ExptTemplateMeta.WorkspaceID))
2275+
assert.Equal(t, "template_name", gptr.Indirect(result.ExptTemplateMeta.Name))
2276+
assert.Equal(t, "template_desc", gptr.Indirect(result.ExptTemplateMeta.Desc))
2277+
assert.Equal(t, domain_expt.ExptType_Offline, gptr.Indirect(result.ExptTemplateMeta.ExptType))
2278+
})
2279+
2280+
t.Run("ExptTemplateMeta为nil,不填充", func(t *testing.T) {
2281+
experiment := &entity.Experiment{
2282+
ExptTemplateMeta: nil,
2283+
}
2284+
2285+
result := ToExptDTO(experiment)
2286+
assert.NotNil(t, result)
2287+
assert.Nil(t, result.ExptTemplateMeta)
2288+
})
2289+
}
2290+
2291+
func TestToTargetFieldMappingDOForTemplate_RuntimeParam(t *testing.T) {
2292+
t.Run("设置RuntimeParam到CustomConf", func(t *testing.T) {
2293+
rtp := &entity.RuntimeParam{
2294+
JSONValue: gptr.Of(`{"key":"value"}`),
2295+
}
2296+
mapping := &domain_expt.TargetFieldMapping{
2297+
FromEvalSet: []*domain_expt.FieldMapping{
2298+
{
2299+
FieldName: gptr.Of("field1"),
2300+
FromFieldName: gptr.Of("from1"),
2301+
},
2302+
},
2303+
}
2304+
2305+
result := toTargetFieldMappingDOForTemplate(mapping, rtp)
2306+
assert.NotNil(t, result)
2307+
assert.NotNil(t, result.CustomConf)
2308+
assert.Len(t, result.CustomConf.FieldConfs, 1)
2309+
assert.Equal(t, consts.FieldAdapterBuiltinFieldNameRuntimeParam, result.CustomConf.FieldConfs[0].FieldName)
2310+
assert.Equal(t, `{"key":"value"}`, result.CustomConf.FieldConfs[0].Value)
2311+
})
2312+
2313+
t.Run("RuntimeParam为nil,不设置CustomConf", func(t *testing.T) {
2314+
mapping := &domain_expt.TargetFieldMapping{
2315+
FromEvalSet: []*domain_expt.FieldMapping{
2316+
{
2317+
FieldName: gptr.Of("field1"),
2318+
FromFieldName: gptr.Of("from1"),
2319+
},
2320+
},
2321+
}
2322+
2323+
result := toTargetFieldMappingDOForTemplate(mapping, nil)
2324+
assert.NotNil(t, result)
2325+
assert.Nil(t, result.CustomConf)
2326+
})
2327+
2328+
t.Run("RuntimeParam.JSONValue为空,不设置CustomConf", func(t *testing.T) {
2329+
rtp := &entity.RuntimeParam{
2330+
JSONValue: nil,
2331+
}
2332+
mapping := &domain_expt.TargetFieldMapping{}
2333+
2334+
result := toTargetFieldMappingDOForTemplate(mapping, rtp)
2335+
assert.NotNil(t, result)
2336+
assert.Nil(t, result.CustomConf)
2337+
})
2338+
2339+
t.Run("RuntimeParam.JSONValue为空字符串,不设置CustomConf", func(t *testing.T) {
2340+
rtp := &entity.RuntimeParam{
2341+
JSONValue: gptr.Of(""),
2342+
}
2343+
mapping := &domain_expt.TargetFieldMapping{}
2344+
2345+
result := toTargetFieldMappingDOForTemplate(mapping, rtp)
2346+
assert.NotNil(t, result)
2347+
assert.Nil(t, result.CustomConf)
2348+
})
2349+
}
2350+
2351+
func TestToEvaluatorFieldMappingDoForTemplate_Complete(t *testing.T) {
2352+
t.Run("完整转换评估器字段映射", func(t *testing.T) {
2353+
mapping := []*domain_expt.EvaluatorFieldMapping{
2354+
domain_expt.NewEvaluatorFieldMapping(),
2355+
}
2356+
mapping[0].SetEvaluatorVersionID(101)
2357+
mapping[0].SetFromEvalSet([]*domain_expt.FieldMapping{
2358+
{
2359+
FieldName: gptr.Of("input"),
2360+
FromFieldName: gptr.Of("col1"),
2361+
ConstValue: gptr.Of(""),
2362+
},
2363+
})
2364+
mapping[0].SetFromTarget([]*domain_expt.FieldMapping{
2365+
{
2366+
FieldName: gptr.Of("output"),
2367+
FromFieldName: gptr.Of("col2"),
2368+
},
2369+
})
2370+
mapping[0].SetEvaluatorIDVersionItem(&evaluatordto.EvaluatorIDVersionItem{
2371+
EvaluatorID: gptr.Of(int64(1)),
2372+
Version: gptr.Of("v1"),
2373+
EvaluatorVersionID: gptr.Of(int64(101)),
2374+
})
2375+
2376+
result := toEvaluatorFieldMappingDoForTemplate(mapping, nil)
2377+
assert.NotNil(t, result)
2378+
assert.Len(t, result, 1)
2379+
conf := result[0]
2380+
assert.Equal(t, int64(101), conf.EvaluatorVersionID)
2381+
assert.Equal(t, int64(1), conf.EvaluatorID)
2382+
assert.Equal(t, "v1", conf.Version)
2383+
assert.Len(t, conf.IngressConf.EvalSetAdapter.FieldConfs, 1)
2384+
assert.Len(t, conf.IngressConf.TargetAdapter.FieldConfs, 1)
2385+
})
2386+
2387+
t.Run("mapping为nil,返回nil", func(t *testing.T) {
2388+
result := toEvaluatorFieldMappingDoForTemplate(nil, nil)
2389+
assert.Nil(t, result)
2390+
})
2391+
2392+
t.Run("mapping包含nil项,跳过", func(t *testing.T) {
2393+
mapping := []*domain_expt.EvaluatorFieldMapping{
2394+
nil,
2395+
domain_expt.NewEvaluatorFieldMapping(),
2396+
}
2397+
mapping[1].SetEvaluatorVersionID(101)
2398+
2399+
result := toEvaluatorFieldMappingDoForTemplate(mapping, nil)
2400+
assert.NotNil(t, result)
2401+
assert.Len(t, result, 1)
2402+
})
2403+
}

0 commit comments

Comments
 (0)