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,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,78 +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
- def start
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) + 2
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
- @server = start
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
59
67
  logger.debug "started #{@server}"
60
- queue.pop_with_timeout(5)
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
- @server.join if @server.is_a?(::Thread)
77
+ @queue = nil
78
78
  end
79
79
 
80
80
  context 'client connected' do
81
- before do
82
- start_server
83
- end
84
-
85
- let(:channel) { "@#{client.self.name}" }
81
+ let(:channel) { "@#{client.self.id}" }
82
+ let(:message) { SecureRandom.hex }
86
83
 
87
84
  it 'responds to message' do
88
- message = SecureRandom.hex
89
-
90
85
  client.on :message do |data|
91
86
  logger.debug data
92
87
  # concurrent execution of tests causes messages to arrive in any order
93
88
  next unless data.text == message
89
+
94
90
  expect(data.text).to eq message
95
91
  expect(data.subtype).to eq 'bot_message'
96
92
  logger.debug 'client.stop!'
@@ -98,13 +94,19 @@ RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCU
98
94
  client.stop!
99
95
  end
100
96
 
97
+ start_server
98
+
101
99
  logger.debug "chat_postMessage, channel=#{channel}, message=#{message}"
102
100
  client.web_client.chat_postMessage channel: channel, text: message
103
101
  end
104
102
 
105
103
  it 'sends message' do
106
- client.message(channel: channel, text: 'Hello world!')
107
- 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
108
110
  end
109
111
  end
110
112
 
