slack-ruby-client 0.13.1 → 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 (385) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +29 -5
  5. data/.rubocop_todo.yml +124 -44
  6. data/.travis.yml +5 -8
  7. data/CHANGELOG.md +92 -2
  8. data/CONTRIBUTING.md +19 -8
  9. data/Dangerfile +2 -0
  10. data/Gemfile +10 -5
  11. data/LICENSE.md +1 -1
  12. data/README.md +186 -49
  13. data/RELEASING.md +1 -1
  14. data/Rakefile +2 -1
  15. data/UPGRADING.md +72 -2
  16. data/bin/commands/admin_analytics.rb +16 -0
  17. data/bin/commands/admin_apps.rb +51 -0
  18. data/bin/commands/admin_apps_approved.rb +17 -0
  19. data/bin/commands/admin_apps_requests.rb +17 -0
  20. data/bin/commands/admin_apps_restricted.rb +17 -0
  21. data/bin/commands/admin_auth_policy.rb +39 -0
  22. data/bin/commands/admin_barriers.rb +47 -0
  23. data/bin/commands/admin_conversations.rb +169 -0
  24. data/bin/commands/admin_conversations_ekm.rb +17 -0
  25. data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
  26. data/bin/commands/admin_conversations_whitelist.rb +37 -0
  27. data/bin/commands/admin_emoji.rb +54 -0
  28. data/bin/commands/admin_inviteRequests.rb +36 -0
  29. data/bin/commands/admin_inviteRequests_approved.rb +16 -0
  30. data/bin/commands/admin_inviteRequests_denied.rb +16 -0
  31. data/bin/commands/admin_teams.rb +27 -0
  32. data/bin/commands/admin_teams_admins.rb +16 -0
  33. data/bin/commands/admin_teams_owners.rb +16 -0
  34. data/bin/commands/admin_teams_settings.rb +64 -0
  35. data/bin/commands/admin_usergroups.rb +48 -0
  36. data/bin/commands/admin_users.rb +98 -0
  37. data/bin/commands/admin_users_session.rb +78 -0
  38. data/bin/commands/api.rb +1 -1
  39. data/bin/commands/apps.rb +15 -0
  40. data/bin/commands/apps_connections.rb +13 -0
  41. data/bin/commands/apps_event_authorizations.rb +16 -0
  42. data/bin/commands/apps_manifest.rb +51 -0
  43. data/bin/commands/apps_permissions.rb +1 -0
  44. data/bin/commands/apps_permissions_resources.rb +1 -0
  45. data/bin/commands/apps_permissions_scopes.rb +1 -0
  46. data/bin/commands/apps_permissions_users.rb +1 -0
  47. data/bin/commands/auth.rb +1 -0
  48. data/bin/commands/auth_teams.rb +16 -0
  49. data/bin/commands/bots.rb +2 -0
  50. data/bin/commands/calls.rb +52 -0
  51. data/bin/commands/calls_participants.rb +25 -0
  52. data/bin/commands/channels.rb +1 -153
  53. data/bin/commands/chat.rb +56 -12
  54. data/bin/commands/chat_scheduledMessages.rb +19 -0
  55. data/bin/commands/conversations.rb +75 -5
  56. data/bin/commands/dialog.rb +1 -0
  57. data/bin/commands/dnd.rb +6 -3
  58. data/bin/commands/emoji.rb +1 -0
  59. data/bin/commands/files.rb +10 -18
  60. data/bin/commands/files_comments.rb +1 -21
  61. data/bin/commands/files_remote.rb +78 -0
  62. data/bin/commands/groups.rb +1 -161
  63. data/bin/commands/im.rb +1 -62
  64. data/bin/commands/migration.rb +2 -0
  65. data/bin/commands/mpim.rb +1 -60
  66. data/bin/commands/oauth.rb +2 -14
  67. data/bin/commands/oauth_v2.rb +29 -0
  68. data/bin/commands/openid_connect.rb +27 -0
  69. data/bin/commands/pins.rb +3 -6
  70. data/bin/commands/reactions.rb +3 -3
  71. data/bin/commands/reminders.rb +7 -0
  72. data/bin/commands/rtm.rb +3 -2
  73. data/bin/commands/search.rb +6 -1
  74. data/bin/commands/stars.rb +8 -6
  75. data/bin/commands/team.rb +5 -0
  76. data/bin/commands/team_billing.rb +13 -0
  77. data/bin/commands/team_preferences.rb +13 -0
  78. data/bin/commands/team_profile.rb +1 -0
  79. data/bin/commands/tooling_tokens.rb +14 -0
  80. data/bin/commands/usergroups.rb +7 -1
  81. data/bin/commands/usergroups_users.rb +3 -0
  82. data/bin/commands/users.rb +6 -4
  83. data/bin/commands/users_admin.rb +1 -0
  84. data/bin/commands/users_prefs.rb +1 -0
  85. data/bin/commands/users_profile.rb +6 -5
  86. data/bin/commands/views.rb +48 -0
  87. data/bin/commands/workflows.rb +38 -0
  88. data/bin/commands.rb +38 -8
  89. data/bin/slack +2 -3
  90. data/examples/hi_real_time_and_web/Gemfile +1 -0
  91. data/examples/hi_real_time_and_web/hi.rb +7 -3
  92. data/examples/hi_real_time_async_async/Gemfile +1 -0
  93. data/examples/hi_real_time_async_async/hi.rb +6 -2
  94. data/examples/hi_web/Gemfile +1 -0
  95. data/examples/hi_web/hi.rb +1 -0
  96. data/examples/new_ticket/Gemfile +1 -0
  97. data/examples/new_ticket/new_ticket.rb +1 -0
  98. data/lib/slack/config.rb +2 -2
  99. data/lib/slack/events/config.rb +32 -0
  100. data/lib/slack/events/request.rb +72 -0
  101. data/lib/slack/logger.rb +6 -5
  102. data/lib/slack/messages/formatting.rb +1 -0
  103. data/lib/slack/messages/message.rb +1 -4
  104. data/lib/slack/real_time/api/message.rb +3 -1
  105. data/lib/slack/real_time/api/message_id.rb +1 -0
  106. data/lib/slack/real_time/api/ping.rb +5 -2
  107. data/lib/slack/real_time/api/typing.rb +3 -1
  108. data/lib/slack/real_time/client.rb +101 -32
  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 +6 -10
  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 +1 -0
  115. data/lib/slack/real_time/models/group.rb +1 -0
  116. data/lib/slack/real_time/models/im.rb +1 -0
  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 +1 -0
  120. data/lib/slack/real_time/socket.rb +45 -17
  121. data/lib/slack/real_time/stores/base.rb +5 -7
  122. data/lib/slack/real_time/stores/starter.rb +17 -3
  123. data/lib/slack/real_time/stores/store.rb +33 -25
  124. data/lib/slack/real_time/stores.rb +1 -0
  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 +35 -0
  130. data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
  131. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
  132. data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
  133. data/lib/slack/web/api/endpoints/admin_conversations.rb +260 -0
  134. data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
  135. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
  136. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -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/api.rb +2 -3
  149. data/lib/slack/web/api/endpoints/apps.rb +27 -0
  150. data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
  151. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
  152. data/lib/slack/web/api/endpoints/apps_manifest.rb +75 -0
  153. data/lib/slack/web/api/endpoints/apps_permissions.rb +1 -0
  154. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +1 -0
  155. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +1 -0
  156. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +1 -0
  157. data/lib/slack/web/api/endpoints/auth.rb +2 -1
  158. data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
  159. data/lib/slack/web/api/endpoints/bots.rb +4 -1
  160. data/lib/slack/web/api/endpoints/calls.rb +83 -0
  161. data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
  162. data/lib/slack/web/api/endpoints/channels.rb +2 -243
  163. data/lib/slack/web/api/endpoints/chat.rb +144 -47
  164. data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
  165. data/lib/slack/web/api/endpoints/conversations.rb +152 -41
  166. data/lib/slack/web/api/endpoints/dialog.rb +3 -2
  167. data/lib/slack/web/api/endpoints/dnd.rb +9 -4
  168. data/lib/slack/web/api/endpoints/emoji.rb +1 -0
  169. data/lib/slack/web/api/endpoints/files.rb +24 -29
  170. data/lib/slack/web/api/endpoints/files_comments.rb +2 -34
  171. data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
  172. data/lib/slack/web/api/endpoints/groups.rb +1 -253
  173. data/lib/slack/web/api/endpoints/im.rb +1 -101
  174. data/lib/slack/web/api/endpoints/migration.rb +5 -2
  175. data/lib/slack/web/api/endpoints/mpim.rb +1 -96
  176. data/lib/slack/web/api/endpoints/oauth.rb +7 -31
  177. data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
  178. data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
  179. data/lib/slack/web/api/endpoints/pins.rb +8 -15
  180. data/lib/slack/web/api/endpoints/reactions.rb +20 -19
  181. data/lib/slack/web/api/endpoints/reminders.rb +18 -5
  182. data/lib/slack/web/api/endpoints/rtm.rb +11 -10
  183. data/lib/slack/web/api/endpoints/search.rb +28 -13
  184. data/lib/slack/web/api/endpoints/stars.rb +14 -11
  185. data/lib/slack/web/api/endpoints/team.rb +13 -4
  186. data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
  187. data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
  188. data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
  189. data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
  190. data/lib/slack/web/api/endpoints/usergroups.rb +27 -16
  191. data/lib/slack/web/api/endpoints/usergroups_users.rb +10 -5
  192. data/lib/slack/web/api/endpoints/users.rb +21 -20
  193. data/lib/slack/web/api/endpoints/users_admin.rb +1 -0
  194. data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
  195. data/lib/slack/web/api/endpoints/users_profile.rb +8 -7
  196. data/lib/slack/web/api/endpoints/views.rb +97 -0
  197. data/lib/slack/web/api/endpoints/workflows.rb +61 -0
  198. data/lib/slack/web/api/endpoints.rb +76 -18
  199. data/lib/slack/web/api/error.rb +1 -0
  200. data/lib/slack/web/api/errors/server_error.rb +37 -0
  201. data/lib/slack/web/api/errors/slack_error.rb +14 -1
  202. data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
  203. data/lib/slack/web/api/errors.rb +1040 -0
  204. data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +4 -5
  205. data/lib/slack/web/api/mixins/ids.id.rb +3 -2
  206. data/lib/slack/web/api/mixins/users.id.rb +2 -3
  207. data/lib/slack/web/api/mixins/users.search.rb +1 -0
  208. data/lib/slack/web/api/mixins.rb +2 -2
  209. data/lib/slack/web/api/patches/chat.1.patch +70 -0
  210. data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
  211. data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
  212. data/lib/slack/web/api/templates/command.erb +1 -0
  213. data/lib/slack/web/api/templates/commands.erb +1 -0
  214. data/lib/slack/web/api/templates/endpoints.erb +2 -2
  215. data/lib/slack/web/api/templates/errors.erb +20 -0
  216. data/lib/slack/web/api/templates/method.erb +5 -1
  217. data/lib/slack/web/api/templates/method_spec.erb +2 -1
  218. data/lib/slack/web/client.rb +2 -1
  219. data/lib/slack/web/config.rb +3 -0
  220. data/lib/slack/web/faraday/connection.rb +24 -20
  221. data/lib/slack/web/faraday/request.rb +3 -1
  222. data/lib/slack/web/faraday/response/raise_error.rb +21 -6
  223. data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
  224. data/lib/slack/web/pagination/cursor.rb +7 -7
  225. data/lib/slack-ruby-client.rb +10 -4
  226. data/lib/slack.rb +1 -0
  227. data/lib/slack_ruby_client.rb +1 -0
  228. data/lib/tasks/git.rake +1 -0
  229. data/lib/tasks/real_time.rake +15 -5
  230. data/lib/tasks/update.rake +1 -0
  231. data/lib/tasks/web.rake +39 -10
  232. data/screenshots/create-app.png +0 -0
  233. data/slack-ruby-client.gemspec +9 -6
  234. data/spec/fixtures/slack/web/429_error.yml +50 -54
  235. data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
  236. data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
  237. data/spec/fixtures/slack/web/conversations_info.yml +167 -0
  238. data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
  239. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
  240. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
  241. data/spec/fixtures/slack/web/paginated_users_list.yml +501 -69
  242. data/spec/fixtures/slack/web/rtm_connect.yml +267 -30
  243. data/spec/fixtures/slack/web/rtm_start.yml +771 -60
  244. data/spec/fixtures/slack/web/users_info.yml +153 -69
  245. data/spec/fixtures/slack/web/users_list.yml +102 -41
  246. data/spec/fixtures/slack/web/views_open_error.yml +83 -0
  247. data/spec/integration/integration_spec.rb +115 -47
  248. data/spec/slack/config_spec.rb +2 -0
  249. data/spec/slack/events/config_spec.rb +33 -0
  250. data/spec/slack/events/request_spec.rb +184 -0
  251. data/spec/slack/messages/formatting_spec.rb +25 -13
  252. data/spec/slack/real_time/api/message_spec.rb +6 -1
  253. data/spec/slack/real_time/api/ping_spec.rb +2 -0
  254. data/spec/slack/real_time/api/typing_spec.rb +5 -1
  255. data/spec/slack/real_time/client_spec.rb +244 -50
  256. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
  257. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
  258. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
  259. data/spec/slack/real_time/event_handlers/bot_spec.rb +3 -2
  260. data/spec/slack/real_time/event_handlers/channel_spec.rb +10 -7
  261. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +2 -1
  262. data/spec/slack/real_time/event_handlers/group_spec.rb +5 -4
  263. data/spec/slack/real_time/event_handlers/im_spec.rb +9 -8
  264. data/spec/slack/real_time/event_handlers/team_spec.rb +3 -1
  265. data/spec/slack/real_time/event_handlers/user_spec.rb +3 -2
  266. data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
  267. data/spec/slack/real_time/rtm_start_spec.rb +2 -1
  268. data/spec/slack/real_time/store_spec.rb +2 -1
  269. data/spec/slack/slack_spec.rb +40 -6
  270. data/spec/slack/version_spec.rb +2 -1
  271. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
  272. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
  273. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +8 -0
  274. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
  275. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -0
  276. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
  277. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
  278. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
  279. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
  280. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
  281. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
  282. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
  283. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
  284. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
  285. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
  286. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
  287. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
  288. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
  289. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
  290. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
  291. data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
  292. data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
  293. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
  294. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
  295. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
  296. data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
  297. data/spec/slack/web/api/endpoints/{apps_permissions_scopes_spec.rb → auth_teams_spec.rb} +2 -1
  298. data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
  299. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
  300. data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
  301. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
  302. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +9 -7
  303. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +112 -36
  304. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
  305. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +12 -4
  306. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -3
  307. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
  308. data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
  309. data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
  310. data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
  311. data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
  312. data/spec/slack/web/api/endpoints/files_spec.rb +5 -4
  313. data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
  314. data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -22
  315. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
  316. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
  317. data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
  318. data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
  319. data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
  320. data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
  321. data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
  322. data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
  323. data/spec/slack/web/api/endpoints/{apps_permissions_resources_spec.rb → team_billing_spec.rb} +2 -1
  324. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
  325. data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
  326. data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
  327. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
  328. data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
  329. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
  330. data/spec/slack/web/api/endpoints/users_admin_spec.rb +1 -0
  331. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +1 -0
  332. data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
  333. data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
  334. data/spec/slack/web/api/error_spec.rb +7 -7
  335. data/spec/slack/web/api/errors/slack_error_spec.rb +26 -7
  336. data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
  337. data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
  338. data/spec/slack/web/api/mixins/users_spec.rb +17 -8
  339. data/spec/slack/web/api/pagination/cursor_spec.rb +41 -13
  340. data/spec/slack/web/client_spec.rb +168 -19
  341. data/spec/slack/web/faraday/request_spec.rb +80 -0
  342. data/spec/slack/web/faraday/response/raise_error_spec.rb +48 -12
  343. data/spec/spec_helper.rb +9 -2
  344. data/spec/support/queue_with_timeout.rb +5 -4
  345. data/spec/support/real_time/concurrency/mock.rb +1 -0
  346. data/spec/support/real_time/connected_client.rb +6 -6
  347. data/spec/support/real_time/event.rb +1 -0
  348. data/spec/support/token.rb +1 -0
  349. data/spec/support/vcr.rb +37 -1
  350. metadata +205 -147
  351. data/examples/hi_real_time/Gemfile +0 -5
  352. data/examples/hi_real_time/hi.gif +0 -0
  353. data/examples/hi_real_time/hi.rb +0 -37
  354. data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
  355. data/examples/hi_real_time_async_celluloid/Procfile +0 -2
  356. data/examples/hi_real_time_async_celluloid/hi.rb +0 -35
  357. data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
  358. data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
  359. data/examples/hi_real_time_async_eventmachine/hi.rb +0 -35
  360. data/lib/slack/real_time/concurrency/celluloid.rb +0 -118
  361. data/lib/slack/real_time/concurrency/eventmachine.rb +0 -66
  362. data/lib/slack/web/api/mixins/channels.id.json +0 -20
  363. data/lib/slack/web/api/mixins/groups.id.json +0 -20
  364. data/lib/slack/web/api/mixins/groups.id.rb +0 -26
  365. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
  366. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
  367. data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
  368. data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
  369. data/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -13
  370. data/screenshots/register-bot.png +0 -0
  371. data/spec/fixtures/slack/web/503_error.yml +0 -14
  372. data/spec/fixtures/slack/web/channels_info.yml +0 -46
  373. data/spec/fixtures/slack/web/groups_info.yml +0 -43
  374. data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -106
  375. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
  376. data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
  377. data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -18
  378. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
  379. data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
  380. data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
  381. data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
  382. data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
  383. data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -14
  384. data/spec/slack/web/api/mixins/channels_spec.rb +0 -33
  385. data/spec/slack/web/api/mixins/groups_spec.rb +0 -33
