chat_nav_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package handler
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/mkaminski/goaim/oscar"
  7. "github.com/mkaminski/goaim/state"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestChatNavService_CreateRoomHandler(t *testing.T) {
  11. userSess := newTestSession("user-screen-name", sessOptCannedID)
  12. chatRegistry := state.NewChatRegistry()
  13. sessionManager := newMockSessionManager(t)
  14. sessionManager.EXPECT().AddSession(userSess.ID(), userSess.ScreenName()).
  15. Return(&state.Session{})
  16. newChatRoom := func() state.ChatRoom {
  17. return state.ChatRoom{
  18. Cookie: "dummy-cookie",
  19. CreateTime: time.UnixMilli(0),
  20. }
  21. }
  22. newChatSessMgr := func() SessionManager {
  23. return sessionManager
  24. }
  25. inFrame := oscar.SNACFrame{
  26. RequestID: 1234,
  27. }
  28. inBody := oscar.SNAC_0x0E_0x02_ChatRoomInfoUpdate{
  29. Exchange: 1,
  30. Cookie: "create", // actual canned value sent by AIM client
  31. InstanceNumber: 2,
  32. DetailLevel: 3,
  33. TLVBlock: oscar.TLVBlock{
  34. TLVList: oscar.TLVList{
  35. oscar.NewTLV(oscar.ChatTLVRoomName, "the-chat-room-name"),
  36. },
  37. },
  38. }
  39. svc := NewChatNavService(nil, chatRegistry, newChatRoom, newChatSessMgr)
  40. outputSNAC, err := svc.CreateRoomHandler(context.Background(), userSess, inFrame, inBody)
  41. assert.NoError(t, err)
  42. expectChatRoom := state.ChatRoom{
  43. Cookie: "dummy-cookie",
  44. CreateTime: time.UnixMilli(0),
  45. DetailLevel: 3,
  46. Exchange: 1,
  47. InstanceNumber: 2,
  48. Name: "the-chat-room-name",
  49. }
  50. chatRoom, _, err := chatRegistry.Retrieve("dummy-cookie")
  51. assert.NoError(t, err)
  52. assert.Equal(t, expectChatRoom, chatRoom)
  53. expectSNAC := oscar.SNACMessage{
  54. Frame: oscar.SNACFrame{
  55. FoodGroup: oscar.ChatNav,
  56. SubGroup: oscar.ChatNavNavInfo,
  57. RequestID: 1234,
  58. },
  59. Body: oscar.SNAC_0x0D_0x09_ChatNavNavInfo{
  60. TLVRestBlock: oscar.TLVRestBlock{
  61. TLVList: oscar.TLVList{
  62. oscar.NewTLV(
  63. oscar.ChatNavRequestRoomInfo,
  64. oscar.SNAC_0x0E_0x02_ChatRoomInfoUpdate{
  65. Exchange: chatRoom.Exchange,
  66. Cookie: chatRoom.Cookie,
  67. InstanceNumber: chatRoom.InstanceNumber,
  68. DetailLevel: chatRoom.DetailLevel,
  69. TLVBlock: oscar.TLVBlock{
  70. TLVList: chatRoom.TLVList(),
  71. },
  72. },
  73. ),
  74. },
  75. },
  76. },
  77. }
  78. assert.Equal(t, expectSNAC, outputSNAC)
  79. }
  80. func TestChatNavService_RequestRoomInfoHandler(t *testing.T) {
  81. tests := []struct {
  82. name string
  83. chatRoom state.ChatRoom
  84. // inputSNAC is the SNAC sent from the client to the server
  85. inputSNAC oscar.SNACMessage
  86. want oscar.SNACMessage
  87. wantErr error
  88. }{
  89. {
  90. name: "request room info",
  91. chatRoom: state.ChatRoom{
  92. Cookie: "the-chat-id",
  93. DetailLevel: 2,
  94. Exchange: 4,
  95. InstanceNumber: 8,
  96. },
  97. inputSNAC: oscar.SNACMessage{
  98. Frame: oscar.SNACFrame{
  99. RequestID: 1234,
  100. },
  101. Body: oscar.SNAC_0x0D_0x04_ChatNavRequestRoomInfo{
  102. Cookie: []byte(`the-chat-id`),
  103. },
  104. },
  105. want: oscar.SNACMessage{
  106. Frame: oscar.SNACFrame{
  107. FoodGroup: oscar.ChatNav,
  108. SubGroup: oscar.ChatNavNavInfo,
  109. RequestID: 1234,
  110. },
  111. Body: oscar.SNAC_0x0D_0x09_ChatNavNavInfo{
  112. TLVRestBlock: oscar.TLVRestBlock{
  113. TLVList: oscar.TLVList{
  114. oscar.NewTLV(0x04, oscar.SNAC_0x0E_0x02_ChatRoomInfoUpdate{
  115. Cookie: "the-chat-id",
  116. DetailLevel: 2,
  117. Exchange: 4,
  118. InstanceNumber: 8,
  119. TLVBlock: oscar.TLVBlock{
  120. TLVList: state.ChatRoom{Cookie: "the-chat-id"}.TLVList(),
  121. },
  122. }),
  123. },
  124. },
  125. },
  126. },
  127. },
  128. }
  129. for _, tt := range tests {
  130. t.Run(tt.name, func(t *testing.T) {
  131. svc := NewChatNavService(nil, state.NewChatRegistry(), nil, nil)
  132. svc.chatRegistry.Register(tt.chatRoom, nil)
  133. got, err := svc.RequestRoomInfoHandler(nil, tt.inputSNAC.Frame,
  134. tt.inputSNAC.Body.(oscar.SNAC_0x0D_0x04_ChatNavRequestRoomInfo))
  135. assert.ErrorIs(t, err, tt.wantErr)
  136. if tt.wantErr != nil {
  137. return
  138. }
  139. assert.Equal(t, tt.want, got)
  140. })
  141. }
  142. }
  143. func TestChatNavService_RequestChatRightsHandler(t *testing.T) {
  144. svc := NewChatNavService(nil, nil, nil, nil)
  145. have := svc.RequestChatRightsHandler(nil, oscar.SNACFrame{RequestID: 1234})
  146. want := oscar.SNACMessage{
  147. Frame: oscar.SNACFrame{
  148. FoodGroup: oscar.ChatNav,
  149. SubGroup: oscar.ChatNavNavInfo,
  150. RequestID: 1234,
  151. },
  152. Body: oscar.SNAC_0x0D_0x09_ChatNavNavInfo{
  153. TLVRestBlock: oscar.TLVRestBlock{
  154. TLVList: oscar.TLVList{
  155. oscar.NewTLV(oscar.ChatNavTLVMaxConcurrentRooms, uint8(10)),
  156. oscar.NewTLV(oscar.ChatNavTLVExchangeInfo, oscar.SNAC_0x0D_0x09_TLVExchangeInfo{
  157. Identifier: 4,
  158. TLVBlock: oscar.TLVBlock{
  159. TLVList: oscar.TLVList{
  160. oscar.NewTLV(oscar.ChatNavTLVClassPerms, uint16(0x0010)),
  161. oscar.NewTLV(oscar.ChatNavTLVFlags, uint16(15)),
  162. oscar.NewTLV(oscar.ChatNavTLVRoomName, "default exchange"),
  163. oscar.NewTLV(oscar.ChatNavTLVCreatePerms, uint8(2)),
  164. oscar.NewTLV(oscar.ChatNavTLVCharSet1, "us-ascii"),
  165. oscar.NewTLV(oscar.ChatNavTLVLang1, "en"),
  166. oscar.NewTLV(oscar.ChatNavTLVCharSet2, "us-ascii"),
  167. oscar.NewTLV(oscar.ChatNavTLVLang2, "en"),
  168. },
  169. },
  170. }),
  171. },
  172. },
  173. },
  174. }
  175. assert.Equal(t, want, have)
  176. }