package wire
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestUnmangleXtrazXML(t *testing.T) {
tests := []struct {
name string
mangled string
want string
}{
{
name: "unmangle basic entities",
mangled: "<N><QUERY></QUERY></N>",
want: "",
},
{
name: "unmangle all entities",
mangled: "<tag attr="value">text & more</tag>",
want: `text & more`,
},
{
name: "plain text unchanged",
mangled: "plain text",
want: "plain text",
},
{
name: "empty string",
mangled: "",
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := UnmangleXtrazXML(tt.mangled)
assert.Equal(t, tt.want, got)
})
}
}
func TestMangleXtrazXML(t *testing.T) {
tests := []struct {
name string
plain string
want string
}{
{
name: "mangle basic XML",
plain: "",
want: "<N><QUERY></QUERY></N>",
},
{
name: "mangle special chars",
plain: `text & more`,
want: "<tag attr="value">text & more</tag>",
},
{
name: "plain text unchanged",
plain: "plain text",
want: "plain text",
},
{
name: "empty string",
plain: "",
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := MangleXtrazXML(tt.plain)
assert.Equal(t, tt.want, got)
})
}
}
func TestParseXtrazNotifyRequest(t *testing.T) {
tests := []struct {
name string
xml string
want *XtrazNotifyRequest
wantErr bool
}{
{
name: "parse valid XStatus request",
xml: `srvMng` +
`cAwaySrv` +
`AwayStat1123456` +
``,
want: &XtrazNotifyRequest{
PluginID: "srvMng",
ServiceID: "cAwaySrv",
RequestID: "AwayStat",
TransID: "1",
SenderID: "123456",
},
wantErr: false,
},
{
name: "parse invalid XML",
xml: "",
want: nil,
wantErr: true,
},
{
name: "parse empty XML",
xml: "",
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ParseXtrazNotifyRequest([]byte(tt.xml))
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, tt.want, got)
})
}
}
func TestParseXtrazNotifyResponse(t *testing.T) {
tests := []struct {
name string
xml string
want *XtrazNotifyResponse
wantErr bool
}{
{
name: "parse valid XStatus response",
xml: `` +
`` +
`1234565Having a beer` +
`Cheers!`,
want: &XtrazNotifyResponse{
UIN: "123456",
Index: 5,
Title: "Having a beer",
Message: "Cheers!",
},
wantErr: false,
},
{
name: "parse XML without Root element",
xml: "",
want: nil,
wantErr: true,
},
{
name: "parse empty XML",
xml: "",
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ParseXtrazNotifyResponse([]byte(tt.xml))
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, tt.want, got)
})
}
}
func TestBuildXtrazNotifyRequest(t *testing.T) {
senderUIN := "123456"
result := BuildXtrazNotifyRequest(senderUIN)
// Unmangle and verify the structure
unmangled := UnmangleXtrazXML(result)
assert.Contains(t, unmangled, "")
assert.Contains(t, unmangled, "srvMng")
assert.Contains(t, unmangled, "123456")
assert.Contains(t, unmangled, "AwayStat")
assert.Contains(t, unmangled, "cAwaySrv")
// Verify it can be parsed back
parsed, err := ParseXtrazNotifyRequest([]byte(unmangled))
assert.NoError(t, err)
assert.Equal(t, "srvMng", parsed.PluginID)
assert.Equal(t, "cAwaySrv", parsed.ServiceID)
assert.Equal(t, "AwayStat", parsed.RequestID)
assert.Equal(t, senderUIN, parsed.SenderID)
}
func TestBuildXtrazNotifyResponse(t *testing.T) {
uin := "123456"
index := uint8(5)
title := "Having a beer"
message := "Cheers!"
result := BuildXtrazNotifyResponse(uin, index, title, message)
// Unmangle and verify the structure
unmangled := UnmangleXtrazXML(result)
assert.Contains(t, unmangled, "")
assert.Contains(t, unmangled, "123456")
assert.Contains(t, unmangled, "5")
// Verify it can be parsed back
parsed, err := ParseXtrazNotifyResponse([]byte(unmangled))
assert.NoError(t, err)
assert.Equal(t, uin, parsed.UIN)
assert.Equal(t, index, parsed.Index)
}
func TestXtrazCapabilityGUID(t *testing.T) {
// Verify the GUID matches the expected GUID
expected := "3b60b3ef-d82a-6c45-a4e0-9c5a5e67e865"
assert.Equal(t, expected, CapXtrazScript.String())
}
func TestXStatusConstants(t *testing.T) {
assert.Equal(t, uint8(1), XStatusAngry)
assert.Equal(t, uint8(32), XStatusCoffee2)
}