slack-ruby-client 0.7.2 → 1.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 (383) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +2 -0
  4. data/.gitmodules +1 -1
  5. data/.rubocop.yml +37 -1
  6. data/.rubocop_todo.yml +130 -47
  7. data/.travis.yml +17 -13
  8. data/CHANGELOG.md +254 -43
  9. data/CONTRIBUTING.md +26 -15
  10. data/Dangerfile +3 -0
  11. data/Gemfile +13 -2
  12. data/LICENSE.md +1 -1
  13. data/README.md +287 -63
  14. data/RELEASING.md +22 -14
  15. data/Rakefile +2 -1
  16. data/UPGRADING.md +129 -5
  17. data/bin/commands/admin_analytics.rb +16 -0
  18. data/bin/commands/admin_apps.rb +51 -0
  19. data/bin/commands/admin_apps_approved.rb +17 -0
  20. data/bin/commands/admin_apps_requests.rb +17 -0
  21. data/bin/commands/admin_apps_restricted.rb +17 -0
  22. data/bin/commands/admin_auth_policy.rb +39 -0
  23. data/bin/commands/admin_barriers.rb +47 -0
  24. data/bin/commands/admin_conversations.rb +169 -0
  25. data/bin/commands/admin_conversations_ekm.rb +17 -0
  26. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  27. data/bin/commands/admin_conversations_whitelist.rb +37 -0
  28. data/bin/commands/admin_emoji.rb +54 -0
  29. data/bin/commands/admin_inviteRequests.rb +36 -0
  30. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  31. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  32. data/bin/commands/admin_teams.rb +27 -0
  33. data/bin/commands/admin_teams_admins.rb +16 -0
  34. data/bin/commands/admin_teams_owners.rb +16 -0
  35. data/bin/commands/admin_teams_settings.rb +64 -0
  36. data/bin/commands/admin_usergroups.rb +48 -0
  37. data/bin/commands/admin_users.rb +98 -0
  38. data/bin/commands/admin_users_session.rb +78 -0
  39. data/bin/commands/api.rb +3 -3
  40. data/bin/commands/apps.rb +15 -0
  41. data/bin/commands/apps_connections.rb +13 -0
  42. data/bin/commands/apps_event_authorizations.rb +16 -0
  43. data/bin/commands/apps_manifest.rb +51 -0
  44. data/bin/commands/apps_permissions.rb +23 -0
  45. data/bin/commands/apps_permissions_resources.rb +15 -0
  46. data/bin/commands/apps_permissions_scopes.rb +13 -0
  47. data/bin/commands/apps_permissions_users.rb +26 -0
  48. data/bin/commands/auth.rb +12 -2
  49. data/bin/commands/auth_teams.rb +16 -0
  50. data/bin/commands/bots.rb +15 -0
  51. data/bin/commands/calls.rb +52 -0
  52. data/bin/commands/calls_participants.rb +25 -0
  53. data/bin/commands/channels.rb +6 -132
  54. data/bin/commands/chat.rb +127 -20
  55. data/bin/commands/chat_scheduledMessages.rb +19 -0
  56. data/bin/commands/conversations.rb +253 -0
  57. data/bin/commands/dialog.rb +15 -0
  58. data/bin/commands/dnd.rb +12 -9
  59. data/bin/commands/emoji.rb +3 -2
  60. data/bin/commands/files.rb +47 -31
  61. data/bin/commands/files_comments.rb +3 -23
  62. data/bin/commands/files_remote.rb +78 -0
  63. data/bin/commands/groups.rb +1 -154
  64. data/bin/commands/im.rb +1 -48
  65. data/bin/commands/migration.rb +16 -0
  66. data/bin/commands/mpim.rb +1 -48
  67. data/bin/commands/oauth.rb +4 -2
  68. data/bin/commands/oauth_v2.rb +29 -0
  69. data/bin/commands/openid_connect.rb +27 -0
  70. data/bin/commands/pins.rb +9 -12
  71. data/bin/commands/reactions.rb +17 -15
  72. data/bin/commands/reminders.rb +17 -10
  73. data/bin/commands/rtm.rb +19 -4
  74. data/bin/commands/search.rb +17 -12
  75. data/bin/commands/stars.rb +12 -9
  76. data/bin/commands/team.rb +23 -8
  77. data/bin/commands/team_billing.rb +13 -0
  78. data/bin/commands/team_preferences.rb +13 -0
  79. data/bin/commands/team_profile.rb +14 -0
  80. data/bin/commands/tooling_tokens.rb +14 -0
  81. data/bin/commands/usergroups.rb +23 -17
  82. data/bin/commands/usergroups_users.rb +7 -4
  83. data/bin/commands/users.rb +83 -27
  84. data/bin/commands/users_admin.rb +29 -0
  85. data/bin/commands/users_prefs.rb +13 -0
  86. data/bin/commands/users_profile.rb +27 -0
  87. data/bin/commands/views.rb +48 -0
  88. data/bin/commands/workflows.rb +38 -0
  89. data/bin/commands.rb +47 -5
  90. data/bin/slack +3 -4
  91. data/examples/hi_real_time_and_web/Gemfile +1 -0
  92. data/examples/hi_real_time_and_web/hi.rb +8 -4
  93. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Gemfile +2 -1
  94. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
  95. data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/hi.rb +13 -8
  96. data/examples/hi_web/Gemfile +1 -0
  97. data/examples/hi_web/hi.rb +2 -1
  98. data/examples/new_ticket/Gemfile +1 -0
  99. data/examples/new_ticket/new_ticket.rb +3 -2
  100. data/lib/slack/config.rb +2 -2
  101. data/lib/slack/events/config.rb +32 -0
  102. data/lib/slack/events/request.rb +72 -0
  103. data/lib/slack/logger.rb +6 -5
  104. data/lib/slack/messages/formatting.rb +4 -4
  105. data/lib/slack/messages/message.rb +6 -4
  106. data/lib/slack/real_time/api/message.rb +3 -1
  107. data/lib/slack/real_time/api/message_id.rb +1 -0
  108. data/lib/slack/real_time/api/ping.rb +5 -2
  109. data/lib/slack/real_time/api/templates/event_handler.erb +1 -1
  110. data/lib/slack/real_time/api/typing.rb +3 -1
  111. data/lib/slack/real_time/client.rb +116 -36
  112. data/lib/slack/real_time/concurrency/async.rb +138 -0
  113. data/lib/slack/real_time/concurrency.rb +2 -2
  114. data/lib/slack/real_time/config.rb +17 -19
  115. data/lib/slack/real_time/models/base.rb +3 -3
  116. data/lib/slack/real_time/models/bot.rb +1 -0
  117. data/lib/slack/real_time/models/channel.rb +1 -0
  118. data/lib/slack/real_time/models/group.rb +1 -0
  119. data/lib/slack/real_time/models/im.rb +1 -0
  120. data/lib/slack/real_time/models/team.rb +1 -0
  121. data/lib/slack/real_time/models/user.rb +1 -0
  122. data/lib/slack/real_time/models.rb +8 -7
  123. data/lib/slack/real_time/socket.rb +51 -23
  124. data/lib/slack/real_time/stores/base.rb +6 -9
  125. data/lib/slack/real_time/stores/starter.rb +143 -69
  126. data/lib/slack/real_time/stores/store.rb +160 -82
  127. data/lib/slack/real_time/stores.rb +4 -3
  128. data/lib/slack/version.rb +2 -1
  129. data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
  130. data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
  131. data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
  132. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +35 -0
  133. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  134. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  135. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  136. data/lib/slack/web/api/endpoints/admin_conversations.rb +260 -0
  137. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  138. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  139. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
  140. data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
  141. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
  142. data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
  143. data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
  144. data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
  145. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
  146. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
  147. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
  148. data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
  149. data/lib/slack/web/api/endpoints/admin_users.rb +163 -0
  150. data/lib/slack/web/api/endpoints/admin_users_session.rb +122 -0
  151. data/lib/slack/web/api/endpoints/api.rb +4 -5
  152. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  153. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  154. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  155. data/lib/slack/web/api/endpoints/apps_manifest.rb +75 -0
  156. data/lib/slack/web/api/endpoints/apps_permissions.rb +36 -0
  157. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +31 -0
  158. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +21 -0
  159. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +50 -0
  160. data/lib/slack/web/api/endpoints/auth.rb +14 -2
  161. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  162. data/lib/slack/web/api/endpoints/bots.rb +25 -0
  163. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  164. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  165. data/lib/slack/web/api/endpoints/channels.rb +8 -201
  166. data/lib/slack/web/api/endpoints/chat.rb +252 -42
  167. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  168. data/lib/slack/web/api/endpoints/conversations.rb +422 -0
  169. data/lib/slack/web/api/endpoints/dialog.rb +33 -0
  170. data/lib/slack/web/api/endpoints/dnd.rb +17 -12
  171. data/lib/slack/web/api/endpoints/emoji.rb +3 -2
  172. data/lib/slack/web/api/endpoints/files.rb +82 -43
  173. data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
  174. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  175. data/lib/slack/web/api/endpoints/groups.rb +1 -235
  176. data/lib/slack/web/api/endpoints/im.rb +1 -73
  177. data/lib/slack/web/api/endpoints/migration.rb +28 -0
  178. data/lib/slack/web/api/endpoints/mpim.rb +1 -72
  179. data/lib/slack/web/api/endpoints/oauth.rb +9 -10
  180. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  181. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  182. data/lib/slack/web/api/endpoints/pins.rb +14 -23
  183. data/lib/slack/web/api/endpoints/presence.rb +1 -1
  184. data/lib/slack/web/api/endpoints/reactions.rb +43 -34
  185. data/lib/slack/web/api/endpoints/reminders.rb +28 -15
  186. data/lib/slack/web/api/endpoints/rtm.rb +29 -8
  187. data/lib/slack/web/api/endpoints/search.rb +39 -24
  188. data/lib/slack/web/api/endpoints/stars.rb +30 -22
  189. data/lib/slack/web/api/endpoints/team.rb +34 -11
  190. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  191. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  192. data/lib/slack/web/api/endpoints/team_profile.rb +23 -0
  193. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  194. data/lib/slack/web/api/endpoints/usergroups.rb +43 -32
  195. data/lib/slack/web/api/endpoints/usergroups_users.rb +14 -9
  196. data/lib/slack/web/api/endpoints/users.rb +104 -19
  197. data/lib/slack/web/api/endpoints/users_admin.rb +49 -0
  198. data/lib/slack/web/api/endpoints/users_prefs.rb +21 -0
  199. data/lib/slack/web/api/endpoints/users_profile.rb +44 -0
  200. data/lib/slack/web/api/endpoints/views.rb +97 -0
  201. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  202. data/lib/slack/web/api/endpoints.rb +111 -29
  203. data/lib/slack/web/api/error.rb +2 -8
  204. data/lib/slack/web/api/errors/server_error.rb +37 -0
  205. data/lib/slack/web/api/errors/slack_error.rb +29 -0
  206. data/lib/slack/web/api/errors/too_many_requests_error.rb +21 -0
  207. data/lib/slack/web/api/errors.rb +1040 -0
  208. data/lib/slack/web/api/mixins/conversations.id.rb +25 -0
  209. data/lib/slack/web/api/mixins/ids.id.rb +24 -0
  210. data/lib/slack/web/api/mixins/users.id.rb +6 -7
  211. data/lib/slack/web/api/mixins/users.search.rb +39 -36
  212. data/lib/slack/web/api/mixins.rb +4 -4
  213. data/lib/slack/web/api/patches/chat.1.patch +70 -0
  214. data/lib/slack/web/api/patches/dialog.1.open-json-support.patch +17 -0
  215. data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
  216. data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
  217. data/lib/slack/web/api/templates/command.erb +5 -3
  218. data/lib/slack/web/api/templates/commands.erb +2 -1
  219. data/lib/slack/web/api/templates/endpoints.erb +5 -5
  220. data/lib/slack/web/api/templates/errors.erb +20 -0
  221. data/lib/slack/web/api/templates/method.erb +26 -4
  222. data/lib/slack/web/api/templates/method_spec.erb +3 -2
  223. data/lib/slack/web/client.rb +2 -1
  224. data/lib/slack/web/config.rb +21 -10
  225. data/lib/slack/web/faraday/connection.rb +25 -16
  226. data/lib/slack/web/faraday/request.rb +4 -1
  227. data/lib/slack/web/faraday/response/raise_error.rb +19 -1
  228. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  229. data/lib/slack/web/pagination/cursor.rb +48 -0
  230. data/lib/slack-ruby-client.rb +40 -26
  231. data/lib/slack.rb +1 -0
  232. data/lib/slack_ruby_client.rb +1 -0
  233. data/lib/tasks/git.rake +2 -1
  234. data/lib/tasks/real_time.rake +16 -6
  235. data/lib/tasks/update.rake +1 -0
  236. data/lib/tasks/web.rake +42 -10
  237. data/screenshots/create-app.png +0 -0
  238. data/slack-ruby-client.gemspec +11 -9
  239. data/spec/fixtures/slack/web/429_error.yml +50 -52
  240. data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
  241. data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
  242. data/spec/fixtures/slack/web/conversations_info.yml +167 -0
  243. data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
  244. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
  245. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
  246. data/spec/fixtures/slack/web/paginated_users_list.yml +613 -0
  247. data/spec/fixtures/slack/web/rtm_connect.yml +307 -0
  248. data/spec/fixtures/slack/web/rtm_start.yml +771 -60
  249. data/spec/fixtures/slack/web/users_info.yml +153 -69
  250. data/spec/fixtures/slack/web/users_list.yml +102 -41
  251. data/spec/fixtures/slack/web/views_open_error.yml +83 -0
  252. data/spec/integration/integration_spec.rb +116 -48
  253. data/spec/slack/config_spec.rb +2 -0
  254. data/spec/slack/events/config_spec.rb +33 -0
  255. data/spec/slack/events/request_spec.rb +184 -0
  256. data/spec/slack/messages/formatting_spec.rb +25 -14
  257. data/spec/slack/real_time/api/message_spec.rb +6 -1
  258. data/spec/slack/real_time/api/ping_spec.rb +2 -0
  259. data/spec/slack/real_time/api/typing_spec.rb +5 -1
  260. data/spec/slack/real_time/client_spec.rb +465 -141
  261. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +21 -0
  262. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
  263. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
  264. data/spec/slack/real_time/event_handlers/bot_spec.rb +7 -4
  265. data/spec/slack/real_time/event_handlers/channel_spec.rb +10 -7
  266. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +3 -2
  267. data/spec/slack/real_time/event_handlers/group_spec.rb +5 -4
  268. data/spec/slack/real_time/event_handlers/im_spec.rb +9 -8
  269. data/spec/slack/real_time/event_handlers/team_spec.rb +8 -4
  270. data/spec/slack/real_time/event_handlers/user_spec.rb +7 -4
  271. data/spec/slack/real_time/rtm_connect_spec.rb +14 -0
  272. data/spec/slack/real_time/rtm_start_spec.rb +2 -1
  273. data/spec/slack/real_time/store_spec.rb +2 -1
  274. data/spec/slack/slack_spec.rb +42 -8
  275. data/spec/slack/version_spec.rb +2 -1
  276. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  277. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  278. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +8 -0
  279. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  280. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -0
  281. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
  282. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  283. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  284. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  285. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  286. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  287. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  288. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  289. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  290. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  291. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  292. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  293. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  294. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  295. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
  296. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  297. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  298. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  299. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  300. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
  301. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  302. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +8 -0
  303. data/spec/slack/web/api/endpoints/bots_spec.rb +8 -0
  304. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  305. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  306. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  307. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +11 -4
  308. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +140 -24
  309. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
  310. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +36 -0
  311. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +22 -7
  312. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
  313. data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
  314. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  315. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  316. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  317. data/spec/slack/web/api/endpoints/files_spec.rb +17 -5
  318. data/spec/slack/web/api/endpoints/migration_spec.rb +13 -0
  319. data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -11
  320. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
  321. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
  322. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
  323. data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
  324. data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
  325. data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
  326. data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
  327. data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
  328. data/spec/slack/web/api/endpoints/team_billing_spec.rb +8 -0
  329. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
  330. data/spec/slack/web/api/endpoints/team_profile_spec.rb +8 -0
  331. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  332. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
  333. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  334. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  335. data/spec/slack/web/api/endpoints/users_admin_spec.rb +18 -0
  336. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +8 -0
  337. data/spec/slack/web/api/endpoints/users_profile_spec.rb +8 -0
  338. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  339. data/spec/slack/web/api/error_spec.rb +7 -7
  340. data/spec/slack/web/api/errors/slack_error_spec.rb +33 -0
  341. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  342. data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
  343. data/spec/slack/web/api/mixins/users_spec.rb +30 -17
  344. data/spec/slack/web/api/pagination/cursor_spec.rb +98 -0
  345. data/spec/slack/web/client_spec.rb +211 -14
  346. data/spec/slack/web/faraday/request_spec.rb +80 -0
  347. data/spec/slack/web/faraday/response/raise_error_spec.rb +86 -0
  348. data/spec/spec_helper.rb +9 -2
  349. data/spec/support/queue_with_timeout.rb +6 -5
  350. data/spec/support/real_time/concurrency/mock.rb +2 -2
  351. data/spec/support/real_time/connected_client.rb +7 -2
  352. data/spec/support/real_time/event.rb +1 -0
  353. data/spec/support/token.rb +1 -0
  354. data/spec/support/vcr.rb +37 -1
  355. metadata +250 -130
  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/Gemfile +0 -5
  360. data/examples/hi_real_time_async/hi.rb +0 -29
  361. data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
  362. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  363. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -36
  364. data/lib/slack/real_time/concurrency/celluloid.rb +0 -100
  365. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
  366. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  367. data/lib/slack/web/api/mixins/channels.id.rb +0 -26
  368. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  369. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  370. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  371. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  372. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -20
  373. data/screenshots/register-bot.png +0 -0
  374. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  375. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  376. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -35
  377. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -50
  378. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  379. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  380. data/spec/slack/web/api/endpoints/im_spec.rb +0 -30
  381. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -30
  382. data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
  383. data/spec/slack/web/api/mixins/groups_spec.rb +0 -31
