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,11 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Slack::Web::Client do
4
5
  before do
5
6
  Slack::Config.reset
6
7
  end
8
+
7
9
  context 'with defaults' do
8
- let(:client) { Slack::Web::Client.new }
10
+ let(:client) { described_class.new }
11
+
9
12
  describe '#initialize' do
10
13
  it 'sets user-agent' do
11
14
  expect(client.user_agent).to eq Slack::Web::Config.user_agent
@@ -18,30 +21,36 @@ RSpec.describe Slack::Web::Client do
18
21
  end
19
22
  end
20
23
  end
24
+
21
25
  context 'with custom settings' do
22
26
  describe '#initialize' do
23
27
  Slack::Web::Config::ATTRIBUTES.each do |key|
24
- context key do
25
- let(:client) { Slack::Web::Client.new(key => 'custom') }
28
+ context key.to_s do
29
+ let(:client) { described_class.new(key => 'custom') }
30
+
26
31
  it "sets #{key}" do
27
- expect(client.send(key)).to_not eq Slack::Web::Config.send(key)
32
+ expect(client.send(key)).not_to eq Slack::Web::Config.send(key)
28
33
  expect(client.send(key)).to eq 'custom'
29
34
  end
30
35
  end
31
36
  end
32
37
  end
33
38
  end
39
+
34
40
  context 'global config' do
35
41
  after do
36
- Slack::Web::Client.config.reset
42
+ described_class.config.reset
37
43
  end
38
- let(:client) { Slack::Web::Client.new }
44
+
45
+ let(:client) { described_class.new }
46
+
39
47
  context 'user-agent' do
40
48
  before do
41
- Slack::Web::Client.configure do |config|
49
+ described_class.configure do |config|
42
50
  config.user_agent = 'custom/user-agent'
43
51
  end
44
52
  end
53
+
45
54
  describe '#initialize' do
46
55
  it 'sets user-agent' do
47
56
  expect(client.user_agent).to eq 'custom/user-agent'
@@ -54,38 +63,43 @@ RSpec.describe Slack::Web::Client do
54
63
  end
55
64
  end
56
65
  end
66
+
57
67
  context 'token' do
58
68
  before do
59
69
  Slack.configure do |config|
60
70
  config.token = 'global default'
61
71
  end
62
72
  end
73
+
63
74
  it 'defaults token to global default' do
64
- client = Slack::Web::Client.new
75
+ client = described_class.new
65
76
  expect(client.token).to eq 'global default'
66
77
  end
67
78
  context 'with web config' do
68
79
  before do
69
- Slack::Web::Client.configure do |config|
80
+ described_class.configure do |config|
70
81
  config.token = 'custom web token'
71
82
  end
72
83
  end
84
+
73
85
  it 'overrides token to web config' do
74
- client = Slack::Web::Client.new
86
+ client = described_class.new
75
87
  expect(client.token).to eq 'custom web token'
76
88
  end
77
89
  it 'overrides token to specific token' do
78
- client = Slack::Web::Client.new(token: 'local token')
90
+ client = described_class.new(token: 'local token')
79
91
  expect(client.token).to eq 'local token'
80
92
  end
81
93
  end
82
94
  end
95
+
83
96
  context 'proxy' do
84
97
  before do
85
- Slack::Web::Client.configure do |config|
98
+ described_class.configure do |config|
86
99
  config.proxy = 'http://localhost:8080'
87
100
  end
88
101
  end
102
+
89
103
  describe '#initialize' do
90
104
  it 'sets proxy' do
91
105
  expect(client.proxy).to eq 'http://localhost:8080'
@@ -95,13 +109,15 @@ RSpec.describe Slack::Web::Client do
95
109
  end
96
110
  end
97
111
  end
112
+
98
113
  context 'SSL options' do
99
114
  before do
100
- Slack::Web::Client.configure do |config|
115
+ described_class.configure do |config|
101
116
  config.ca_path = '/ca_path'
102
117
  config.ca_file = '/ca_file'
103
118
  end
104
119
  end
120
+
105
121
  describe '#initialize' do
106
122
  it 'sets ca_path and ca_file' do
107
123
  expect(client.ca_path).to eq '/ca_path'
@@ -114,13 +130,16 @@ RSpec.describe Slack::Web::Client do
114
130
  end
115
131
  end
116
132
  end
133
+
117
134
  context 'logger option' do
118
135
  let(:logger) { Logger.new(STDOUT) }
136
+
119
137
  before do
