slack-ruby-client 0.13.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/integration_test.yml +26 -0
  4. data/.github/workflows/lint.yml +14 -0
  5. data/.github/workflows/pr_lint.yml +21 -0
  6. data/.github/workflows/test.yml +36 -0
  7. data/.gitignore +5 -3
  8. data/.rubocop.yml +34 -5
  9. data/.rubocop_todo.yml +180 -46
  10. data/.ruby-version +1 -0
  11. data/CHANGELOG.md +119 -2
  12. data/CONTRIBUTING.md +23 -11
  13. data/Dangerfile +2 -0
  14. data/Gemfile +22 -5
  15. data/Gemfile.danger +6 -0
  16. data/LICENSE.md +1 -1
  17. data/README.md +236 -101
  18. data/RELEASING.md +2 -2
  19. data/Rakefile +2 -1
  20. data/UPGRADING.md +100 -2
  21. data/bin/commands/admin_analytics.rb +16 -0
  22. data/bin/commands/admin_apps.rb +51 -0
  23. data/bin/commands/admin_apps_approved.rb +17 -0
  24. data/bin/commands/admin_apps_requests.rb +28 -0
  25. data/bin/commands/admin_apps_restricted.rb +17 -0
  26. data/bin/commands/admin_audit_anomaly_allow.rb +23 -0
  27. data/bin/commands/admin_auth_policy.rb +39 -0
  28. data/bin/commands/admin_barriers.rb +47 -0
  29. data/bin/commands/admin_conversations.rb +171 -0
  30. data/bin/commands/admin_conversations_ekm.rb +17 -0
  31. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  32. data/bin/commands/admin_emoji.rb +54 -0
  33. data/bin/commands/admin_inviteRequests.rb +36 -0
  34. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  35. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  36. data/bin/commands/admin_teams.rb +27 -0
  37. data/bin/commands/admin_teams_admins.rb +16 -0
  38. data/bin/commands/admin_teams_owners.rb +16 -0
  39. data/bin/commands/admin_teams_settings.rb +64 -0
  40. data/bin/commands/admin_usergroups.rb +48 -0
  41. data/bin/commands/admin_users.rb +98 -0
  42. data/bin/commands/admin_users_session.rb +78 -0
  43. data/bin/commands/admin_users_unsupportedVersions.rb +15 -0
  44. data/bin/commands/api.rb +1 -1
  45. data/bin/commands/apps.rb +15 -0
  46. data/bin/commands/apps_connections.rb +13 -0
  47. data/bin/commands/apps_event_authorizations.rb +16 -0
  48. data/bin/commands/apps_manifest.rb +52 -0
  49. data/bin/commands/auth.rb +1 -0
  50. data/bin/commands/auth_teams.rb +16 -0
  51. data/bin/commands/bookmarks.rb +53 -0
  52. data/bin/commands/bots.rb +2 -0
  53. data/bin/commands/calls.rb +52 -0
  54. data/bin/commands/calls_participants.rb +25 -0
  55. data/bin/commands/chat.rb +61 -14
  56. data/bin/commands/chat_scheduledMessages.rb +19 -0
  57. data/bin/commands/conversations.rb +82 -10
  58. data/bin/commands/dialog.rb +1 -0
  59. data/bin/commands/dnd.rb +6 -3
  60. data/bin/commands/emoji.rb +1 -0
  61. data/bin/commands/files.rb +34 -18
  62. data/bin/commands/files_comments.rb +1 -21
  63. data/bin/commands/files_remote.rb +78 -0
  64. data/bin/commands/migration.rb +2 -0
  65. data/bin/commands/oauth.rb +2 -14
  66. data/bin/commands/oauth_v2.rb +29 -0
  67. data/bin/commands/openid_connect.rb +27 -0
  68. data/bin/commands/pins.rb +3 -6
  69. data/bin/commands/reactions.rb +3 -3
  70. data/bin/commands/reminders.rb +7 -0
  71. data/bin/commands/rtm.rb +1 -15
  72. data/bin/commands/search.rb +6 -1
  73. data/bin/commands/stars.rb +8 -6
  74. data/bin/commands/team.rb +6 -0
  75. data/bin/commands/team_billing.rb +13 -0
  76. data/bin/commands/team_preferences.rb +13 -0
  77. data/bin/commands/team_profile.rb +1 -0
  78. data/bin/commands/tooling_tokens.rb +14 -0
  79. data/bin/commands/usergroups.rb +7 -1
  80. data/bin/commands/usergroups_users.rb +3 -0
  81. data/bin/commands/users.rb +6 -4
  82. data/bin/commands/users_admin.rb +1 -0
  83. data/bin/commands/users_prefs.rb +1 -0
  84. data/bin/commands/users_profile.rb +6 -5
  85. data/bin/commands/views.rb +50 -0
  86. data/bin/commands/workflows.rb +38 -0
  87. data/bin/commands.rb +41 -8
  88. data/bin/slack +3 -4
  89. data/examples/hi_real_time_and_web/Gemfile +1 -0
  90. data/examples/hi_real_time_and_web/hi.rb +7 -3
  91. data/examples/hi_real_time_async_async/Gemfile +1 -0
  92. data/examples/hi_real_time_async_async/hi.rb +6 -2
  93. data/examples/hi_web/Gemfile +1 -0
  94. data/examples/hi_web/hi.rb +1 -0
  95. data/examples/new_ticket/Gemfile +1 -0
  96. data/examples/new_ticket/new_ticket.rb +1 -0
  97. data/lib/slack/config.rb +2 -2
  98. data/lib/slack/events/config.rb +32 -0
  99. data/lib/slack/events/request.rb +72 -0
  100. data/lib/slack/logger.rb +6 -5
  101. data/lib/slack/messages/formatting.rb +1 -0
  102. data/lib/slack/messages/message.rb +1 -4
  103. data/lib/slack/real_time/api/message.rb +6 -3
  104. data/lib/slack/real_time/api/message_id.rb +1 -0
  105. data/lib/slack/real_time/api/ping.rb +5 -2
  106. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  107. data/lib/slack/real_time/api/typing.rb +5 -2
  108. data/lib/slack/real_time/client.rb +105 -54
  109. data/lib/slack/real_time/concurrency/async.rb +77 -6
  110. data/lib/slack/real_time/concurrency.rb +1 -2
  111. data/lib/slack/real_time/config.rb +9 -13
  112. data/lib/slack/real_time/models/base.rb +1 -4
  113. data/lib/slack/real_time/models/bot.rb +1 -0
  114. data/lib/slack/real_time/models/channel.rb +5 -0
  115. data/lib/slack/real_time/models/im.rb +1 -0
  116. data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
  117. data/lib/slack/real_time/models/team.rb +1 -0
  118. data/lib/slack/real_time/models/user.rb +1 -0
  119. data/lib/slack/real_time/models.rb +3 -1
  120. data/lib/slack/real_time/socket.rb +45 -17
  121. data/lib/slack/real_time/stores/base.rb +28 -14
  122. data/lib/slack/real_time/stores/starter.rb +325 -297
  123. data/lib/slack/real_time/stores/store.rb +271 -196
  124. data/lib/slack/real_time/stores.rb +2 -7
  125. data/lib/slack/version.rb +2 -1
  126. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  127. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  128. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  129. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +51 -0
  130. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  131. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  132. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  133. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  134. data/lib/slack/web/api/endpoints/admin_conversations.rb +264 -0
  135. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  136. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  137. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  138. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  139. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  140. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  141. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  142. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  143. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  144. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  145. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  146. data/lib/slack/web/api/endpoints/admin_users.rb +163 -0
  147. data/lib/slack/web/api/endpoints/admin_users_session.rb +122 -0
  148. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  149. data/lib/slack/web/api/endpoints/api.rb +2 -3
  150. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  151. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  152. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  153. data/lib/slack/web/api/endpoints/apps_manifest.rb +77 -0
  154. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  155. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  156. data/lib/slack/web/api/endpoints/bookmarks.rb +88 -0
  157. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  158. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  159. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  160. data/lib/slack/web/api/endpoints/chat.rb +168 -65
  161. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  162. data/lib/slack/web/api/endpoints/conversations.rb +182 -67
  163. data/lib/slack/web/api/endpoints/dialog.rb +5 -4
  164. data/lib/slack/web/api/endpoints/dnd.rb +9 -4
  165. data/lib/slack/web/api/endpoints/emoji.rb +1 -0
  166. data/lib/slack/web/api/endpoints/files.rb +69 -37
  167. data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
  168. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  169. data/lib/slack/web/api/endpoints/migration.rb +6 -3
  170. data/lib/slack/web/api/endpoints/oauth.rb +7 -31
  171. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  172. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  173. data/lib/slack/web/api/endpoints/pins.rb +11 -18
  174. data/lib/slack/web/api/endpoints/reactions.rb +22 -21
  175. data/lib/slack/web/api/endpoints/reminders.rb +23 -10
  176. data/lib/slack/web/api/endpoints/rtm.rb +3 -25
  177. data/lib/slack/web/api/endpoints/search.rb +31 -16
  178. data/lib/slack/web/api/endpoints/stars.rb +14 -11
  179. data/lib/slack/web/api/endpoints/team.rb +15 -4
  180. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  181. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  182. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  183. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  184. data/lib/slack/web/api/endpoints/usergroups.rb +31 -20
  185. data/lib/slack/web/api/endpoints/usergroups_users.rb +13 -8
  186. data/lib/slack/web/api/endpoints/users.rb +24 -23
  187. data/lib/slack/web/api/endpoints/users_admin.rb +3 -2
  188. data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
  189. data/lib/slack/web/api/endpoints/users_profile.rb +8 -7
  190. data/lib/slack/web/api/endpoints/views.rb +102 -0
  191. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  192. data/lib/slack/web/api/endpoints.rb +82 -18
  193. data/lib/slack/web/api/error.rb +1 -0
  194. data/lib/slack/web/api/errors/server_error.rb +37 -0
  195. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  196. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  197. data/lib/slack/web/api/errors.rb +1116 -0
  198. data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +5 -6
  199. data/lib/slack/web/api/mixins/ids.id.rb +3 -2
  200. data/lib/slack/web/api/mixins/users.id.rb +3 -4
  201. data/lib/slack/web/api/mixins/users.search.rb +3 -1
  202. data/lib/slack/web/api/mixins.rb +2 -2
  203. data/lib/slack/web/api/patches/chat.attachments-blocks.patch +69 -0
  204. data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
  205. data/lib/slack/web/api/patches/views.view-json.patch +55 -0
  206. data/lib/slack/web/api/templates/command.erb +1 -0
  207. data/lib/slack/web/api/templates/commands.erb +1 -0
  208. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  209. data/lib/slack/web/api/templates/errors.erb +20 -0
  210. data/lib/slack/web/api/templates/method.erb +6 -2
  211. data/lib/slack/web/api/templates/method_spec.erb +2 -1
  212. data/lib/slack/web/client.rb +2 -1
  213. data/lib/slack/web/config.rb +5 -2
  214. data/lib/slack/web/faraday/connection.rb +24 -20
  215. data/lib/slack/web/faraday/request.rb +5 -1
  216. data/lib/slack/web/faraday/response/raise_error.rb +14 -7
  217. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  218. data/lib/slack/web/pagination/cursor.rb +7 -7
  219. data/lib/slack-ruby-client.rb +12 -5
  220. data/lib/slack.rb +1 -0
  221. data/lib/slack_ruby_client.rb +1 -0
  222. data/lib/tasks/git.rake +1 -0
  223. data/lib/tasks/real_time.rake +51 -21
  224. data/lib/tasks/update.rake +1 -0
  225. data/lib/tasks/web.rake +48 -12
  226. data/screenshots/create-app.png +0 -0
  227. data/slack-ruby-client.gemspec +7 -12
  228. data/spec/fixtures/slack/web/429_error.yml +50 -54
  229. data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
  230. data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
  231. data/spec/fixtures/slack/web/conversations_info.yml +167 -0
  232. data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
  233. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
  234. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
  235. data/spec/fixtures/slack/web/paginated_users_list.yml +501 -69
  236. data/spec/fixtures/slack/web/rtm_connect.yml +347 -26
  237. data/spec/fixtures/slack/web/users_info.yml +153 -69
  238. data/spec/fixtures/slack/web/users_list.yml +102 -41
  239. data/spec/fixtures/slack/web/views_open_error.yml +83 -0
  240. data/spec/integration/integration_spec.rb +115 -47
  241. data/spec/slack/config_spec.rb +2 -0
  242. data/spec/slack/events/config_spec.rb +35 -0
  243. data/spec/slack/events/request_spec.rb +188 -0
  244. data/spec/slack/messages/formatting_spec.rb +35 -13
  245. data/spec/slack/real_time/api/message_spec.rb +7 -2
  246. data/spec/slack/real_time/api/ping_spec.rb +3 -1
  247. data/spec/slack/real_time/api/typing_spec.rb +6 -2
  248. data/spec/slack/real_time/client_spec.rb +300 -142
  249. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
  250. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
  251. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
  252. data/spec/slack/real_time/event_handlers/bot_spec.rb +20 -17
  253. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +3 -2
  254. data/spec/slack/real_time/event_handlers/im_spec.rb +31 -27
  255. data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +36 -27
  256. data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +31 -24
  257. data/spec/slack/real_time/event_handlers/team_spec.rb +8 -7
  258. data/spec/slack/real_time/event_handlers/user_spec.rb +7 -5
  259. data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
  260. data/spec/slack/real_time/stores/store_spec.rb +50 -0
  261. data/spec/slack/slack_spec.rb +41 -6
  262. data/spec/slack/version_spec.rb +2 -1
  263. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  264. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  265. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +13 -0
  266. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  267. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -0
  268. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
  269. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
  270. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  271. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  272. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  273. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  274. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  275. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  276. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  277. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  278. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  279. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  280. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  281. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  282. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  283. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
  284. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  285. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +8 -0
  286. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  287. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  288. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  289. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
  290. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  291. data/spec/slack/web/api/endpoints/{apps_permissions_resources_spec.rb → auth_teams_spec.rb} +2 -1
  292. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +40 -0
  293. data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
  294. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  295. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  296. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  297. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +9 -7
  298. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +144 -40
  299. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
  300. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +18 -6
  301. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -3
  302. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +112 -0
  303. data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
  304. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  305. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  306. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  307. data/spec/slack/web/api/endpoints/files_spec.rb +18 -4
  308. data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
  309. data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -22
  310. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
  311. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
  312. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
  313. data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
  314. data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
  315. data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
  316. data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
  317. data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
  318. data/spec/slack/web/api/endpoints/{apps_permissions_scopes_spec.rb → team_billing_spec.rb} +2 -1
  319. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
  320. data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
  321. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  322. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
  323. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  324. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  325. data/spec/slack/web/api/endpoints/users_admin_spec.rb +1 -0
  326. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +1 -0
  327. data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
  328. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  329. data/spec/slack/web/api/error_spec.rb +7 -7
  330. data/spec/slack/web/api/errors/slack_error_spec.rb +26 -7
  331. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  332. data/spec/slack/web/api/mixins/conversations_spec.rb +45 -0
  333. data/spec/slack/web/api/mixins/users_spec.rb +19 -8
  334. data/spec/slack/web/api/pagination/cursor_spec.rb +47 -15
  335. data/spec/slack/web/client_spec.rb +199 -22
  336. data/spec/slack/web/faraday/request_spec.rb +80 -0
  337. data/spec/slack/web/faraday/response/raise_error_spec.rb +48 -12
  338. data/spec/spec_helper.rb +9 -2
  339. data/spec/support/queue_with_timeout.rb +5 -4
  340. data/spec/support/real_time/concurrency/mock.rb +1 -0
  341. data/spec/support/real_time/connected_client.rb +6 -6
  342. data/spec/support/real_time/event.rb +1 -0
  343. data/spec/support/real_time/loaded_client.rb +120 -0
  344. data/spec/support/token.rb +1 -0
  345. data/spec/support/vcr.rb +37 -1
  346. metadata +174 -262
  347. data/.travis.yml +0 -32
  348. data/bin/commands/apps_permissions.rb +0 -22
  349. data/bin/commands/apps_permissions_resources.rb +0 -14
  350. data/bin/commands/apps_permissions_scopes.rb +0 -12
  351. data/bin/commands/apps_permissions_users.rb +0 -25
  352. data/bin/commands/channels.rb +0 -175
  353. data/bin/commands/groups.rb +0 -174
  354. data/bin/commands/im.rb +0 -67
  355. data/bin/commands/mpim.rb +0 -65
  356. data/examples/hi_real_time/Gemfile +0 -5
  357. data/examples/hi_real_time/hi.gif +0 -0
  358. data/examples/hi_real_time/hi.rb +0 -37
  359. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  360. data/examples/hi_real_time_async_celluloid/Procfile +0 -2
  361. data/examples/hi_real_time_async_celluloid/hi.rb +0 -35
  362. data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
  363. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  364. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -35
  365. data/lib/slack/real_time/concurrency/celluloid.rb +0 -118
  366. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -66
  367. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
  368. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -30
  369. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -20
  370. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -49
  371. data/lib/slack/web/api/endpoints/channels.rb +0 -266
  372. data/lib/slack/web/api/endpoints/groups.rb +0 -265
  373. data/lib/slack/web/api/endpoints/im.rb +0 -113
  374. data/lib/slack/web/api/endpoints/mpim.rb +0 -108
  375. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  376. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  377. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  378. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  379. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  380. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  381. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  382. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  383. data/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -13
  384. data/screenshots/register-bot.png +0 -0
  385. data/spec/fixtures/slack/web/503_error.yml +0 -14
  386. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  387. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  388. data/spec/fixtures/slack/web/rtm_start.yml +0 -104
  389. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -106
  390. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  391. data/spec/slack/real_time/rtm_start_spec.rb +0 -13
  392. data/spec/slack/real_time/store_spec.rb +0 -11
  393. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  394. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -18
  395. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  396. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  397. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  398. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  399. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  400. data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -14
  401. data/spec/slack/web/api/mixins/channels_spec.rb +0 -33
  402. data/spec/slack/web/api/mixins/groups_spec.rb +0 -33