@@ -1,17 +1,22 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
- RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCURRENCY']) && 'missing SLACK_API_TOKEN and/or CONCURRENCY' do
4
+ RSpec.describe 'integration test', skip: ( # rubocop:disable RSpec/DescribeClass
5
+ (!ENV['SLACK_API_TOKEN'] || !ENV['CONCURRENCY']) && 'missing SLACK_API_TOKEN and/or CONCURRENCY'
6
+ ) do
4
7
  around do |ex|
5
8
  WebMock.allow_net_connect!
6
9
  VCR.turned_off { ex.run }
7
10
  WebMock.disable_net_connect!
8
11
  end
9
12
 
13
+ let(:client) { Slack::RealTime::Client.new(token: ENV['SLACK_API_TOKEN']) }
10
14
  let(:logger) do
11
15
  logger = Logger.new(STDOUT)
12
- logger.level = Logger::DEBUG
16
+ logger.level = Logger::INFO
13
17
  logger
14
18
  end
19
+ let!(:queue) { @queue = QueueWithTimeout.new }
15
20
 
16
21
  before do
17
22
  Thread.abort_on_exception = true
@@ -19,77 +24,69 @@ RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCU
19
24
  Slack.configure do |slack|
20
25
  slack.logger = logger
21
26
  end
22
- end
23
-
24
- after do
25
- Slack.config.reset
26
- end
27
27
 
