webapi_session_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package state
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/mk6i/retro-aim-server/server/webapi/types"
  7. )
  8. func TestWebAPISession_TempBuddies(t *testing.T) {
  9. tests := []struct {
  10. name string
  11. setupSession func() *WebAPISession
  12. operations func(*WebAPISession)
  13. expectedChecks func(*testing.T, *WebAPISession)
  14. }{
  15. {
  16. name: "Initialize_NilTempBuddies",
  17. setupSession: func() *WebAPISession {
  18. return &WebAPISession{
  19. AimSID: "test-session",
  20. ScreenName: DisplayScreenName("testuser"),
  21. EventQueue: types.NewEventQueue(100),
  22. CreatedAt: time.Now(),
  23. LastAccessed: time.Now(),
  24. ExpiresAt: time.Now().Add(time.Hour),
  25. }
  26. },
  27. operations: func(s *WebAPISession) {
  28. // Initialize TempBuddies if nil
  29. if s.TempBuddies == nil {
  30. s.TempBuddies = make(map[string]bool)
  31. }
  32. s.TempBuddies["buddy1"] = true
  33. },
  34. expectedChecks: func(t *testing.T, s *WebAPISession) {
  35. assert.NotNil(t, s.TempBuddies)
  36. assert.True(t, s.TempBuddies["buddy1"])
  37. assert.Equal(t, 1, len(s.TempBuddies))
  38. },
  39. },
  40. {
  41. name: "Add_MultipleTempBuddies",
  42. setupSession: func() *WebAPISession {
  43. return &WebAPISession{
  44. AimSID: "test-session",
  45. ScreenName: DisplayScreenName("testuser"),
  46. TempBuddies: make(map[string]bool),
  47. EventQueue: types.NewEventQueue(100),
  48. CreatedAt: time.Now(),
  49. LastAccessed: time.Now(),
  50. ExpiresAt: time.Now().Add(time.Hour),
  51. }
  52. },
  53. operations: func(s *WebAPISession) {
  54. s.TempBuddies["buddy1"] = true
  55. s.TempBuddies["buddy2"] = true
  56. s.TempBuddies["buddy3"] = true
  57. },
  58. expectedChecks: func(t *testing.T, s *WebAPISession) {
  59. assert.Equal(t, 3, len(s.TempBuddies))
  60. assert.True(t, s.TempBuddies["buddy1"])
  61. assert.True(t, s.TempBuddies["buddy2"])
  62. assert.True(t, s.TempBuddies["buddy3"])
  63. },
  64. },
  65. {
  66. name: "Add_DuplicateTempBuddy",
  67. setupSession: func() *WebAPISession {
  68. return &WebAPISession{
  69. AimSID: "test-session",
  70. ScreenName: DisplayScreenName("testuser"),
  71. TempBuddies: map[string]bool{"buddy1": true},
  72. EventQueue: types.NewEventQueue(100),
  73. CreatedAt: time.Now(),
  74. LastAccessed: time.Now(),
  75. ExpiresAt: time.Now().Add(time.Hour),
  76. }
  77. },
  78. operations: func(s *WebAPISession) {
  79. // Add the same buddy again
  80. s.TempBuddies["buddy1"] = true
  81. },
  82. expectedChecks: func(t *testing.T, s *WebAPISession) {
  83. // Should still only have one entry
  84. assert.Equal(t, 1, len(s.TempBuddies))
  85. assert.True(t, s.TempBuddies["buddy1"])
  86. },
  87. },
  88. {
  89. name: "Remove_TempBuddy",
  90. setupSession: func() *WebAPISession {
  91. return &WebAPISession{
  92. AimSID: "test-session",
  93. ScreenName: DisplayScreenName("testuser"),
  94. TempBuddies: map[string]bool{
  95. "buddy1": true,
  96. "buddy2": true,
  97. },
  98. EventQueue: types.NewEventQueue(100),
  99. CreatedAt: time.Now(),
  100. LastAccessed: time.Now(),
  101. ExpiresAt: time.Now().Add(time.Hour),
  102. }
  103. },
  104. operations: func(s *WebAPISession) {
  105. delete(s.TempBuddies, "buddy1")
  106. },
  107. expectedChecks: func(t *testing.T, s *WebAPISession) {
  108. assert.Equal(t, 1, len(s.TempBuddies))
  109. assert.False(t, s.TempBuddies["buddy1"])
  110. assert.True(t, s.TempBuddies["buddy2"])
  111. },
  112. },
  113. {
  114. name: "Check_NonExistentBuddy",
  115. setupSession: func() *WebAPISession {
  116. return &WebAPISession{
  117. AimSID: "test-session",
  118. ScreenName: DisplayScreenName("testuser"),
  119. TempBuddies: map[string]bool{"buddy1": true},
  120. EventQueue: types.NewEventQueue(100),
  121. CreatedAt: time.Now(),
  122. LastAccessed: time.Now(),
  123. ExpiresAt: time.Now().Add(time.Hour),
  124. }
  125. },
  126. operations: func(s *WebAPISession) {
  127. // No operations, just checking
  128. },
  129. expectedChecks: func(t *testing.T, s *WebAPISession) {
  130. assert.False(t, s.TempBuddies["nonexistent"])
  131. assert.True(t, s.TempBuddies["buddy1"])
  132. },
  133. },
  134. }
  135. for _, tt := range tests {
  136. t.Run(tt.name, func(t *testing.T) {
  137. // Setup
  138. session := tt.setupSession()
  139. // Perform operations
  140. tt.operations(session)
  141. // Verify
  142. tt.expectedChecks(t, session)
  143. })
  144. }
  145. }
  146. func TestWebAPISession_IsExpired(t *testing.T) {
  147. tests := []struct {
  148. name string
  149. expiresAt time.Time
  150. isExpired bool
  151. }{
  152. {
  153. name: "Not_Expired",
  154. expiresAt: time.Now().Add(time.Hour),
  155. isExpired: false,
  156. },
  157. {
  158. name: "Already_Expired",
  159. expiresAt: time.Now().Add(-time.Hour),
  160. isExpired: true,
  161. },
  162. {
  163. name: "Just_Expired",
  164. expiresAt: time.Now().Add(-time.Second),
  165. isExpired: true,
  166. },
  167. }
  168. for _, tt := range tests {
  169. t.Run(tt.name, func(t *testing.T) {
  170. session := &WebAPISession{
  171. AimSID: "test-session",
  172. ScreenName: DisplayScreenName("testuser"),
  173. ExpiresAt: tt.expiresAt,
  174. }
  175. assert.Equal(t, tt.isExpired, session.IsExpired())
  176. })
  177. }
  178. }
  179. func TestWebAPISession_WithTempBuddiesIntegration(t *testing.T) {
  180. // Test that temp buddies work correctly with a full session
  181. session := &WebAPISession{
  182. AimSID: "integration-test",
  183. ScreenName: DisplayScreenName("testuser"),
  184. EventQueue: types.NewEventQueue(100),
  185. TempBuddies: nil,
  186. CreatedAt: time.Now(),
  187. LastAccessed: time.Now(),
  188. ExpiresAt: time.Now().Add(time.Hour),
  189. FetchTimeout: 30000,
  190. }
  191. // Initialize TempBuddies
  192. session.TempBuddies = make(map[string]bool)
  193. // Simulate adding temp buddies
  194. buddies := []string{"alice", "bob", "charlie"}
  195. for _, buddy := range buddies {
  196. session.TempBuddies[buddy] = true
  197. }
  198. // Verify all buddies are present
  199. assert.Equal(t, 3, len(session.TempBuddies))
  200. for _, buddy := range buddies {
  201. assert.True(t, session.TempBuddies[buddy], "Buddy %s should be in TempBuddies", buddy)
  202. }
  203. // Test that temp buddies persist with the session
  204. assert.False(t, session.IsExpired())
  205. assert.Equal(t, "testuser", string(session.ScreenName))
  206. assert.NotNil(t, session.TempBuddies)
  207. // Simulate buddy removal
  208. delete(session.TempBuddies, "bob")
  209. assert.Equal(t, 2, len(session.TempBuddies))
  210. assert.False(t, session.TempBuddies["bob"])
  211. assert.True(t, session.TempBuddies["alice"])
  212. assert.True(t, session.TempBuddies["charlie"])
  213. }
  214. func TestWebAPISession_TempBuddiesIndependence(t *testing.T) {
  215. // Test that temp buddies are independent across sessions
  216. session1 := &WebAPISession{
  217. AimSID: "session1",
  218. ScreenName: DisplayScreenName("user1"),
  219. TempBuddies: map[string]bool{"buddy1": true},
  220. ExpiresAt: time.Now().Add(time.Hour),
  221. }
  222. session2 := &WebAPISession{
  223. AimSID: "session2",
  224. ScreenName: DisplayScreenName("user2"),
  225. TempBuddies: map[string]bool{"buddy2": true},
  226. ExpiresAt: time.Now().Add(time.Hour),
  227. }
  228. // Verify sessions have independent temp buddies
  229. assert.True(t, session1.TempBuddies["buddy1"])
  230. assert.False(t, session1.TempBuddies["buddy2"])
  231. assert.False(t, session2.TempBuddies["buddy1"])
  232. assert.True(t, session2.TempBuddies["buddy2"])
  233. // Modify one session's temp buddies
  234. session1.TempBuddies["buddy3"] = true
  235. // Verify it doesn't affect the other session
  236. assert.True(t, session1.TempBuddies["buddy3"])
  237. assert.False(t, session2.TempBuddies["buddy3"])
  238. }