@@ -1,121 +1,152 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Slack::RealTime::Client do
4
5
  let(:ws) { double(Slack::RealTime::Concurrency::Mock::WebSocket, on: true) }
6
+
5
7
  before do
8
+ # supports passing tests in CI even with an actual SLACK_API_TOKEN set
6
9
  @token = ENV.delete('SLACK_API_TOKEN')
7
10
  Slack::Config.reset
8
11
  Slack::RealTime::Config.reset
9
12
  Slack::RealTime.configure do |config|
13
+ config.token = '<SLACK_API_TOKEN>'
10
14
  config.concurrency = Slack::RealTime::Concurrency::Mock
11
15
  end
12
16
  end
17
+
13
18
  after do
14
19
  ENV['SLACK_API_TOKEN'] = @token if @token
15
20
  end
21
+
16
22
  context 'token' do
17
- before do
18
- Slack.configure do |config|
19
- config.token = 'global default'
20
- end
21
- end
22
23
  it 'defaults token to global default' do
23
- client = Slack::RealTime::Client.new
24
- expect(client.token).to eq 'global default'
25
- expect(client.web_client.token).to eq 'global default'
24
+ client = described_class.new
25
+ expect(client.token).to eq '<SLACK_API_TOKEN>'
26
+ expect(client.web_client.token).to eq '<SLACK_API_TOKEN>'
26
27
  end
