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