28
- let(:queue) { QueueWithTimeout.new }
29
-
30
- let(:client) { Slack::RealTime::Client.new(token: ENV['SLACK_API_TOKEN']) }
31
-
32
- let(:connection) do
33
- # starts the client and pushes an item on a queue when connected
34
- client.start_async do |driver|
35
- driver.on :open do |data|
36
- logger.debug "connection.on :open, data=#{data}"
37
- queue.push nil
38
- end
28
+ client.on :hello do
29
+ logger.info(
30
+ "Successfully connected, welcome '#{client.self.name}' to " \
31
+ "the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
32
+ )
39
33
  end
40
- end
41
34
 
42
- before do
43
- client.on :hello do
44
- logger.info "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
35
+ client.on :message do |event|
36
+ logger.info " #{event.class}"
45
37
  end
46
38
 
47
39
  client.on :close do
40
+ logger.info 'Disconnecting ...'
48
41
  # pushes another item to the queue when disconnected
49
- queue.push nil
42
+ queue.push :closed
50
43
  end
51
44
  end
52
45
 
46
+ after do
47
+ Slack.config.reset
48
+ wait_for_server # wait for :closed to be pushed on queue
49
+ @server.join if @server.is_a?(::Thread)
50
+ end
51
+
53
52
  def start_server