120
- Slack::Web::Client.configure do |config|
138
+ described_class.configure do |config|
121
139
  config.logger = logger
122
140
  end
123
141
  end
142
+
124
143
  describe '#initialize' do
125
144
  it 'sets logger' do
126
145
  expect(client.logger).to eq logger
@@ -130,5 +149,183 @@ RSpec.describe Slack::Web::Client do
130
149
  end
131
150
  end
132
151
  end
152
+
153
+ context 'adapter option' do
154
+ let(:adapter) { Faraday.default_adapter }
155
+ let(:adapter_class) { Faraday::Adapter::NetHttp }
156
+
157
+ around do |ex|
158
+ previous_adapter = Faraday.default_adapter
159
+ # ensure default adapter is set for this spec
160
+ Faraday.default_adapter = :net_http
161
+ ex.run
162
+ Faraday.default_adapter = previous_adapter
163
+ end
164
+
165
+ context 'default adapter' do
166
+ describe '#initialize' do
167
+ it 'sets adapter' do
168
+ expect(client.adapter).to eq adapter
169
+ end
170
+ it 'creates a connection with an adapter' do
171
+ expect(client.send(:connection).adapter).to eq adapter_class
172
+ end
173
+ end
174
+ end
175
+
176
+ context 'non default adapter' do
177
+ let(:adapter) { :typhoeus }
178
+ let(:adapter_class) { Faraday::Adapter::Typhoeus }
179
+
180
+ before do
181
+ described_class.configure do |config|
182
+ config.adapter = adapter
183
+ end
184
+ end
185
+
186
+ describe '#initialize' do
187
+ it 'sets adapter' do
188
+ expect(client.adapter).to eq adapter
189
+ end
190
+ it 'creates a connection with an adapter' do
191
+ expect(client.send(:connection).adapter).to eq adapter_class
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+ context 'timeout options' do
198
+ before do
199
+ described_class.configure do |config|
200
+ config.timeout = 10
201
+ config.open_timeout = 15
202
+ end
203
+ end
204
+
205
+ describe '#initialize' do
206
+ it 'sets timeout and open_timeout' do
207
+ expect(client.timeout).to eq 10
208
+ expect(client.open_timeout).to eq 15
209
+ end
210
+ it 'creates a connection with timeout options' do
211
+ conn = client.send(:connection)
212
+ expect(conn.options.timeout).to eq 10
213
+ expect(conn.options.open_timeout).to eq 15
214
+ end
215
+ end
216
+ end
217
+
218
+ context 'per-request options' do
219
+ it 'applies timeout', vcr: { cassette_name: 'web/rtm_start', allow_playback_repeats: true } do
220
+ # reuse the same connection for the test, otherwise it creates a new one every time
221
+ conn = client.send(:connection)
222
+ expect(client).to receive(:connection).and_return(conn)
223
+
224
+ # get the yielded request to reuse in the next call to
225
+ # rtm_start so that we can examine request.options later
226
+ request = nil
227
+ response = conn.post do |r|
228
+ r.path = 'rtm.start'
229
+ r.headers = {
230
+ 'Accept' => ['application/json; charset=utf-8'],
231
+ 'Authorization' => ['Bearer <SLACK_API_TOKEN>']
232
+ }
233
+ request = r
234
+ end
235
+
236
+ expect(conn).to receive(:post).and_yield(request).and_return(response)
237
+
238
+ client.rtm_start(request: { timeout: 3 })
239
+
240
+ expect(request.options.timeout).to eq 3
241
+ end
242
+ end
243
+
244
+ context 'calling undocumented methods' do
245
+ let(:client) { described_class.new }
246
+
247
+ it 'produces a warning' do
248
+ expect(client.logger).to(
249
+ receive(:warn).with('The users.admin.setInactive method is undocumented.')
250
+ )
251
+ expect(client).to receive(:post)
252
+ client.users_admin_setInactive(user: 'U092BDCLV')
253
+ end
254
+ end
255
+
256
+ context 'persistent capability' do
257
+ describe '#initialize' do
258
+ it 'caches the Faraday connection to allow persistent adapters' do
259
+ first = client.send(:connection)
260
+ second = client.send(:connection)
261
+
262
+ expect(first).to equal second
263
+ end
264
+ end
265
+ end
266
+
267
+ context 'server failures' do
268
+ subject(:request) { client.api_test }
269
+
270
+ let(:stub_slack_request) { stub_request(:post, 'https://slack.com/api/api.test') }
271
+ let(:exception) do
272
+ request
273
+ rescue Slack::Web::Api::Errors::ServerError => e
274
+ return e
275
+ end
276
+
277
+ context 'parsing error' do
278
+ before { stub_slack_request.to_return(body: '<html></html>') }
279
+
280
+ it 'raises ParsingError' do
281
+ expect { request }.to raise_error(Slack::Web::Api::Errors::ParsingError).with_message('parsing_error')
282
+ expect(exception.response.body).to eq('<html></html>')
283
+ expect(exception.cause).to be_a(Faraday::ParsingError)
284
+ expect(exception.cause.cause.cause).to be_a(JSON::ParserError)
285
+ end
286
+ end
287
+
288
+ context 'timeout' do
289
+ context 'open timeout' do
290
+ before { stub_slack_request.to_timeout }
291
+
292
+ it 'raises TimoutError' do
293
+ expect { request }.to raise_error(Slack::Web::Api::Errors::TimeoutError).with_message('timeout_error')
294
+ expect(exception.cause).to be_a(Faraday::ConnectionFailed)
295
+ expect(exception.cause.cause).to be_a(Net::OpenTimeout)
296
+ end
297
+ end
298
+
299
+ context 'read timeout' do
300
+ before { stub_slack_request.to_raise(Net::ReadTimeout) }
301
+
302
+ it 'raises TimeoutError' do
303
+ expect { request }.to raise_error(Slack::Web::Api::Errors::TimeoutError).with_message('timeout_error')
304
+ expect(exception.cause).to be_a(Faraday::TimeoutError)
305
+ expect(exception.cause.cause).to be_a(Net::ReadTimeout)
306
+ end
307
+ end
308
+ end
309
+
310
+ context '5xx response' do
311
+ context 'with a JSON body' do
312
+ before { stub_slack_request.to_return(status: 500, body: '{}') }
313
+
314
+ it 'raises UnavailableError' do
315
+ expect { request }.to raise_error(Slack::Web::Api::Errors::UnavailableError).with_message('unavailable_error')
316
+ expect(exception.response.status).to eq(500)
317
+ end
318
+ end
319
+
320
+ context 'with a HTML response' do
321
+ before { stub_slack_request.to_return(status: 500, body: '<html></html>') }
322
+
323
+ it 'raises UnavailableError' do
324
+ expect { request }.to raise_error(Slack::Web::Api::Errors::UnavailableError).with_message('unavailable_error')
325
+ expect(exception.response.status).to eq(500)
326
+ end
327
+ end
328
+ end
329
+ end
133
330
  end