@@ -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,28 +92,34 @@ 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
@@ -100,9 +133,10 @@ 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
141
  client.instance_variable_set('@socket', nil) # caused by a :close callback
108
142
  expect do
@@ -110,12 +144,14 @@ RSpec.describe Slack::RealTime::Client do
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,7 +290,13 @@ 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
@@ -181,9 +310,10 @@ 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
318
  client.instance_variable_set('@socket', nil) # caused by a :close callback
189
319
  expect do
@@ -191,6 +321,7 @@ RSpec.describe Slack::RealTime::Client do
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,9 +330,11 @@ 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
339
  expect(client.store).to be nil
207
340
  end
@@ -210,7 +343,7 @@ RSpec.describe Slack::RealTime::Client do
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
@@ -219,9 +352,16 @@ RSpec.describe Slack::RealTime::Client do
219
352
  it 'team' do
220
353
  expect(client.team).to be nil
221
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
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
@@ -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(
@@ -310,40 +484,48 @@ RSpec.describe Slack::RealTime::Client do
310
484
  end
311
485
  end
312
486
  end
487
+
313
488
  context 'start_options' do
314
489
  before do
315
- Slack::RealTime::Client.configure do |config|
490
+ described_class.configure do |config|
316
491
  config.start_options = { simple_latest: true }
317
492
  end
318
493
  end
494
+
319
495
  describe '#initialize' do
320
496
  it 'sets start_options' do
321
497
  expect(client.start_options).to eq(simple_latest: true)
322
498
  end
323
499
  context 'start!' do
324
500
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
501
+
325
502
  before do
326
503
  allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
327
504
  allow(socket).to receive(:connect!)
328
505
  allow(socket).to receive(:start_sync)
329
506
  end
507
+
330
508
  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
509
+ expect(client.web_client).to(
510
+ receive(:rtm_start).with(simple_latest: true).and_call_original
511
+ )
332
512
  client.start!
333
513
  end
334
514
  end
335
515
  end
336
516
  end
517
+
337
518
  context 'store_class' do
338
519
  context 'starter' do
339
520
  before do
340
- Slack::RealTime::Client.configure do |config|
521
+ described_class.configure do |config|
341
522
  config.store_class = Slack::RealTime::Stores::Starter
342
523
  end
343
524
  end
525
+
344
526
  describe '#initialize' do
345
527
  it 'can be overriden explicitly' do
346
- client = Slack::RealTime::Client.new(store_class: Slack::RealTime::Store)
528
+ client = described_class.new(store_class: Slack::RealTime::Store)
347
529
  expect(client.send(:store_class)).to eq Slack::RealTime::Store
348
530
  end
349
531
  it 'sets store_class' do
@@ -351,11 +533,13 @@ RSpec.describe Slack::RealTime::Client do
351
533
  end
352
534
  context 'start!' do
353
535
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
536
+
354
537
  before do
355
538
  allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
356
539
  allow(socket).to receive(:connect!)
357
540
  allow(socket).to receive(:start_sync)
358
541
  end
542
+
359
543
  it 'instantiates the correct store class', vcr: { cassette_name: 'web/rtm_connect' } do
360
544
  client.start!
361
545
  expect(client.store).to be_a Slack::RealTime::Stores::Starter
@@ -363,20 +547,24 @@ RSpec.describe Slack::RealTime::Client do
363
547
  end
364
548
  end
365
549
  end
550
+
366
551
  context 'store' do
367
552
  before do
368
- Slack::RealTime::Client.configure do |config|
553
+ described_class.configure do |config|
369
554
  config.store_class = Slack::RealTime::Stores::Store
370
555
  end
371
556
  end
557
+
372
558
  describe '#initialize' do
373
559
  context 'start!' do
374
560
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
561
+
375
562
  before do
376
563
  allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
377
564
  allow(socket).to receive(:connect!)
378
565
  allow(socket).to receive(:start_sync)
379
566
  end
567
+
380
568
  it 'calls rtm_start and not rtm_connect', vcr: { cassette_name: 'web/rtm_start' } do
381
569
  expect(client.web_client).to receive(:rtm_start).and_call_original
382
570
  client.start!
@@ -385,18 +573,20 @@ RSpec.describe Slack::RealTime::Client do
385
573
  end
386
574
  end
387
575
  end
576
+
388
577
  context 'start_method' do
389
578
  describe '#initialize' do
390
579
  it 'can be overriden explicitly' do
391
- client = Slack::RealTime::Client.new(start_method: :overriden)
580
+ client = described_class.new(start_method: :overriden)
392
581
  expect(client.send(:start_method)).to eq :overriden
393
582
  end
394
583
  context 'with start_method' do
395
584
  before do
396
- Slack::RealTime::Client.configure do |config|
585
+ described_class.configure do |config|
397
586
  config.start_method = :overriden
398
587
  end
399
588
  end
589
+
400
590
  it 'sets start_method' do
401
591
  expect(client.send(:start_method)).to eq :overriden
402
592
  end
@@ -407,14 +597,18 @@ RSpec.describe Slack::RealTime::Client do
407
597
  end.to raise_error RuntimeError, 'overriden'
408
598
  end
409
599
  end
600
+
410
601
  context 'start!' do
411
602
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
603
+
412
604
  before do
413
605
  allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
414
606
  allow(socket).to receive(:connect!)
415
607
  allow(socket).to receive(:start_sync)
416
608
  end
417
- it 'defaults to :rtm_start when using full store', vcr: { cassette_name: 'web/rtm_start' } do
609
+
610
+ it 'defaults to :rtm_start when using full store',
611
+ vcr: { cassette_name: 'web/rtm_start' } do
418
612
  expect(client.web_client).to receive(:rtm_start).and_call_original
419
613
  client.start!
420
614
  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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
@@ -5,7 +6,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
5
6
 
6
7
  context 'bot' do
7
8
  it 'sets bot data on rtm.start' do
8
- expect(client.bots.count).to eq 16
9
+ expect(client.bots.count).to eq 83
9
10
  end
10
11
  it 'bot_added' do
11
12
  expect do
@@ -36,7 +37,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
36
37
  }
37
38
  )
38
39
  client.send(:dispatch, event)
39
- end.to_not change(client.bots, :count)
40
+ end.not_to change(client.bots, :count)
40
41
  bot = client.bots['B0751JU2H']
41
42
  expect(bot['name']).to eq 'hugbot'
42
43
  end