2026-07-15 17:33:55 +08:00
package handler
import (
"context"
"testing"
"modelRT/common"
2026-07-16 16:04:39 +08:00
"modelRT/constants"
"modelRT/database"
2026-07-15 17:33:55 +08:00
"modelRT/orm"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
2026-07-16 16:04:39 +08:00
func TestValidateDataObjectField ( t * testing . T ) {
tests := [ ] struct {
name string
token string
dataObjectType constants . DataObjectType
field string
wantErr error
} {
{ name : "bay value" , token : "nspath.component.bay.measurement" , dataObjectType : constants . DataObjectTypeMeasurement , field : "value" } ,
{ name : "bay name" , token : "nspath.component.bay.measurement" , dataObjectType : constants . DataObjectTypeMeasurement , field : "name" } ,
{ name : "bay binding" , token : "nspath.component.bay.measurement" , dataObjectType : constants . DataObjectTypeMeasurement , field : "binding" } ,
{ name : "bay field is case insensitive" , token : "nspath.component.bay.measurement" , dataObjectType : constants . DataObjectTypeMeasurement , field : "DATA_SOURCE" } ,
{ name : "bay unsupported" , token : "nspath.component.bay.measurement" , dataObjectType : constants . DataObjectTypeMeasurement , field : "unknown" , wantErr : common . ErrUnsupportedMeasurementField } ,
{ name : "parameter value" , token : "nspath.component.rated.attribute" , dataObjectType : constants . DataObjectTypeParameter , field : "value" } ,
{ name : "parameter mode" , token : "nspath.component.rated.attribute" , dataObjectType : constants . DataObjectTypeParameter , field : "mode" } ,
{ name : "parameter rejects name" , token : "nspath.component.rated.attribute" , dataObjectType : constants . DataObjectTypeParameter , field : "name" , wantErr : common . ErrUnsupportedParameterField } ,
{ name : "component name" , token : "nspath.component.component.name" , dataObjectType : constants . DataObjectTypeParameter , field : "name" } ,
{ name : "component rejects mode" , token : "nspath.component.component.name" , dataObjectType : constants . DataObjectTypeParameter , field : "mode" , wantErr : common . ErrUnsupportedParameterField } ,
{ name : "parameter rejects size" , token : "nspath.component.rated.attribute" , dataObjectType : constants . DataObjectTypeParameter , field : "size" , wantErr : common . ErrUnsupportedParameterField } ,
{ name : "invalid type" , token : "token" , dataObjectType : constants . DataObjectType ( "unknown" ) , field : "value" , wantErr : assert . AnError } ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
err := validateDataObjectField ( tt . token , tt . dataObjectType , tt . field )
if tt . wantErr == nil {
require . NoError ( t , err )
return
}
require . Error ( t , err )
if tt . wantErr != assert . AnError {
assert . ErrorIs ( t , err , tt . wantErr )
}
} )
}
}
func TestBuildParameterAttributeValue ( t * testing . T ) {
parameter := & database . ParameterDataObject {
Component : orm . Component {
GridName : "grid000" ,
ZoneName : "zone000" ,
StationName : "station000" ,
NSPath : "110kV_TV" ,
Tag : "cable_22" ,
} ,
AttributeGroup : "rated" ,
AttributeName : "rated_voltage" ,
AttributeType : "DOUBLE PRECISION" ,
}
loader := func ( _ context . Context , actual * database . ParameterDataObject ) ( any , error ) {
assert . Same ( t , parameter , actual )
return float64 ( 220 ) , nil
}
descriptionLoader := func ( _ context . Context , attributeName string ) ( string , error ) {
assert . Equal ( t , "rated_voltage" , attributeName )
return "额定电压" , nil
}
tests := [ ] struct {
field string
expected any
} {
{ field : "value" , expected : float64 ( 220 ) } ,
{ field : "meta" , expected : "PARAM" } ,
{ field : "type" , expected : "DOUBLE PRECISION" } ,
{ field : "name" , expected : "110kV_TV.cable_22.rated.rated_voltage" } ,
{ field : "description" , expected : "额定电压" } ,
{ field : "id" , expected : "grid000.zone000.station000.110kV_TV.cable_22.rated.rated_voltage" } ,
}
for _ , tt := range tests {
t . Run ( tt . field , func ( t * testing . T ) {
actual , err := buildParameterAttributeValue (
context . Background ( ) ,
tt . field ,
parameter ,
loader ,
descriptionLoader ,
)
require . NoError ( t , err )
assert . Equal ( t , tt . expected , actual )
} )
}
}
func TestBuildParameterAttributeValueRejectsUnsupportedField ( t * testing . T ) {
_ , err := buildParameterAttributeValue (
context . Background ( ) ,
"unknown" ,
& database . ParameterDataObject { } ,
nil ,
nil ,
)
require . Error ( t , err )
assert . ErrorIs ( t , err , common . ErrUnsupportedParameterField )
}
2026-07-15 17:33:55 +08:00
func TestBuildMeasurementAttributeValue ( t * testing . T ) {
dataSource := orm . JSONMap {
"type" : float64 ( 1 ) ,
"io_address" : map [ string ] any {
"channel" : "tm1p" ,
} ,
}
eventPlan := orm . JSONMap { "enabled" : true }
binding := orm . JSONMap { "ct" : map [ string ] any { "ratio" : float64 ( 2 ) } }
measurement := & orm . Measurement {
Tag : "IA_rms" ,
Name : "A相电流" ,
Mode : 1 ,
Size : 10 ,
DataSource : dataSource ,
EventPlan : eventPlan ,
Binding : binding ,
}
component := & orm . Component {
GridName : "grid000" ,
ZoneName : "zone000" ,
StationName : "station000" ,
NSPath : "110kV_TV" ,
Tag : "cable_22" ,
}
loader := func ( _ context . Context , source orm . JSONMap ) ( any , error ) {
assert . Equal ( t , dataSource , source )
return float64 ( 220 ) , nil
}
tests := [ ] struct {
field string
expected any
} {
{ field : "value" , expected : float64 ( 220 ) } ,
{ field : "mode" , expected : true } ,
{ field : "meta" , expected : "MEASUREMENT" } ,
{ field : "type" , expected : "TM" } ,
{ field : "name" , expected : "110kV_TV.IA_rms" } ,
{ field : "description" , expected : "A相电流" } ,
{ field : "id" , expected : "grid000.zone000.station000.110kV_TV.cable_22.bay.IA_rms" } ,
{ field : "size" , expected : 10 } ,
{ field : "data_source" , expected : dataSource } ,
{ field : "event_plan" , expected : eventPlan } ,
{ field : "binding" , expected : binding } ,
}
for _ , tt := range tests {
t . Run ( tt . field , func ( t * testing . T ) {
actual , err := buildMeasurementAttributeValue ( context . Background ( ) , tt . field , measurement , component , loader )
require . NoError ( t , err )
assert . Equal ( t , tt . expected , actual )
} )
}
}
func TestBuildMeasurementAttributeValueRejectsUnsupportedField ( t * testing . T ) {
_ , err := buildMeasurementAttributeValue (
context . Background ( ) ,
"unknown" ,
& orm . Measurement { } ,
& orm . Component { } ,
nil ,
)
require . Error ( t , err )
assert . ErrorIs ( t , err , common . ErrUnsupportedMeasurementField )
}
func TestBuildMeasurementAttributeValueMode ( t * testing . T ) {
component := & orm . Component { }
manualMode , err := buildMeasurementAttributeValue (
context . Background ( ) ,
"mode" ,
& orm . Measurement { Mode : 0 } ,
component ,
nil ,
)
require . NoError ( t , err )
assert . Equal ( t , false , manualMode )
automaticMode , err := buildMeasurementAttributeValue (
context . Background ( ) ,
"mode" ,
& orm . Measurement { Mode : 1 } ,
component ,
nil ,
)
require . NoError ( t , err )
assert . Equal ( t , true , automaticMode )
_ , err = buildMeasurementAttributeValue (
context . Background ( ) ,
"mode" ,
& orm . Measurement { Mode : 2 } ,
component ,
nil ,
)
require . Error ( t , err )
assert . Contains ( t , err . Error ( ) , "expected 0 or 1" )
}