216 lines
6.8 KiB
Go
216 lines
6.8 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"modelRT/common"
|
|
"modelRT/constants"
|
|
"modelRT/database"
|
|
"modelRT/orm"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
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 name", token: "nspath.component.rated.attribute", dataObjectType: constants.DataObjectTypeParameter, field: "name"},
|
|
{name: "parameter rejects mode", token: "nspath.component.rated.attribute", dataObjectType: constants.DataObjectTypeParameter, field: "mode", 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)
|
|
}
|
|
|
|
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")
|
|
}
|