54
- dt = rand(5) + 1
53
+ dt = rand(10..20)
55
54
  logger.debug "#start_server, waiting #{dt} second(s)"
56
55
  sleep dt # prevent Slack 429 rate limit errors
57
- # start server and wait for on :open
58
- c = connection
59
- logger.debug "connection is #{c}"
60
- queue.pop_with_timeout(5)
56
+ # starts the client and pushes an item on a queue when connected
57
+ @server = client.start_async do |driver|
58
+ driver.on :open do |data|
59
+ logger.debug "connection.on :open, data=#{data}"
60
+ queue.push :opened
61
+ end
62
+
63
+ driver.on :hello do |data|
64
+ logger.debug "connection.on :hello, data=#{data}"
65
+ end
66
+ end
67
+ logger.debug "started #{@server}"
68
+ expect(queue.pop_with_timeout(5)).to eq :opened
61
69
  end
62
70
 
63
71
  def wait_for_server
72
+ return unless @queue
73
+
64
74
  logger.debug '#wait_for_server'
65
75
  queue.pop_with_timeout(5)
66
76
  logger.debug '#wait_for_server, joined'
67
- end
68
-
69
- def stop_server
70
- logger.debug '#stop_server'
71
- client.stop!
72
- logger.debug '#stop_server, stopped'
73
- end
74
-
75
- after do
76
- wait_for_server
77
+ @queue = nil
77
78
  end