134
331
  end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ class DummyClient
5
+ include Slack::Web::Faraday::Connection
6
+ include Slack::Web::Faraday::Request
7
+
8
+ attr_reader :token
9
+
10
+ def initialize(token)
11
+ @token = token
12
+ end
13
+ end
14
+
15
+ RSpec.describe Slack::Web::Faraday::Request do
16
+ let(:token) { 'by-the-power-of-grayskull' }
17
+ let(:client) { DummyClient.new(token) }
18
+
19
+ before do
20
+ Slack::Config.reset
21
+ end
22
+
23
+ context 'authorization' do
24
+ let(:path) { '/any-path' }
25
+ let(:options) { {} }
26
+ let(:connection) { instance_double('Faraday::Connection') }
27
+ let(:request) { instance_double('Faraday::Request') }
28
+ let(:headers) { instance_double('Faraday::Utils::Headers') }
29
+ let(:response) { instance_double('Faraday::Response', body: '') }
30
+
31
+ before do
32
+ allow(client).to receive(:connection).and_return(connection)
33
+ allow(request).to receive(:url).with(path, options)
34
+ allow(request).to receive(:path=).with(path)
35
+ allow(request).to receive(:headers).and_return(headers)
36
+ allow(connection).to receive(:send)
37
+ .with(method).and_yield(request).and_return(response)
38
+ end
39
+
40
+ describe '#get' do
41
+ let(:method) { :get }
42
+
43
+ it 'sets authorization header' do
44
+ expect(headers).to receive(:[]=)
45
+ .with('Authorization', "Bearer #{token}")
46
+ client.send(method, path, options)
47
+ end
48
+ end
49
+
50
+ describe '#post' do
51
+ let(:method) { :post }
52
+
53
+ it 'sets authorization header' do
54
+ expect(headers).to receive(:[]=)
55
+ .with('Authorization', "Bearer #{token}")
56
+ client.send(method, path, options)
57
+ end
58
+ end
59
+
60
+ describe '#put' do
61
+ let(:method) { :put }
62
+
63
+ it 'sets authorization header' do
64
+ expect(headers).to receive(:[]=)
65
+ .with('Authorization', "Bearer #{token}")
66
+ client.send(method, path, options)
67
+ end
68
+ end
69
+
70
+ describe '#delete' do
71
+ let(:method) { :delete }
72
+
73
+ it 'sets authorization header' do
74
+ expect(headers).to receive(:[]=)
75
+ .with('Authorization', "Bearer #{token}")
76
+ client.send(method, path, options)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Slack::Web::Faraday::Response::RaiseError do
5
+ subject(:raise_error_obj) { described_class.new(app) }
6
+
7
+ let(:app) { proc {} }
8
+ let(:status) { 200 }
9
+ let(:response) { nil }
10
+ let(:body) { {} }
11
+ let(:env) { double status: status, response: response, body: body, success?: true }
12
+
13
+ describe '#on_complete' do
14
+ context 'with status of 429' do
15
+ let(:status) { 429 }
16
+ let(:response) { OpenStruct.new(headers: { 'retry-after' => 10 }) }
17
+
18
+ it 'raises a TooManyRequestsError' do
19
+ expect { raise_error_obj.on_complete(env) }.to(
20
+ raise_error(Slack::Web::Api::Errors::TooManyRequestsError)
21
+ )
22
+ end
23
+ end
24
+
25
+ context 'with an ok payload in the body' do
26
+ let(:body) { { 'ok' => 'true' } }
27
+
28
+ it 'is nil' do
29
+ expect(raise_error_obj.on_complete(env)).to eq nil
30
+ end
31
+ end
32
+
33
+ context 'with a single known error in the body' do
34
+ let(:body) do
35
+ {
36
+ 'ok' => false,
37
+ 'error' => 'already_in_channel',
38
+ 'response_metadata' => { 'messages' => [] }
39
+ }
40
+ end
41
+
42
+ it 'raises an error of the matching type with the error message' do
43
+ expect { raise_error_obj.on_complete(env) }.to(
44
+ raise_error(Slack::Web::Api::Errors::AlreadyInChannel, 'already_in_channel')
45
+ )
46
+ end
47
+ end
48
+
49
+ context 'with a single unknown error in the body' do
50
+ let(:body) do
51
+ {
52
+ 'ok' => false,
53
+ 'error' => 'unknown_error',
54
+ 'response_metadata' => { 'messages' => [] }
55
+ }
56
+ end
57
+
58
+ it 'raises a SlackError with the error message' do
59
+ expect { raise_error_obj.on_complete(env) }.to(
60
+ raise_error(Slack::Web::Api::Errors::SlackError, 'unknown_error')
61
+ )
62
+ end
63
+ end
64
+
65
+ context 'with multiple errors in the body' do
66
+ let(:body) do
67
+ {
68
+ 'ok' => false,
69
+ 'errors' => [
70
+ { 'error' => 'already_in_channel' },
71
+ { 'error' => 'something_else_terrible' }
72
+ ]
73
+ }
74
+ end
75
+
76
+ it 'raises a SlackError with the concatenated error messages' do
77
+ expect { raise_error_obj.on_complete(env) }.to(
78
+ raise_error(
79
+ Slack::Web::Api::Errors::SlackError,
80
+ 'already_in_channel,something_else_terrible'
81
+ )
82
+ )
83
+ end
84
+ end
85
+ end
86
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,21 @@
1
+ # frozen_string_literal: true
1
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
2
3
 