28
+
27
29
  context 'with real time config' do
28
30
  before do
29
- Slack::RealTime::Client.configure do |config|
31
+ described_class.configure do |config|
30
32
  config.token = 'custom real time token'
31
33
  end
32
34
  end
35
+
33
36
  it 'overrides token to real time config' do
34
- client = Slack::RealTime::Client.new
37
+ client = described_class.new
35
38
  expect(client.token).to eq 'custom real time token'
36
39
  expect(client.web_client.token).to eq 'custom real time token'
37
40
  end
41
+
38
42
  it 'overrides token to specific token' do
39
- client = Slack::RealTime::Client.new(token: 'local token')
43
+ client = described_class.new(token: 'local token')
40
44
  expect(client.token).to eq 'local token'
41
45
  expect(client.web_client.token).to eq 'local token'
42
46
  end
43
47
  end
44
48
  end
45
- context 'client with a full store', vcr: { cassette_name: 'web/rtm_start' } do
46
- let(:client) { Slack::RealTime::Client.new(store_class: Slack::RealTime::Stores::Store) }
47
- let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' }
49
+
50
+ context 'websocket_ping_timer' do
51
+ context 'with defaults' do
52
+ let(:client) { described_class.new }
53
+
54
+ it 'defaults to websocket_ping / 2' do
55
+ expect(client.websocket_ping_timer).to eq 15
56
+ end
57
+ end
58
+
59
+ context 'with websocket_ping value changed' do
60
+ let(:client) { described_class.new(websocket_ping: 22) }
61
+
62
+ it 'defaults to websocket_ping / 2' do
63
+ expect(client.websocket_ping_timer).to eq 11
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'client with a full store',
69
+ vcr: { cassette_name: 'web/rtm_connect', allow_playback_repeats: true } do
70
+ let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Store) }
71
+ let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
72
+
48
73
  describe '#start!' do