@@ -118,6 +120,72 @@ RSpec.describe 'integration test', skip: (!ENV['SLACK_API_TOKEN'] || !ENV['CONCU
118
120
  start_server
119
121
  end
120
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
+
121
189
  it 'gets close, followed by closed' do
122
190
  client.on :hello do
123
191
  expect(client.started?).to be true
@@ -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,35 @@
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
+
18
+ it 'defaults signature expiration to 5 minutes' do
19
+ expect(Slack::Events.config.signature_expires_in).to eq 5 * 60
20
+ end
21
+
22
+ context 'configured' do
23
+ before do
24
+ Slack::Events.configure do |config|
25
+ config.signing_secret = 'custom'
26
+ config.signature_expires_in = 45
27
+ end
28
+ end
29
+
30
+ it 'uses the configured values' do
31
+ expect(Slack::Events.config.signing_secret).to eq 'custom'
32
+ expect(Slack::Events.config.signature_expires_in).to eq 45
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,188 @@
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
+
105
+ it 'does not raise an error and returns true' do
106
+ expect(request.verify!).to be true
107
+ end
108
+ end
109
+
110
+ context 'after time window' do
111
+ before do
112
+ Timecop.freeze(Time.at(timestamp.to_i) + Slack::Events.config.signature_expires_in + 1)
113
+ end
114
+
115
+ it 'is valid but expired' do
116
+ expect(request).to be_valid
117
+ expect(request).to be_expired
118
+ end
119
+
120
+ it 'raises an error on verify!' do
121
+ expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
122
+ end
123
+ end
124
+
125
+ context 'before time but within window' do
126
+ before do
127
+ Timecop.freeze(Time.at(timestamp.to_i) - Slack::Events.config.signature_expires_in + 1)
128
+ end
129
+
130
+ it 'is valid and not expired' do
131
+ expect(request).to be_valid
132
+ expect(request).not_to be_expired
133
+ end
134
+
135
+ it 'does not raise an error on verify!' do
136
+ expect(request.verify!).to be true
137
+ end
138
+ end
139
+
140
+ context 'before time window' do
141
+ before do
142
+ Timecop.freeze(Time.at(timestamp.to_i) - Slack::Events.config.signature_expires_in - 1)
143
+ end
144
+
145
+ it 'is valid but expired' do
146
+ expect(request).to be_valid
147
+ expect(request).to be_expired
148
+ end
149
+
150
+ it 'raises an error on verify!' do
151
+ expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
152
+ end
153
+ end
154
+ end
155
+
156
+ context 'without global config' do
157
+ before do
158
+ Slack::Events.config.reset
159
+ end
160
+
161
+ context 'without a signing secret parameter' do
162
+ subject(:request) do
163
+ described_class.new(http_request)
164
+ end
165
+
166
+ it 'raises MissingSigningSecret' do
167
+ expect { request.valid? }.to raise_error Slack::Events::Request::MissingSigningSecret
168
+ end
169
+ end
170
+
171
+ context 'with a signing secret parameter' do
172
+ subject(:request) do
173
+ described_class.new(http_request,
174
+ signing_secret: signing_secret,
175
+ signature_expires_in: 30)
176
+ end
177
+
178
+ before do
179
+ Timecop.freeze(Time.at(timestamp.to_i))
180
+ end
181
+
182
+ it 'is valid and not expired' do
183
+ expect(request).to be_valid
184
+ expect(request).not_to be_expired
185
+ end
186
+ end
187
+ end
188
+ end
@@ -1,42 +1,64 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Slack::Messages::Formatting do
4
- subject do
5
- Slack::Messages::Formatting
5
+ subject(:formatting) do
6
+ described_class
6
7
  end
8
+
7
9
  context '#unescape' do
8
10
  it 'plain text' do
9
- expect(subject.unescape('plain text')).to eq 'plain text'
11
+ expect(formatting.unescape('plain text')).to eq 'plain text'
10
12
  end
13
+
11
14
  it 'decodes an HTML-encoded message' do
12
- expect(subject.unescape('Hello &amp; &lt;world&gt;')).to eq 'Hello & <world>'
15
+ expect(formatting.unescape('Hello &amp; &lt;world&gt;')).to eq 'Hello & <world>'
13
16
  end
17
+
14
18
  it 'unescapes a user reference' do
15
- expect(subject.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to eq 'Hey @bob, did you see my file?'
19
+ expect(formatting.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to(
20
+ eq('Hey @bob, did you see my file?')
21
+ )
16
22
  end
23
+
17
24
  it 'unescapes a user reference without a name' do
18
- expect(subject.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
25
+ expect(formatting.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
19
26
  end
27
+
20
28
  it 'unescapes a URL without text' do
21
- expect(subject.unescape('This message contains a URL <http://foo.com/>')).to eq 'This message contains a URL http://foo.com/'
29
+ expect(formatting.unescape('This message contains a URL <http://foo.com/>')).to(
30
+ eq('This message contains a URL http://foo.com/')
31
+ )
22
32
  end
33
+
23
34
  it 'unescapes a URL with text' do
24
- expect(subject.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to eq 'So does this one: www.foo.com'
35
+ expect(formatting.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to(
36
+ eq('So does this one: www.foo.com')
37
+ )
25
38
  end
39
+
26
40
  it 'removes mailto' do
27
- expect(subject.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
41
+ expect(formatting.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
28
42
  end
43
+
29
44
  it 'unlinkifies references' do
30
- expect(subject.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')).to eq 'Hello @bob, say hi to @everyone in #general'
45
+ expect(
46
+ formatting.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')
47
+ ).to(
48
+ eq('Hello @bob, say hi to @everyone in #general')
49
+ )
31
50
  end
51
+
32
52
  it 'can handle a lone &gt;' do
33
- expect(subject.unescape('Hello <@U123|bob> &gt; file.txt')).to eq 'Hello @bob > file.txt'
53
+ expect(formatting.unescape('Hello <@U123|bob> &gt; file.txt')).to eq 'Hello @bob > file.txt'
34
54
  end
55
+
35
56
  it 'unescapes a double smart quote' do
36
- expect(subject.unescape('“hello”')).to eq '"hello"'
57
+ expect(formatting.unescape('“hello”')).to eq '"hello"'
37
58
  end
59
+
38
60
  it 'unescapes a single smart quote' do
39
- expect(subject.unescape('‘hello’')).to eq "'hello'"
61
+ expect(formatting.unescape('‘hello’')).to eq "'hello'"
40
62
  end
41
63
  end
42
64
  end
@@ -1,14 +1,19 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
4
5
  include_context 'connected client'
5
6
 
6
7
  describe '#message' do
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,12 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
4
5
  include_context 'connected client'
5
6
 
6
7
  describe '#ping' do
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,14 +1,18 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
4
5
  include_context 'connected client'
5
6
 
6
7
  describe '#typing' do
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