3
4
  require 'rubygems'
4
5
  require 'rspec'
6
+ require 'timecop'
5
7
 
6
- require 'slack-ruby-client'
8
+ require 'slack_ruby_client'
7
9
 
8
10
  Dir[File.join(File.dirname(__FILE__), 'support', '**/*.rb')].each do |file|
9
11
  require file
10
12
  end
11
13
 
12
14
  Slack.configure do |config|
13
- config.token = ENV['SLACK_API_TOKEN']
15
+ config.token = '<SLACK_API_TOKEN>' # ENV['SLACK_API_TOKEN']
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ # Enable flags like --only-failures and --next-failure
20
+ config.example_status_persistence_file_path = '.rspec_status'
14
21
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # http://spin.atomicobject.com/2014/07/07/ruby-queue-pop-timeout/
2
3
  class QueueWithTimeout
3
4
  def initialize
@@ -6,15 +7,15 @@ class QueueWithTimeout
6
7
  @recieved = ConditionVariable.new
7
8
  end
8
9
 
9
- def push(x)
10
+ def push(item)
10
11
  @mutex.synchronize do
11
- @queue << x
12
+ @queue << item
12
13
  @recieved.signal
13
14
  end
14
15
  end
15
16
 
16
- def <<(x)
17
- push(x)
17
+ def <<(item)
18
+ push(item)
18
19
  end