49
74
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
75
+
50
76
  before do
51
- allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
77
+ allow(Slack::RealTime::Socket).to(
78
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
79
+ )
52
80
  allow(socket).to receive(:connect!)
53
81
  allow(socket).to receive(:start_sync)
54
82
  client.start!
55
83
  end
84
+
56
85
  describe 'properties provided upon connection' do
57
86
  it 'sets url' do
58
87
  expect(client.url).to eq url
59
88
  end
89
+
60
90
  it 'sets team' do
61
91
  expect(client.team.domain).to eq 'dblockdotorg'
62
92
  end
93
+
63
94
  it 'sets teams' do
64
95
  expect(client.teams.count).to eq 1
65
96
  expect(client.teams.values.first).to eq client.team
66
97
  end
98
+
67
99
  it 'sets self' do
68
- expect(client.self.id).to eq 'U07518DTL'
100
+ expect(client.self.id).to eq 'U0J1GAHN1'
69
101
  end
70
- it 'sets users' do
71
- expect(client.users.count).to eq 18
72
- expect(client.users.values.first['id']).to eq 'U07518DTL'
73
- end
74
- it 'sets channels' do
75
- expect(client.channels.count).to eq 37
76
- expect(client.channels.values.first['name']).to eq 'a1'
77
- end
78
- it 'sets ims' do
79
- expect(client.ims.count).to eq 2
80
- expect(client.ims.values.first['user']).to eq 'USLACKBOT'
81
- end
82
- it 'sets bots' do
83
- expect(client.bots.count).to eq 16
84
- expect(client.bots.values.first['name']).to eq 'bot'
102
+
103
+ it 'sets user' do
104
+ expect(client.users.count).to eq 1
105
+ expect(client.users.values.first['id']).to eq 'U0J1GAHN1'
85
106
  end