78
79
 
79
80
  context 'client connected' do
80
- before do
81
- start_server
82
- end
83
-
84
- let(:channel) { "@#{client.self.name}" }
81
+ let(:channel) { "@#{client.self.id}" }
82
+ let(:message) { SecureRandom.hex }
85
83
 
86
84
  it 'responds to message' do
87
- message = SecureRandom.hex
88
-
89
85
  client.on :message do |data|
90
86
  logger.debug data
91
87
  # concurrent execution of tests causes messages to arrive in any order
92
88
  next unless data.text == message
89
+
93
90
  expect(data.text).to eq message
94
91
  expect(data.subtype).to eq 'bot_message'
95
92
  logger.debug 'client.stop!'
@@ -97,13 +94,19 @@ RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCU
97
94
  client.stop!
98
95
  end
99
96
 
97
+ start_server
98
+
100
99
  logger.debug "chat_postMessage, channel=#{channel}, message=#{message}"
101
100
  client.web_client.chat_postMessage channel: channel, text: message
102
101
  end
103
102
 
104
103
  it 'sends message' do
105
- client.message(channel: channel, text: 'Hello world!')
106
- client.stop!
104
+ client.on :hello do
105
+ expect(client.message(channel: channel, text: message)).to be true
106
+ client.stop!
107
+ end
108
+
109
+ start_server
107
110
  end
