| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- 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: "<N><QUERY></QUERY></N>",
- },
- {
- name: "unmangle all entities",
- mangled: "<tag attr="value">text & more</tag>",
- want: `<tag attr="value">text & more</tag>`,
- },
- {
- 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: "<N><QUERY></QUERY></N>",
- want: "<N><QUERY></QUERY></N>",
- },
- {
- name: "mangle special chars",
- plain: `<tag attr="value">text & more</tag>`,
- 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: `<N><QUERY><PluginID>srvMng</PluginID></QUERY>` +
- `<NOTIFY><srv><id>cAwaySrv</id>` +
- `<req><id>AwayStat</id><trans>1</trans><senderId>123456</senderId></req>` +
- `</srv></NOTIFY></N>`,
- want: &XtrazNotifyRequest{
- PluginID: "srvMng",
- ServiceID: "cAwaySrv",
- RequestID: "AwayStat",
- TransID: "1",
- SenderID: "123456",
- },
- wantErr: false,
- },
- {
- name: "parse invalid XML",
- xml: "<invalid>",
- 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: `<NR><RES><ret event="OnRemoteNotification"><srv><id></id>` +
- `<val srv_id="cAwaySrv"><Root><CASXtraSetAwayMessage></CASXtraSetAwayMessage>` +
- `<uin>123456</uin><index>5</index><title>Having a beer</title>` +
- `<desc>Cheers!</desc></Root></val></srv></ret></RES></NR>`,
- want: &XtrazNotifyResponse{
- UIN: "123456",
- Index: 5,
- Title: "Having a beer",
- Message: "Cheers!",
- },
- wantErr: false,
- },
- {
- name: "parse XML without Root element",
- xml: "<NR><RES></RES></NR>",
- 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, "<N>")
- assert.Contains(t, unmangled, "<PluginID>srvMng</PluginID>")
- assert.Contains(t, unmangled, "<senderId>123456</senderId>")
- assert.Contains(t, unmangled, "<id>AwayStat</id>")
- assert.Contains(t, unmangled, "<id>cAwaySrv</id>")
- // 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, "<NR>")
- assert.Contains(t, unmangled, "<uin>123456</uin>")
- assert.Contains(t, unmangled, "<index>5</index>")
- // 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)
- }
|