You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.0 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package response
import (
"context"
"errors"
"testing"
codecimpl "github.com/noahlann/nnet/internal/codec"
protocolpkg "github.com/noahlann/nnet/pkg/protocol"
unpackerpkg "github.com/noahlann/nnet/pkg/unpacker"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestResponse(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
_ = codecRegistry.Register("json", codecimpl.NewJSONCodec())
resp := New(mockConn, nil, codecRegistry, "json")
// 测试WriteString
err := resp.WriteString("hello")
require.NoError(t, err, "Expected no error when writing string")
assert.Equal(t, 1, len(mockConn.written), "Expected data to be written")
}
func TestResponseWriteBytes(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
resp := New(mockConn, nil, codecRegistry, "json")
data := []byte("test data")
err := resp.WriteBytes(data)
require.NoError(t, err, "Expected no error when writing bytes")
assert.Equal(t, 1, len(mockConn.written), "Expected data to be written")
assert.Equal(t, data, mockConn.written[0], "Expected written data to match")
}
func TestResponseWrite(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
_ = codecRegistry.Register("json", codecimpl.NewJSONCodec())
resp := New(mockConn, nil, codecRegistry, "json")
type TestStruct struct {
Name string `json:"name"`
Value int `json:"value"`
}
data := TestStruct{
Name: "test",
Value: 42,
}
err := resp.WriteWithCodec(data, "json")
require.NoError(t, err, "Expected no error when writing struct")
assert.Equal(t, 1, len(mockConn.written), "Expected data to be written")
}
func TestResponseWriteWithCodec(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
_ = codecRegistry.Register("json", codecimpl.NewJSONCodec())
resp := New(mockConn, nil, codecRegistry, "json")
type TestStruct struct {
Name string `json:"name"`
}
data := TestStruct{
Name: "test",
}
err := resp.WriteWithCodec(data, "json")
require.NoError(t, err, "Expected no error when writing with codec")
assert.Equal(t, 1, len(mockConn.written), "Expected data to be written")
}
func TestResponseWriteWithInvalidCodec(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
resp := New(mockConn, nil, codecRegistry, "json")
err := resp.WriteWithCodec("test", "nonexistent")
assert.Error(t, err, "Expected error for nonexistent codec")
}
func TestResponseHeader(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
resp := New(mockConn, nil, codecRegistry, "json")
// 测试Header初始可能为nil取决于协议
header := resp.Header()
// Header可能为nil无帧头协议这是正常的
_ = header
}
func TestResponseSetHeader(t *testing.T) {
mockConn := &mockConnectionWriter{}
codecRegistry := codecimpl.NewRegistry()
resp := New(mockConn, nil, codecRegistry, "json").(*responseImpl)
// 设置Header
newHeader := NewFrameHeader()
newHeader.Set("message_id", uint64(123))
newHeader.Set("type", "response")
resp.SetHeader(newHeader)
// 验证Header
header := resp.Header()
assert.NotNil(t, header, "Expected header to be non-nil")
assert.Equal(t, uint64(123), header.Get("message_id"), "Expected message ID to match")
assert.Equal(t, "response", header.Get("type"), "Expected type to match")
}
func TestResponseWriteError(t *testing.T) {
mockConn := &mockConnectionWriter{
writeError: errors.New("write error"),
}
codecRegistry := codecimpl.NewRegistry()
resp := New(mockConn, nil, codecRegistry, "json")
err := resp.WriteString("test")
assert.Error(t, err, "Expected error when write fails")
}
func TestResponseWriteWithProtocol(t *testing.T) {
mockConn := &mockConnectionWriter{}
mockProtocol := &mockProtocol{}
codecRegistry := codecimpl.NewRegistry()
resp := New(mockConn, mockProtocol, codecRegistry, "json")
err := resp.WriteString("test")
require.NoError(t, err, "Expected no error when writing with protocol")
assert.Equal(t, 1, len(mockConn.written), "Expected data to be written")
}
// mockConnectionWriter 模拟连接写入器
type mockConnectionWriter struct {
written [][]byte
writeError error
}
func (m *mockConnectionWriter) Write(data []byte) error {
if m.writeError != nil {
return m.writeError
}
m.written = append(m.written, data)
return nil
}
// mockProtocol 模拟协议
type mockProtocol struct{}
func (m *mockProtocol) Name() string {
return "test"
}
func (m *mockProtocol) Version() string {
return "1.0"
}
func (m *mockProtocol) HasHeader() bool {
return false
}
func (m *mockProtocol) Encode(data []byte, header protocolpkg.FrameHeader) ([]byte, error) {
return data, nil
}
func (m *mockProtocol) Decode(data []byte) (protocolpkg.FrameHeader, []byte, error) {
return nil, data, nil
}
func (m *mockProtocol) Handle(ctx context.Context, data []byte) ([]byte, error) {
return data, nil
}
func (m *mockProtocol) Unpacker() unpackerpkg.Unpacker {
return nil
}