86
- it 'sets groups' do
87
- expect(client.groups.count).to eq 1
107
+
108
+ it 'includes team name in to_s' do
109
+ expect(client.to_s).to eq(
110
+ "id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
111
+ )
88
112
  end
89
113
  end
114
+
90
115
  it 'uses web client to fetch url' do
91
116
  expect(client.web_client).to be_a Slack::Web::Client
92
117
  end
118
+
93
119
  it 'remembers socket' do
94
- expect(client.instance_variable_get('@socket')).to eq socket
120
+ expect(client.instance_variable_get(:@socket)).to eq socket
95
121
  end
122
+
96
123
  it 'cannot be invoked twice' do
97
124
  expect do
98
125
  client.start!
99
126
  end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
100
127
  end
128
+
101
129
  describe '#stop!' do
102
130
  before do
103
- expect(socket).to receive(:disconnect!)
131
+ allow(socket).to receive(:disconnect!)
104
132
  client.stop!
105
133
  end
134
+
106
135
  it 'cannot be invoked twice' do
107
- client.instance_variable_set('@socket', nil) # caused by a :close callback
136
+ client.instance_variable_set(:@socket, nil) # caused by a :close callback
108
137
  expect do
109
138
  client.stop!
110
139
  end.to raise_error Slack::RealTime::Client::ClientNotStartedError
111
140
  end
112
141
  end
142
+
113
143
  describe '#next_id' do
114
144
  it 'increments' do
115
145
  previous_id = client.send(:next_id)
116
146
  expect(client.send(:next_id)).to eq previous_id + 1
117
147
  end
118
148
  end
149
+
119
150
  context 'subclassed' do
120
151
  it 'runs event handlers' do
121
152
  event = Slack::RealTime::Event.new(
@@ -126,71 +157,184 @@ RSpec.describe Slack::RealTime::Client do
126
157
  expect(client.store.team.name).to eq 'New Team Name Inc.'
127
158
  end
128
159
  end
160
+
161
+ describe '#run_handlers' do
162
+ context 'when store has no event hooks' do
163
+ before do
164
+ @events = client.store.class.events.dup
165
+ client.store.class.events.clear
166
+ end
167
+
168
+ after do
169
+ client.store.class.events.merge!(@events)
170
+ end
171
+
172
+ it 'returns empty array of handlers' do
173
+ expect(client.send(:run_handlers, 'example', {})).to be_empty
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ describe '#start_async' do
180
+ let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
181
+
182
+ before do
183
+ allow(Slack::RealTime::Socket).to(
184
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
185
+ )
186
+ allow(socket).to receive(:connect!)
187
+ allow(socket).to receive(:start_async)
188
+ client.start_async
189
+ end
190
+
191
+ describe '#run_ping!' do
192
+ it 'sends ping messages when the websocket connection is idle' do
193
+ allow(socket).to receive(:time_since_last_message).and_return(30)
194
+ expect(socket).to receive(:send_data).with('{"type":"ping","id":1}')
195
+ client.run_ping!
196
+ end
197
+
198
+ it 'reconnects the websocket if it has been idle for too long' do
199
+ allow(socket).to receive(:time_since_last_message).and_return(75)
200
+ allow(socket).to receive(:connected?).and_return(true)
201
+ expect(socket).to receive(:close)
202
+ expect(socket).to receive(:restart_async)
203
+ client.run_ping!
204
+ end
205
+
206
+ [
207
+ EOFError,
208
+ Errno::ECONNRESET,
209
+ Errno::EPIPE,
210
+ Faraday::ClientError,
211
+ Slack::Web::Api::Errors::SlackError
212
+ ].each do |err|
213
+ context "raising #{err}" do
214
+ it 'does not terminate the ping worker' do
215
+ allow(socket).to receive(:time_since_last_message) { raise err }
216
+ expect(socket).not_to receive(:send_data)
217
+ client.run_ping!
218
+ end
219
+ end
220
+ end
221
+ context 'raising Slack::Web::Api::Errors::SlackError' do
222
+ %w[invalid_auth account_inactive].each do |code|
223
+ context code do
224
+ it 'does not terminate the ping worker' do
225
+ allow(socket).to receive(:time_since_last_message) {
226
+ raise Slack::Web::Api::Errors::SlackError, code
227
+ }
228
+ expect(socket).not_to receive(:send_data)
229
+ expect do
230
+ client.run_ping!
231
+ end.to raise_error Slack::Web::Api::Errors::SlackError, code
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
237
+ end
238
+
239
+ describe 'to_s' do
240
+ it 'defaults to class instance' do
241
+ expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
242
+ end
129
243
  end
130
244
  end
245
+
131
246
  context 'client with starter store', vcr: { cassette_name: 'web/rtm_connect' } do
132
- let(:client) { Slack::RealTime::Client.new(store_class: Slack::RealTime::Stores::Starter) }
133
- let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
247
+ let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Starter) }
248
+ let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
249
+
134
250
  describe '#start!' do