19
20
 
20
21
  def pop(non_block = false)
@@ -26,7 +27,7 @@ class QueueWithTimeout
26
27
  if @queue.empty?
27
28
  @recieved.wait(@mutex, timeout) if timeout != 0
28
29
  # if we're still empty after the timeout, raise exception
29
- fail ThreadError, 'queue empty' if @queue.empty?
30
+ raise ThreadError, 'queue empty' if @queue.empty?
30
31
  end
31
32
  @queue.shift
32
33
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  module Concurrency
@@ -6,8 +7,7 @@ module Slack
6
7
  end
7
8
 
8
9
  class Socket < ::Slack::RealTime::Socket
9
- def self.close
10
- end
10
+ def self.close; end
11
11
 
12
12
  def start_async(client)
13
13
  reactor = Thread.new {}
@@ -1,13 +1,18 @@
1
+ # frozen_string_literal: true
1
2
  RSpec.shared_context 'connected client' do |opts|
2
3
  let(:client) { Slack::RealTime::Client.new(opts || {}) }
3
4
  let(:ws) { double(Slack::RealTime::Concurrency::Mock::WebSocket) }
4
- let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' }
5
+ let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
5
6
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
7
+
6
8
  before do
7
9
  Slack::RealTime.configure do |config|
8
10
  config.concurrency = Slack::RealTime::Concurrency::Mock
11
+ config.store_class = (opts || {})[:store_class] || Slack::RealTime::Stores::Store
9
12
  end
10
- allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
13
+ allow(Slack::RealTime::Socket).to(
14
+ receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
15
+ )
11
16
  allow(socket).to receive(:start_sync)
12
17
  allow(socket).to receive(:connect!)
13
18
  allow(ws).to receive(:on)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Slack
2
3
  module RealTime
3
4
  class Event
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  RSpec.configure do |config|
2
3
  config.before do
3
4
  @old_token = Slack::Config.token
data/spec/support/vcr.rb CHANGED
@@ -1,9 +1,45 @@
1
+ # frozen_string_literal: true
1
2
  require 'vcr'
2
3
  require 'webmock/rspec'
3
4
 
4
5
  VCR.configure do |config|
5
6
  config.cassette_library_dir = 'spec/fixtures/slack'
6
7
  config.hook_into :webmock
7
- config.default_cassette_options = { record: :new_episodes }
8
8
  config.configure_rspec_metadata!
9
+ if ENV.key?('SLACK_API_TOKEN')
10
+ config.filter_sensitive_data('<SLACK_API_TOKEN>') do
11
+ ENV['SLACK_API_TOKEN']
12
+ end
13
+ end
14
+ config.before_record do |i|
15
+ i.response.body.force_encoding('UTF-8')
16
+ end
17
+ config.register_request_matcher :client_headers do |recorded, actual|
18
+ authorizations = ENV.key?('SLACK_API_TOKEN') ? actual.headers['Authorization'].map do |auth|
19
+ auth.gsub(ENV['SLACK_API_TOKEN'], '<SLACK_API_TOKEN>')
20
+ end : actual.headers['Authorization']
21
+ actual.headers['Accept'] == recorded.headers['Accept'] &&
22
+ authorizations == recorded.headers['Authorization']
23
+ end
24
+ config.default_cassette_options = {
25
+ match_requests_on: %i[method uri body client_headers]
26
+ # record: :new_episodes
27
+ }
28
+ end
29
+
30
+ module VCR
31
+ module Errors
32
+ class UnhandledHTTPRequestError
33
+ private
34
+
35
+ # Force unhandled HTTP error reports to include the headers
36
+ # for our custom matcher `client_headers`.
37
+ #
38
+ # This patch can be removed if https://github.com/vcr/vcr/issues/912
39
+ # is ever resolved.
40
+ def match_request_on_headers?
41
+ true
42
+ end
43
+ end
44
+ end
9
45
  end