108
111
  end
109
112
 
@@ -117,6 +120,72 @@ RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCU
117
120
  start_server
118
121
  end
119
122
 
123
+ context 'with websocket_ping set' do
124
+ before do
125
+ client.websocket_ping = 5
126
+ end
127
+
128
+ it 'sends pings' do
129
+ @reply_to = nil
130
+ client.on :pong do |data|
131
+ @reply_to = data.reply_to
132
+ queue.push :pong
133
+ client.stop!
134
+ end
135
+
136
+ start_server
137
+
138
+ queue.pop_with_timeout(10)
139
+ expect(@reply_to).to eq 1
140
+ end
141
+
142
+ it 'rebuilds the websocket connection when dropped' do
143
+ @reply_to = nil
144
+ client.on :pong do |data|
145
+ logger.info data
146
+ @reply_to = data.reply_to
147
+ if @reply_to == 1
148
+ client.instance_variable_get(:@socket).close
149
+ queue.push :close
150
+ else
151
+ expect(@reply_to).to eq 2
152
+ queue.push :pong
153
+ client.stop!
154
+ end
155
+ end
156
+
157
+ start_server
158
+
159
+ 4.times do |i|
160
+ queue.pop_with_timeout(10)
161
+ client.logger.info "Pop #{i}"
162
+ end
163
+ end
164
+ end
165
+
166
+ context 'with websocket_ping not set' do
167
+ before do
168
+ client.websocket_ping = 0
169
+ end
170
+
171
+ it 'does not send pings' do
172
+ @reply_to = nil
173
+
174
+ client.on :pong do |data|
175
+ @reply_to = data.reply_to
176
+ end
177
+
178
+ client.on :hello do
179
+ client.stop!
180
+ end
181
+
182
+ start_server
183
+ wait_for_server
184
+
185
+ expect(@reply_to).to be nil
186
+ end
187
+ end
188
+
120
189
  it 'gets close, followed by closed' do
121
190
  client.on :hello do
122
191
  expect(client.started?).to be true
@@ -125,7 +194,6 @@ RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCU
125
194
 
126
195
  client.on :close do |data|
127
196
  logger.debug "client.on :close, data=#{data}"
128
- expect(client.started?).to be true
129
197
  @close_called = true
130
198
  end
131
199
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Slack::Config do
@@ -7,6 +8,7 @@ describe Slack::Config do
7
8
  config.token = 'a token'
8
9
  end
9
10
  end
11
+
10
12
  it 'sets token' do
11
13
  expect(Slack.config.token).to eq 'a token'