135
251
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
252
+
136
253
  before do
137
- allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
254
+ allow(Slack::RealTime::Socket).to(
255
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
256
+ )
138
257
  allow(socket).to receive(:connect!)
139
258
  allow(socket).to receive(:start_sync)
140
259
  client.start!
141
260
  end
261
+
142
262
  describe 'properties provided upon connection' do
143
263
  it 'sets url' do
144
264
  expect(client.url).to eq url
145
265
  end
266
+
146
267
  it 'sets team' do
147
268
  expect(client.team.domain).to eq 'dblockdotorg'
148
269
  end
270
+
149
271
  it 'sets self' do
150
- expect(client.self.id).to eq 'U07518DTL'
272
+ expect(client.self.id).to eq 'U0J1GAHN1'
273
+ end
274
+
275
+ it 'no teams' do
276
+ expect(client.teams).to be_nil
151
277
  end
278
+
152
279
  it 'no users' do
153
280
  expect(client.users).to be_nil
154
281
  end
155
- it 'no teams' do
156
- expect(client.teams).to be_nil
282
+
283
+ it 'no bots' do
284
+ expect(client.bots).to be_nil
157
285
  end
158
- it 'no channels' do
159
- expect(client.channels).to be_nil
286
+
287
+ it 'no public channels' do
288
+ expect(client.public_channels).to be_nil
289
+ end
290
+
291
+ it 'no private channels' do
292
+ expect(client.private_channels).to be_nil
160
293
  end
294
+
161
295
  it 'no ims' do
162
296
  expect(client.ims).to be_nil
163
297
  end
164
- it 'no bots' do
165
- expect(client.bots).to be_nil
298
+
299
+ it 'no mpims' do
300
+ expect(client.mpims).to be_nil
166
301
  end
167
- it 'no groups' do
168
- expect(client.groups).to be_nil
302
+
303
+ it 'includes team name in to_s' do
304
+ expect(client.to_s).to eq(
305
+ "id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
306
+ )
169
307
  end
170
308
  end
309
+
171
310
  it 'uses web client to fetch url' do
172
311
  expect(client.web_client).to be_a Slack::Web::Client
173
312
  end
313
+
174
314
  it 'remembers socket' do
175
- expect(client.instance_variable_get('@socket')).to eq socket
315
+ expect(client.instance_variable_get(:@socket)).to eq socket
176
316
  end
317
+
177
318
  it 'cannot be invoked twice' do
178
319
  expect do
179
320
  client.start!
180
321
  end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
181
322
  end
323
+
182
324
  describe '#stop!' do
183
325
  before do
184
- expect(socket).to receive(:disconnect!)
326
+ allow(socket).to receive(:disconnect!)
185
327
  client.stop!
186
328
  end
329
+
187
330
  it 'cannot be invoked twice' do
188
- client.instance_variable_set('@socket', nil) # caused by a :close callback
331
+ client.instance_variable_set(:@socket, nil) # caused by a :close callback
189
332
  expect do
190
333
  client.stop!
191
334
  end.to raise_error Slack::RealTime::Client::ClientNotStartedError
192
335
  end
193
336
  end
337
+
194
338
  describe '#next_id' do
195
339
  it 'increments' do
196
340
  previous_id = client.send(:next_id)
@@ -199,96 +343,151 @@ RSpec.describe Slack::RealTime::Client do
199
343
  end
200
344
  end
201
345
  end
346
+
202
347
  context 'client with nil store', vcr: { cassette_name: 'web/rtm_connect' } do
203
- let(:client) { Slack::RealTime::Client.new(store_class: nil) }
348
+ let(:client) { described_class.new(store_class: nil) }
204
349
  let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
350
+
205
351
  it 'sets store to nil' do
206
- expect(client.store).to be nil
352
+ expect(client.store).to be_nil
207
353
  end
354
+
208
355
  it "doesn't handle events" do
