|
|
package matcher
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
"testing"
|
|
|
|
|
|
"github.com/noahlann/nnet/internal/codec"
|
|
|
"github.com/noahlann/nnet/internal/request"
|
|
|
"github.com/noahlann/nnet/internal/response"
|
|
|
ctxpkg "github.com/noahlann/nnet/pkg/context"
|
|
|
routerpkg "github.com/noahlann/nnet/pkg/router"
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
)
|
|
|
|
|
|
func TestFrameDataMatcher(t *testing.T) {
|
|
|
// 创建测试Context
|
|
|
conn := &mockConnection{id: "test-conn"}
|
|
|
|
|
|
// 创建包含JSON数据的请求(使用float64以匹配JSON解析后的类型)
|
|
|
data := map[string]interface{}{
|
|
|
"user": map[string]interface{}{
|
|
|
"id": float64(1), // JSON解析后数字是float64类型
|
|
|
"name": "test",
|
|
|
},
|
|
|
}
|
|
|
jsonData, _ := json.Marshal(data)
|
|
|
req := request.New(jsonData, nil)
|
|
|
// 使用AsRequestSetter设置Data(模拟已解析的JSON数据)
|
|
|
if setter := request.AsRequestSetter(req); setter != nil {
|
|
|
setter.SetData(data)
|
|
|
}
|
|
|
|
|
|
codecRegistry := codec.NewRegistry()
|
|
|
resp := response.New(conn, nil, codecRegistry, "json")
|
|
|
ctx := ctxpkg.New(nil, conn, req, resp)
|
|
|
|
|
|
// 创建帧数据匹配器
|
|
|
matcher := NewFrameDataMatcher("user.id", "==", float64(1))
|
|
|
|
|
|
// 测试匹配
|
|
|
input := routerpkg.MatchInput{
|
|
|
Raw: jsonData,
|
|
|
DataBytes: jsonData,
|
|
|
Data: data,
|
|
|
}
|
|
|
assert.True(t, matcher.Match(input, ctx), "Expected match for user.id == 1")
|
|
|
}
|
|
|
|
|
|
func TestFrameDataMatcherNotMatch(t *testing.T) {
|
|
|
conn := &mockConnection{id: "test-conn"}
|
|
|
|
|
|
data := map[string]interface{}{
|
|
|
"user": map[string]interface{}{
|
|
|
"id": float64(2), // JSON解析后数字是float64类型
|
|
|
"name": "test",
|
|
|
},
|
|
|
}
|
|
|
jsonData, _ := json.Marshal(data)
|
|
|
req := request.New(jsonData, nil)
|
|
|
if setter := request.AsRequestSetter(req); setter != nil {
|
|
|
setter.SetData(data)
|
|
|
}
|
|
|
|
|
|
codecRegistry := codec.NewRegistry()
|
|
|
resp := response.New(conn, nil, codecRegistry, "json")
|
|
|
ctx := ctxpkg.New(nil, conn, req, resp)
|
|
|
|
|
|
matcher := NewFrameDataMatcher("user.id", "==", float64(1))
|
|
|
input := routerpkg.MatchInput{
|
|
|
Raw: jsonData,
|
|
|
DataBytes: jsonData,
|
|
|
Data: data,
|
|
|
}
|
|
|
assert.False(t, matcher.Match(input, ctx), "Expected no match")
|
|
|
}
|
|
|
|
|
|
func TestFrameDataMatcherPriority(t *testing.T) {
|
|
|
matcher := NewFrameDataMatcher("path", "==", "value")
|
|
|
assert.Equal(t, 150, matcher.Priority(), "Expected priority to be 150")
|
|
|
}
|