12
14
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Slack::Events::Config do
5
+ before do
6
+ ENV['SLACK_SIGNING_SECRET'] = 'secret'
7
+ described_class.reset
8
+ end
9
+
10
+ after do
11
+ ENV.delete 'SLACK_SIGNING_SECRET'
12
+ end
13
+
14
+ it 'defaults signing secret to ENV[SLACK_SIGNING_SECRET]' do
15
+ expect(Slack::Events.config.signing_secret).to eq 'secret'
16
+ end
17
+ it 'defaults signature expiration to 5 minutes' do
18
+ expect(Slack::Events.config.signature_expires_in).to eq 5 * 60
19
+ end
20
+ context 'configured' do
21
+ before do
22
+ Slack::Events.configure do |config|
23
+ config.signing_secret = 'custom'
24
+ config.signature_expires_in = 45
25
+ end
26
+ end
27
+
28
+ it 'uses the configured values' do
29
+ expect(Slack::Events.config.signing_secret).to eq 'custom'
30
+ expect(Slack::Events.config.signature_expires_in).to eq 45
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Slack::Events::Request do
5
+ subject(:request) do
6
+ described_class.new(http_request)
7
+ end
8
+
9
+ before do
10
+ Slack::Events.configure do |config|
11
+ config.signing_secret = signing_secret
12
+ config.signature_expires_in = 30
13
+ end
14
+ end
15
+
16
+ let(:signing_secret) { 'ade6ca762ade4db0e7d31484cd616b9c' }
17
+ let(:signature) { 'v0=91177eea054d65de0fc0f9b4ec57714307bc0ce2c5f3bf0d28b1b720c8f92ba2' }
18
+ let(:timestamp) { '1547933148' }
19
+ let(:body) do
20
+ '{"token":"X34FAqCu8tmGEkEEpoDncnja","challenge":' \
21
+ '"P7sFXA4o3HV2hTx4zb4zcQ9yrvuQs8pDh6EacOxmMRj0tJaXfQFF","type":"url_verification"}'
22
+ end
23
+ let(:http_request) do
24
+ request_double = double(
25
+ body: StringIO.new(body)
26
+ )
27
+
28
+ allow(request_double).to receive(:get_header).with('HTTP_X_SLACK_REQUEST_TIMESTAMP') { timestamp }
29
+ allow(request_double).to receive(:get_header).with('HTTP_X_SLACK_SIGNATURE') { signature }
30
+
31
+ request_double
32
+ end
33
+
34
+ after do
35
+ Slack::Events.config.reset
36
+ end
37
+
38
+ it 'reads http request' do
39
+ expect(request.signature).to eq signature
40
+ expect(request.body).to eq body
41
+ expect(request.timestamp).to eq timestamp
42
+ expect(request.version).to eq 'v0'
43
+ end
44
+
45
+ it 'rewinds the request body after reading it' do
46
+ expect(request.body).to eq body
47
+ expect(http_request.body.read).to eq body
48
+ end
49
+
50
+ context 'time' do
51
+ after do
52
+ Timecop.return
53
+ end
54
+
55
+ context 'with an invalid signature' do
56
+ let(:signature) { 'v0=invalid' }
57
+
58
+ before do
59
+ Timecop.freeze(Time.at(timestamp.to_i))
60
+ end
61
+
62
+ it 'is invalid but not expired' do
63
+ expect(request).not_to be_valid
64
+ expect(request).not_to be_expired
65
+ end
66
+ end
67
+
68
+ context 'with an invalid body' do
69
+ let(:body) { 'invalid' }
70
+
71
+ before do
72
+ Timecop.freeze(Time.at(timestamp.to_i))
73
+ end
74
+
75
+ it 'is invalid but not expired' do
76
+ expect(request).not_to be_valid
77
+ expect(request).not_to be_expired
78
+ end
79
+ end
80
+
81
+ context 'with an invalid signing secret' do
82
+ before do
83
+ Slack::Events.configure do |config|
84
+ config.signing_secret = 'invalid'
85
+ end
86
+ Timecop.freeze(Time.at(timestamp.to_i))
87
+ end
88
+
89
+ it 'is invalid but not expired' do
90
+ expect(request).not_to be_valid
91
+ expect(request).not_to be_expired
92
+ end
93
+ end
94
+
95
+ context 'within time window' do
96
+ before do
97
+ Timecop.freeze(Time.at(timestamp.to_i) + Slack::Events.config.signature_expires_in - 1)
98
+ end
99
+
100
+ it 'is valid' do
101
+ expect(request).to be_valid
102
+ expect(request).not_to be_expired
103
+ end
104
+ it 'does not raise an error and returns true' do
105
+ expect(request.verify!).to be true
106
+ end
107
+ end
108
+
109
+ context 'after time window' do
110
+ before do
111
+ Timecop.freeze(Time.at(timestamp.to_i) + Slack::Events.config.signature_expires_in + 1)
112
+ end
113
+
114
+ it 'is valid but expired' do
115
+ expect(request).to be_valid
116
+ expect(request).to be_expired
117
+ end
118
+ it 'raises an error on verify!' do
119
+ expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
120
+ end
121
+ end
122
+
123
+ context 'before time but within window' do
124
+ before do
125
+ Timecop.freeze(Time.at(timestamp.to_i) - Slack::Events.config.signature_expires_in + 1)
126
+ end
127
+
128
+ it 'is valid and not expired' do
129
+ expect(request).to be_valid
130
+ expect(request).not_to be_expired
131
+ end
132
+ it 'does not raise an error on verify!' do
133
+ expect(request.verify!).to be true
134
+ end
135
+ end
136
+
137
+ context 'before time window' do
138
+ before do
139
+ Timecop.freeze(Time.at(timestamp.to_i) - Slack::Events.config.signature_expires_in - 1)
140
+ end
141
+
142
+ it 'is valid but expired' do
143
+ expect(request).to be_valid
144
+ expect(request).to be_expired
145
+ end
146
+ it 'raises an error on verify!' do
147
+ expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
148
+ end
149
+ end
150
+ end
151
+
152
+ context 'without global config' do
153
+ before do
154
+ Slack::Events.config.reset
155
+ end
156
+
157
+ context 'without a signing secret parameter' do
158
+ subject(:request) do
159
+ described_class.new(http_request)
160
+ end
161
+
162
+ it 'raises MissingSigningSecret' do
163
+ expect { request.valid? }.to raise_error Slack::Events::Request::MissingSigningSecret
164
+ end
165
+ end
166
+
167
+ context 'with a signing secret parameter' do
168
+ subject(:request) do
169
+ described_class.new(http_request,
170
+ signing_secret: signing_secret,
171
+ signature_expires_in: 30)
172
+ end
173
+
174
+ before do
175
+ Timecop.freeze(Time.at(timestamp.to_i))
176
+ end
177
+
178
+ it 'is valid and not expired' do
179
+ expect(request).to be_valid
180
+ expect(request).not_to be_expired
181
+ end
182
+ end
183
+ end
184
+ end
@@ -1,43 +1,54 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Slack::Messages::Formatting do
5
- subject do
6
- Slack::Messages::Formatting
5
+ subject(:formatting) do
6
+ described_class
7
7
  end