209
356
  event = Slack::RealTime::Event.new(
210
357
  'type' => 'team_rename',
211
358
  'name' => 'New Team Name Inc.'
212
359
  )
213
- expect(client).to_not receive(:run_handlers)
360
+ expect(client).not_to receive(:run_handlers)
214
361
  client.send(:dispatch, event)
215
362
  end
363
+
216
364
  it 'self' do
217
- expect(client.self).to be nil
365
+ expect(client.self).to be_nil
218
366
  end
367
+
219
368
  it 'team' do
220
- expect(client.team).to be nil
369
+ expect(client.team).to be_nil
370
+ end
371
+
372
+ describe 'to_s' do
373
+ it 'defaults to class instance' do
374
+ expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
375
+ end
221
376
  end
222
377
  end
378
+
223
379
  context 'client with defaults' do
224
- let(:client) { Slack::RealTime::Client.new }
380
+ let(:client) { described_class.new }
381
+
225
382
  describe '#initialize' do
226
383
  it 'sets ping' do
227
384
  expect(client.websocket_ping).to eq 30
228
385
  end
386
+
229
387
  it "doesn't set proxy" do
230
- expect(client.websocket_proxy).to be nil
388
+ expect(client.websocket_proxy).to be_nil
231
389
  end
390
+
232
391
  it 'defaults logger' do
233
392
  expect(client.send(:logger)).to be_a ::Logger
234
393
  end
394
+
235
395
  it 'sets default store_class' do
236
- expect(client.send(:store_class)).to eq Slack::RealTime::Store
396
+ expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Starter
237
397
  end
238
- (Slack::RealTime::Config::ATTRIBUTES - %i[logger store_class]).each do |key|
398
+
399
+ (Slack::RealTime::Config::ATTRIBUTES - %i[logger store_class token]).each do |key|
239
400
  it "sets #{key}" do
240
401
  expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
241
402
  end
242
403
  end
243
404
  end
405
+
406
+ describe '#run_ping?' do
407
+ it 'returns true when websocket_ping is greater than 0' do
408
+ client.websocket_ping = 30
409
+ expect(client.run_ping?).to be true
410
+ end
411
+
412
+ it 'returns false when websocket_ping is less than 1' do
413
+ client.websocket_ping = 0
414
+ expect(client.run_ping?).to be false
415
+ client.websocket_ping = nil
416
+ expect(client.run_ping?).to be false
417
+ end
418
+ end
244
419
  end
420
+
245
421
  context 'with custom settings' do
246
422
  describe '#initialize' do
247
423
  Slack::RealTime::Config::ATTRIBUTES.each do |key|
248
- context key do
249
- let(:client) { Slack::RealTime::Client.new(key => 'custom') }
424
+ context key.to_s do
425
+ let(:client) { described_class.new(key => 'custom') }
426
+
250
427
  it "sets #{key}" do
251
- expect(client.send(key)).to_not eq Slack::RealTime::Config.send(key)
428
+ expect(client.send(key)).not_to eq Slack::RealTime::Config.send(key)
252
429
  expect(client.send(key)).to eq 'custom'
253
430
  end
254
431
  end
255
432
  end
256
433
  end
434
+
435
+ describe 'logger accessor' do
436
+ let(:client) { described_class.new }
437
+
438
+ it 'exposes public logger' do
439
+ expect(client.logger).to be_a(::Logger)
440
+ end
441
+
442
+ it 'exposes public logger=' do
443
+ expect { client.logger = nil }.not_to raise_error(NoMethodError)
444
+ end
445
+ end
257
446
  end
447
+
258
448
  context 'global config' do
259
449
  after do
260
- Slack::RealTime::Client.config.reset
450
+ described_class.config.reset
261
451
  end
262
- let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' }
263
- let(:client) { Slack::RealTime::Client.new }
452
+
453
+ let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
454
+ let(:client) { described_class.new }
455
+
264
456
  context 'ping' do
265
457
  before do
266
- Slack::RealTime::Client.configure do |config|
458
+ described_class.configure do |config|
267
459
  config.websocket_ping = 15
268
460
  end
269
461
  end
462
+
270
463
  describe '#initialize' do
271
464
  it 'sets ping' do
272
465
  expect(client.websocket_ping).to eq 15
273
466
  end
274
- it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_start' } do
275
- expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(url, nil, ping: 15).and_return(ws)
467
+
468
+ it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_connect' } do
469
+ expect(Slack::RealTime::Concurrency::Mock::WebSocket).to(
470
+ receive(:new).with(url, nil, { ping: 15 }).and_return(ws)
471
+ )
276
472
  client.start!
277
473
  end
474
+
278
475
  it 'sets start_options' do
279
476
  expect(client.start_options).to eq(request: { timeout: 180 })
280
477
  end
281
478
  end
282
479
  end
480
+
283
481
  context 'proxy' do
284
482
  before do
285
- Slack::RealTime::Client.configure do |config|
483
+ described_class.configure do |config|
286
484
  config.websocket_proxy = {
287
485
  origin: 'http://username:password@proxy.example.com',
288
486
  headers: { 'User-Agent' => 'ruby' }
289
487
  }
290
488
  end
291
489
  end
490
+
292
491
  describe '#initialize' do
293
492
  it 'sets proxy' do
294
493
  expect(client.websocket_proxy).to eq(
@@ -296,66 +495,82 @@ RSpec.describe Slack::RealTime::Client do
296
495
  headers: { 'User-Agent' => 'ruby' }
297
496
  )
