xtraz_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package wire
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. )
  6. func TestUnmangleXtrazXML(t *testing.T) {
  7. tests := []struct {
  8. name string
  9. mangled string
  10. want string
  11. }{
  12. {
  13. name: "unmangle basic entities",
  14. mangled: "<N><QUERY></QUERY></N>",
  15. want: "<N><QUERY></QUERY></N>",
  16. },
  17. {
  18. name: "unmangle all entities",
  19. mangled: "&lt;tag attr=&quot;value&quot;&gt;text &amp; more&lt;/tag&gt;",
  20. want: `<tag attr="value">text & more</tag>`,
  21. },
  22. {
  23. name: "plain text unchanged",
  24. mangled: "plain text",
  25. want: "plain text",
  26. },
  27. {
  28. name: "empty string",
  29. mangled: "",
  30. want: "",
  31. },
  32. }
  33. for _, tt := range tests {
  34. t.Run(tt.name, func(t *testing.T) {
  35. got := UnmangleXtrazXML(tt.mangled)
  36. assert.Equal(t, tt.want, got)
  37. })
  38. }
  39. }
  40. func TestMangleXtrazXML(t *testing.T) {
  41. tests := []struct {
  42. name string
  43. plain string
  44. want string
  45. }{
  46. {
  47. name: "mangle basic XML",
  48. plain: "<N><QUERY></QUERY></N>",
  49. want: "&lt;N&gt;&lt;QUERY&gt;&lt;/QUERY&gt;&lt;/N&gt;",
  50. },
  51. {
  52. name: "mangle special chars",
  53. plain: `<tag attr="value">text & more</tag>`,
  54. want: "&lt;tag attr=&#34;value&#34;&gt;text &amp; more&lt;/tag&gt;",
  55. },
  56. {
  57. name: "plain text unchanged",
  58. plain: "plain text",
  59. want: "plain text",
  60. },
  61. {
  62. name: "empty string",
  63. plain: "",
  64. want: "",
  65. },
  66. }
  67. for _, tt := range tests {
  68. t.Run(tt.name, func(t *testing.T) {
  69. got := MangleXtrazXML(tt.plain)
  70. assert.Equal(t, tt.want, got)
  71. })
  72. }
  73. }
  74. func TestParseXtrazNotifyRequest(t *testing.T) {
  75. tests := []struct {
  76. name string
  77. xml string
  78. want *XtrazNotifyRequest
  79. wantErr bool
  80. }{
  81. {
  82. name: "parse valid XStatus request",
  83. xml: `<N><QUERY><PluginID>srvMng</PluginID></QUERY>` +
  84. `<NOTIFY><srv><id>cAwaySrv</id>` +
  85. `<req><id>AwayStat</id><trans>1</trans><senderId>123456</senderId></req>` +
  86. `</srv></NOTIFY></N>`,
  87. want: &XtrazNotifyRequest{
  88. PluginID: "srvMng",
  89. ServiceID: "cAwaySrv",
  90. RequestID: "AwayStat",
  91. TransID: "1",
  92. SenderID: "123456",
  93. },
  94. wantErr: false,
  95. },
  96. {
  97. name: "parse invalid XML",
  98. xml: "<invalid>",
  99. want: nil,
  100. wantErr: true,
  101. },
  102. {
  103. name: "parse empty XML",
  104. xml: "",
  105. want: nil,
  106. wantErr: true,
  107. },
  108. }
  109. for _, tt := range tests {
  110. t.Run(tt.name, func(t *testing.T) {
  111. got, err := ParseXtrazNotifyRequest([]byte(tt.xml))
  112. if tt.wantErr {
  113. assert.Error(t, err)
  114. return
  115. }
  116. assert.NoError(t, err)
  117. assert.Equal(t, tt.want, got)
  118. })
  119. }
  120. }
  121. func TestParseXtrazNotifyResponse(t *testing.T) {
  122. tests := []struct {
  123. name string
  124. xml string
  125. want *XtrazNotifyResponse
  126. wantErr bool
  127. }{
  128. {
  129. name: "parse valid XStatus response",
  130. xml: `<NR><RES><ret event="OnRemoteNotification"><srv><id></id>` +
  131. `<val srv_id="cAwaySrv"><Root><CASXtraSetAwayMessage></CASXtraSetAwayMessage>` +
  132. `<uin>123456</uin><index>5</index><title>Having a beer</title>` +
  133. `<desc>Cheers!</desc></Root></val></srv></ret></RES></NR>`,
  134. want: &XtrazNotifyResponse{
  135. UIN: "123456",
  136. Index: 5,
  137. Title: "Having a beer",
  138. Message: "Cheers!",
  139. },
  140. wantErr: false,
  141. },
  142. {
  143. name: "parse XML without Root element",
  144. xml: "<NR><RES></RES></NR>",
  145. want: nil,
  146. wantErr: true,
  147. },
  148. {
  149. name: "parse empty XML",
  150. xml: "",
  151. want: nil,
  152. wantErr: true,
  153. },
  154. }
  155. for _, tt := range tests {
  156. t.Run(tt.name, func(t *testing.T) {
  157. got, err := ParseXtrazNotifyResponse([]byte(tt.xml))
  158. if tt.wantErr {
  159. assert.Error(t, err)
  160. return
  161. }
  162. assert.NoError(t, err)
  163. assert.Equal(t, tt.want, got)
  164. })
  165. }
  166. }
  167. func TestBuildXtrazNotifyRequest(t *testing.T) {
  168. senderUIN := "123456"
  169. result := BuildXtrazNotifyRequest(senderUIN)
  170. // Unmangle and verify the structure
  171. unmangled := UnmangleXtrazXML(result)
  172. assert.Contains(t, unmangled, "<N>")
  173. assert.Contains(t, unmangled, "<PluginID>srvMng</PluginID>")
  174. assert.Contains(t, unmangled, "<senderId>123456</senderId>")
  175. assert.Contains(t, unmangled, "<id>AwayStat</id>")
  176. assert.Contains(t, unmangled, "<id>cAwaySrv</id>")
  177. // Verify it can be parsed back
  178. parsed, err := ParseXtrazNotifyRequest([]byte(unmangled))
  179. assert.NoError(t, err)
  180. assert.Equal(t, "srvMng", parsed.PluginID)
  181. assert.Equal(t, "cAwaySrv", parsed.ServiceID)
  182. assert.Equal(t, "AwayStat", parsed.RequestID)
  183. assert.Equal(t, senderUIN, parsed.SenderID)
  184. }
  185. func TestBuildXtrazNotifyResponse(t *testing.T) {
  186. uin := "123456"
  187. index := uint8(5)
  188. title := "Having a beer"
  189. message := "Cheers!"
  190. result := BuildXtrazNotifyResponse(uin, index, title, message)
  191. // Unmangle and verify the structure
  192. unmangled := UnmangleXtrazXML(result)
  193. assert.Contains(t, unmangled, "<NR>")
  194. assert.Contains(t, unmangled, "<uin>123456</uin>")
  195. assert.Contains(t, unmangled, "<index>5</index>")
  196. // Verify it can be parsed back
  197. parsed, err := ParseXtrazNotifyResponse([]byte(unmangled))
  198. assert.NoError(t, err)
  199. assert.Equal(t, uin, parsed.UIN)
  200. assert.Equal(t, index, parsed.Index)
  201. }
  202. func TestXtrazCapabilityGUID(t *testing.T) {
  203. // Verify the GUID matches the expected GUID
  204. expected := "3b60b3ef-d82a-6c45-a4e0-9c5a5e67e865"
  205. assert.Equal(t, expected, CapXtrazScript.String())
  206. }
  207. func TestXStatusConstants(t *testing.T) {
  208. assert.Equal(t, uint8(1), XStatusAngry)
  209. assert.Equal(t, uint8(32), XStatusCoffee2)
  210. }