8
+
8
9
  context '#unescape' do
9
10
  it 'plain text' do
10
- expect(subject.unescape('plain text')).to eq 'plain text'
11
+ expect(formatting.unescape('plain text')).to eq 'plain text'
11
12
  end
12
13
  it 'decodes an HTML-encoded message' do
13
- expect(subject.unescape('Hello &amp; &lt;world&gt;')).to eq 'Hello & <world>'
14
+ expect(formatting.unescape('Hello &amp; &lt;world&gt;')).to eq 'Hello & <world>'
14
15
  end
15
16
  it 'unescapes a user reference' do
16
- expect(subject.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to eq 'Hey @bob, did you see my file?'
17
+ expect(formatting.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to(
18
+ eq('Hey @bob, did you see my file?')
19
+ )
17
20
  end
18
21
  it 'unescapes a user reference without a name' do
19
- expect(subject.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
22
+ expect(formatting.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
20
23
  end
21
24
  it 'unescapes a URL without text' do
22
- expect(subject.unescape('This message contains a URL <http://foo.com/>')).to eq 'This message contains a URL http://foo.com/'
25
+ expect(formatting.unescape('This message contains a URL <http://foo.com/>')).to(
26
+ eq('This message contains a URL http://foo.com/')
27
+ )
23
28
  end
24
29
  it 'unescapes a URL with text' do
25
- expect(subject.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to eq 'So does this one: www.foo.com'
30
+ expect(formatting.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to(
31
+ eq('So does this one: www.foo.com')
32
+ )
26
33
  end
27
34
  it 'removes mailto' do
28
- expect(subject.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
35
+ expect(formatting.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
29
36
  end
30
37
  it 'unlinkifies references' do
31
- expect(subject.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')).to eq 'Hello @bob, say hi to @everyone in #general'
38
+ expect(
39
+ formatting.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')
40
+ ).to(
41
+ eq('Hello @bob, say hi to @everyone in #general')
42
+ )
32
43
  end
33
44
  it 'can handle a lone &gt;' do
34
- expect(subject.unescape('Hello <@U123|bob> &gt; file.txt')).to eq 'Hello @bob > file.txt'
45
+ expect(formatting.unescape('Hello <@U123|bob> &gt; file.txt')).to eq 'Hello @bob > file.txt'
35
46
  end
36
47
  it 'unescapes a double smart quote' do
37
- expect(subject.unescape('“hello”')).to eq '"hello"'
48
+ expect(formatting.unescape('“hello”')).to eq '"hello"'
38
49
  end
39
50
  it 'unescapes a single smart quote' do
40
- expect(subject.unescape('‘hello’')).to eq "'hello'"
51
+ expect(formatting.unescape('‘hello’')).to eq "'hello'"
41
52
  end
42
53
  end
43
54
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
@@ -7,8 +8,12 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
7
8
  before do
8
9
  allow(client).to receive(:next_id).and_return(42)
9
10
  end
11
+
10
12
  it 'sends message' do
11
- expect(socket).to receive(:send_data).with({ type: 'message', id: 42, text: 'hello world', channel: 'channel' }.to_json)
13
+ expect(socket).to(
14
+ receive(:send_data)
15
+ .with({ type: 'message', id: 42, text: 'hello world', channel: 'channel' }.to_json)
16
+ )
12
17
  client.message(text: 'hello world', channel: 'channel')
13
18
  end
14
19
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
@@ -7,6 +8,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
7
8
  before do
8
9
  allow(client).to receive(:next_id).and_return(42)
9
10
  end
11
+
10
12
  it 'sends message' do
11
13
  expect(socket).to receive(:send_data).with({ type: 'ping', id: 42 }.to_json)
12
14
  client.ping
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
@@ -7,8 +8,11 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
7
8
  before do
8
9
  allow(client).to receive(:next_id).and_return(42)
9
10
  end
11
+
10
12
  it 'sends a typing indicator' do
11
- expect(socket).to receive(:send_data).with({ type: 'typing', id: 42, channel: 'channel' }.to_json)
13
+ expect(socket).to(
14
+ receive(:send_data).with({ type: 'typing', id: 42, channel: 'channel' }.to_json)
15
+ )
12
16
  client.typing(channel: 'channel')
13
17
  end
14
18
  end