298
497
  end
299
- it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_start' } do
498
+
499
+ it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_connect' } do
300
500
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
301
501
  url,
302
502
  nil,
303
- ping: 30,
304
- proxy: {
305
- origin: 'http://username:password@proxy.example.com',
306
- headers: { 'User-Agent' => 'ruby' }
503
+ {
504
+ ping: 30,
505
+ proxy: {
506
+ origin: 'http://username:password@proxy.example.com',
507
+ headers: { 'User-Agent' => 'ruby' }
508
+ }
307
509
  }
308
510
  ).and_return(ws)
309
511
  client.start!
310
512
  end
311
513
  end
312
514
  end
515
+
313
516
  context 'start_options' do
314
517
  before do
315
- Slack::RealTime::Client.configure do |config|
316
- config.start_options = { simple_latest: true }
518
+ described_class.configure do |config|
519
+ config.start_options = { presence_sub: true }
317
520
  end
318
521
  end
522
+
319
523
  describe '#initialize' do
320
524
  it 'sets start_options' do
321
- expect(client.start_options).to eq(simple_latest: true)
525
+ expect(client.start_options).to eq(presence_sub: true)
322
526
  end
527
+
323
528
  context 'start!' do
324
529
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
530
+
325
531
  before do
326
532
  allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
327
533
  allow(socket).to receive(:connect!)
328
534
  allow(socket).to receive(:start_sync)
329
535
  end
330
- it 'calls rtm_start with start options', vcr: { cassette_name: 'web/rtm_start' } do
331
- expect(client.web_client).to receive(:rtm_start).with(simple_latest: true).and_call_original
536
+
537
+ it 'calls rtm.connect with start options', vcr: { cassette_name: 'web/rtm_connect' } do
538
+ expect(client.web_client).to(
539
+ receive(:rtm_connect).with({ presence_sub: true }).and_call_original
540
+ )
332
541
  client.start!
333
542
  end
334
543
  end
335
544
  end
336
545
  end
546
+
337
547
  context 'store_class' do
338
- context 'starter' do
548
+ context 'when configured with Starter class' do
339
549
  before do
340
- Slack::RealTime::Client.configure do |config|
550
+ described_class.configure do |config|
341
551
  config.store_class = Slack::RealTime::Stores::Starter
342
552
  end
343
553
  end
554
+
344
555
  describe '#initialize' do
345
- it 'can be overriden explicitly' do
346
- client = Slack::RealTime::Client.new(store_class: Slack::RealTime::Store)
347
- expect(client.send(:store_class)).to eq Slack::RealTime::Store
556
+ it 'can override the configured store class' do
557
+ client = described_class.new(store_class: Slack::RealTime::Stores::Store)
558
+ expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Store
348
559
  end
560
+
349
561
  it 'sets store_class' do
350
562
  expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter)
351
563
  end
564
+
352
565
  context 'start!' do
353
566
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
567
+
354
568
  before do
355
569
  allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
356
570
  allow(socket).to receive(:connect!)
357
571
  allow(socket).to receive(:start_sync)
358
572
  end
573
+
359
574
  it 'instantiates the correct store class', vcr: { cassette_name: 'web/rtm_connect' } do
360
575
  client.start!
361
576
  expect(client.store).to be_a Slack::RealTime::Stores::Starter
@@ -363,63 +578,6 @@ RSpec.describe Slack::RealTime::Client do
363
578
  end
364
579
  end
365
580
  end
366
- context 'store' do
367
- before do
368
- Slack::RealTime::Client.configure do |config|
369
- config.store_class = Slack::RealTime::Stores::Store
370
- end
371
- end
372
- describe '#initialize' do
373
- context 'start!' do
374
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
375
- before do
376
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
377
- allow(socket).to receive(:connect!)
378
- allow(socket).to receive(:start_sync)
379
- end
380
- it 'calls rtm_start and not rtm_connect', vcr: { cassette_name: 'web/rtm_start' } do
381
- expect(client.web_client).to receive(:rtm_start).and_call_original
382
- client.start!
383
- end
384
- end
385
- end
386
- end
387
- end
388
- context 'start_method' do
389
- describe '#initialize' do
390
- it 'can be overriden explicitly' do
391
- client = Slack::RealTime::Client.new(start_method: :overriden)
392
- expect(client.send(:start_method)).to eq :overriden
393
- end
394
- context 'with start_method' do
395
- before do
396
- Slack::RealTime::Client.configure do |config|
397
- config.start_method = :overriden
398
- end
399
- end
400
- it 'sets start_method' do
401
- expect(client.send(:start_method)).to eq :overriden
402
- end
403
- it 'calls the overriden method' do
404
- expect(client.web_client).to receive(:overriden).and_raise('overriden')
405
- expect do
406
- client.start!
407
- end.to raise_error RuntimeError, 'overriden'
408
- end
409
- end
410
- context 'start!' do
411
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
412
- before do
413
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
414
- allow(socket).to receive(:connect!)
415
- allow(socket).to receive(:start_sync)
416
- end
417
- it 'defaults to :rtm_start when using full store', vcr: { cassette_name: 'web/rtm_start' } do
418
- expect(client.web_client).to receive(:rtm_start).and_call_original
419
- client.start!
420
- end
421
- end
422
- end
423
581
  end
424
582
  end
425
583
  end