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.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/workflows/danger.yml +19 -0
- data/.github/workflows/integtest.yml +25 -0
- data/.github/workflows/rubocop.yml +13 -0
- data/.github/workflows/test.yml +34 -0
- data/.gitignore +6 -3
- data/.rubocop.yml +36 -2
- data/.rubocop_todo.yml +186 -54
- data/CHANGELOG.md +156 -31
- data/CONTRIBUTING.md +20 -9
- data/Dangerfile +2 -0
- data/Gemfile +27 -6
- data/Gemfile.danger +6 -0
- data/LICENSE.md +1 -1
- data/README.md +199 -52
- data/RELEASING.md +2 -2
- data/Rakefile +2 -1
- data/UPGRADING.md +89 -3
- data/bin/commands/admin_analytics.rb +16 -0
- data/bin/commands/admin_apps.rb +51 -0
- data/bin/commands/admin_apps_approved.rb +17 -0
- data/bin/commands/admin_apps_requests.rb +28 -0
- data/bin/commands/admin_apps_restricted.rb +17 -0
- data/bin/commands/admin_auth_policy.rb +39 -0
- data/bin/commands/admin_barriers.rb +47 -0
- data/bin/commands/admin_conversations.rb +170 -0
- data/bin/commands/admin_conversations_ekm.rb +17 -0
- data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
- data/bin/commands/admin_conversations_whitelist.rb +37 -0
- data/bin/commands/admin_emoji.rb +54 -0
- data/bin/commands/admin_inviteRequests.rb +36 -0
- data/bin/commands/admin_inviteRequests_approved.rb +16 -0
- data/bin/commands/admin_inviteRequests_denied.rb +16 -0
- data/bin/commands/admin_teams.rb +27 -0
- data/bin/commands/admin_teams_admins.rb +16 -0
- data/bin/commands/admin_teams_owners.rb +16 -0
- data/bin/commands/admin_teams_settings.rb +64 -0
- data/bin/commands/admin_usergroups.rb +48 -0
- data/bin/commands/admin_users.rb +98 -0
- data/bin/commands/admin_users_session.rb +78 -0
- data/bin/commands/admin_users_unsupportedVersions.rb +15 -0
- data/bin/commands/api.rb +1 -1
- data/bin/commands/apps.rb +15 -0
- data/bin/commands/apps_connections.rb +13 -0
- data/bin/commands/apps_event_authorizations.rb +16 -0
- data/bin/commands/apps_manifest.rb +52 -0
- data/bin/commands/apps_permissions.rb +1 -0
- data/bin/commands/apps_permissions_resources.rb +15 -0
- data/bin/commands/apps_permissions_scopes.rb +13 -0
- data/bin/commands/apps_permissions_users.rb +26 -0
- data/bin/commands/auth.rb +1 -0
- data/bin/commands/auth_teams.rb +16 -0
- data/bin/commands/bookmarks.rb +52 -0
- data/bin/commands/bots.rb +2 -0
- data/bin/commands/calls.rb +52 -0
- data/bin/commands/calls_participants.rb +25 -0
- data/bin/commands/channels.rb +1 -153
- data/bin/commands/chat.rb +57 -12
- data/bin/commands/chat_scheduledMessages.rb +19 -0
- data/bin/commands/conversations.rb +75 -4
- data/bin/commands/dialog.rb +1 -0
- data/bin/commands/dnd.rb +6 -3
- data/bin/commands/emoji.rb +1 -0
- data/bin/commands/files.rb +14 -19
- data/bin/commands/files_comments.rb +1 -21
- data/bin/commands/files_remote.rb +78 -0
- data/bin/commands/groups.rb +1 -159
- data/bin/commands/im.rb +1 -62
- data/bin/commands/migration.rb +2 -0
- data/bin/commands/mpim.rb +1 -58
- data/bin/commands/oauth.rb +4 -15
- data/bin/commands/oauth_v2.rb +29 -0
- data/bin/commands/openid_connect.rb +27 -0
- data/bin/commands/pins.rb +3 -6
- data/bin/commands/reactions.rb +5 -3
- data/bin/commands/reminders.rb +7 -0
- data/bin/commands/rtm.rb +7 -4
- data/bin/commands/search.rb +8 -3
- data/bin/commands/stars.rb +10 -6
- data/bin/commands/team.rb +6 -0
- data/bin/commands/team_billing.rb +13 -0
- data/bin/commands/team_preferences.rb +13 -0
- data/bin/commands/team_profile.rb +1 -0
- data/bin/commands/tooling_tokens.rb +14 -0
- data/bin/commands/usergroups.rb +7 -1
- data/bin/commands/usergroups_users.rb +3 -0
- data/bin/commands/users.rb +21 -6
- data/bin/commands/users_admin.rb +1 -0
- data/bin/commands/users_prefs.rb +1 -0
- data/bin/commands/users_profile.rb +7 -6
- data/bin/commands/views.rb +48 -0
- data/bin/commands/workflows.rb +38 -0
- data/bin/commands.rb +40 -5
- data/bin/slack +2 -3
- data/examples/hi_real_time_and_web/Gemfile +1 -0
- data/examples/hi_real_time_and_web/hi.rb +7 -3
- data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
- data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
- data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/hi.rb +12 -7
- data/examples/hi_web/Gemfile +1 -0
- data/examples/hi_web/hi.rb +1 -0
- data/examples/new_ticket/Gemfile +1 -0
- data/examples/new_ticket/new_ticket.rb +1 -0
- data/lib/slack/config.rb +2 -2
- data/lib/slack/events/config.rb +32 -0
- data/lib/slack/events/request.rb +72 -0
- data/lib/slack/logger.rb +6 -5
- data/lib/slack/messages/formatting.rb +1 -1
- data/lib/slack/messages/message.rb +1 -4
- data/lib/slack/real_time/api/message.rb +3 -1
- data/lib/slack/real_time/api/message_id.rb +1 -0
- data/lib/slack/real_time/api/ping.rb +5 -2
- data/lib/slack/real_time/api/typing.rb +3 -1
- data/lib/slack/real_time/client.rb +103 -34
- data/lib/slack/real_time/concurrency/async.rb +138 -0
- data/lib/slack/real_time/concurrency.rb +2 -2
- data/lib/slack/real_time/config.rb +6 -10
- data/lib/slack/real_time/models/base.rb +1 -4
- data/lib/slack/real_time/models/bot.rb +1 -0
- data/lib/slack/real_time/models/channel.rb +1 -0
- data/lib/slack/real_time/models/group.rb +1 -0
- data/lib/slack/real_time/models/im.rb +1 -0
- data/lib/slack/real_time/models/team.rb +1 -0
- data/lib/slack/real_time/models/user.rb +1 -0
- data/lib/slack/real_time/models.rb +1 -0
- data/lib/slack/real_time/socket.rb +45 -17
- data/lib/slack/real_time/stores/base.rb +5 -7
- data/lib/slack/real_time/stores/starter.rb +27 -3
- data/lib/slack/real_time/stores/store.rb +43 -25
- data/lib/slack/real_time/stores.rb +1 -0
- data/lib/slack/version.rb +2 -1
- data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
- data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
- data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +51 -0
- data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
- data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
- data/lib/slack/web/api/endpoints/admin_conversations.rb +262 -0
- data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
- data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
- data/lib/slack/web/api/endpoints/admin_emoji.rb +88 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
- data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
- data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
- data/lib/slack/web/api/endpoints/admin_users.rb +163 -0
- data/lib/slack/web/api/endpoints/admin_users_session.rb +122 -0
- data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
- data/lib/slack/web/api/endpoints/api.rb +2 -3
- data/lib/slack/web/api/endpoints/apps.rb +27 -0
- data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
- data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
- data/lib/slack/web/api/endpoints/apps_manifest.rb +77 -0
- data/lib/slack/web/api/endpoints/apps_permissions.rb +1 -0
- data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +31 -0
- data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +21 -0
- data/lib/slack/web/api/endpoints/apps_permissions_users.rb +50 -0
- data/lib/slack/web/api/endpoints/auth.rb +2 -1
- data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
- data/lib/slack/web/api/endpoints/bookmarks.rb +86 -0
- data/lib/slack/web/api/endpoints/bots.rb +4 -1
- data/lib/slack/web/api/endpoints/calls.rb +83 -0
- data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
- data/lib/slack/web/api/endpoints/channels.rb +2 -243
- data/lib/slack/web/api/endpoints/chat.rb +145 -46
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
- data/lib/slack/web/api/endpoints/conversations.rb +152 -39
- data/lib/slack/web/api/endpoints/dialog.rb +3 -2
- data/lib/slack/web/api/endpoints/dnd.rb +9 -4
- data/lib/slack/web/api/endpoints/emoji.rb +1 -0
- data/lib/slack/web/api/endpoints/files.rb +35 -28
- data/lib/slack/web/api/endpoints/files_comments.rb +2 -34
- data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
- data/lib/slack/web/api/endpoints/groups.rb +1 -243
- data/lib/slack/web/api/endpoints/im.rb +1 -101
- data/lib/slack/web/api/endpoints/migration.rb +5 -2
- data/lib/slack/web/api/endpoints/mpim.rb +1 -86
- data/lib/slack/web/api/endpoints/oauth.rb +8 -30
- data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
- data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
- data/lib/slack/web/api/endpoints/pins.rb +8 -15
- data/lib/slack/web/api/endpoints/reactions.rb +29 -18
- data/lib/slack/web/api/endpoints/reminders.rb +18 -5
- data/lib/slack/web/api/endpoints/rtm.rb +14 -9
- data/lib/slack/web/api/endpoints/search.rb +30 -15
- data/lib/slack/web/api/endpoints/stars.rb +23 -10
- data/lib/slack/web/api/endpoints/team.rb +15 -4
- data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
- data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
- data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
- data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
- data/lib/slack/web/api/endpoints/usergroups.rb +27 -16
- data/lib/slack/web/api/endpoints/usergroups_users.rb +10 -5
- data/lib/slack/web/api/endpoints/users.rb +44 -17
- data/lib/slack/web/api/endpoints/users_admin.rb +1 -0
- data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
- data/lib/slack/web/api/endpoints/users_profile.rb +9 -8
- data/lib/slack/web/api/endpoints/views.rb +97 -0
- data/lib/slack/web/api/endpoints/workflows.rb +61 -0
- data/lib/slack/web/api/endpoints.rb +80 -12
- data/lib/slack/web/api/error.rb +1 -0
- data/lib/slack/web/api/errors/server_error.rb +37 -0
- data/lib/slack/web/api/errors/slack_error.rb +14 -1
- data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
- data/lib/slack/web/api/errors.rb +1066 -0
- data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +4 -5
- data/lib/slack/web/api/mixins/ids.id.rb +3 -2
- data/lib/slack/web/api/mixins/users.id.rb +2 -3
- data/lib/slack/web/api/mixins/users.search.rb +1 -0
- data/lib/slack/web/api/mixins.rb +2 -2
- data/lib/slack/web/api/patches/chat.1.patch +70 -0
- data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
- data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
- data/lib/slack/web/api/templates/command.erb +1 -0
- data/lib/slack/web/api/templates/commands.erb +1 -0
- data/lib/slack/web/api/templates/endpoints.erb +2 -2
- data/lib/slack/web/api/templates/errors.erb +20 -0
- data/lib/slack/web/api/templates/method.erb +5 -1
- data/lib/slack/web/api/templates/method_spec.erb +2 -1
- data/lib/slack/web/client.rb +2 -1
- data/lib/slack/web/config.rb +3 -0
- data/lib/slack/web/faraday/connection.rb +24 -20
- data/lib/slack/web/faraday/request.rb +5 -1
- data/lib/slack/web/faraday/response/raise_error.rb +14 -7
- data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
- data/lib/slack/web/pagination/cursor.rb +7 -7
- data/lib/slack-ruby-client.rb +12 -5
- data/lib/slack.rb +1 -0
- data/lib/slack_ruby_client.rb +1 -0
- data/lib/tasks/git.rake +1 -0
- data/lib/tasks/real_time.rake +16 -8
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +39 -10
- data/screenshots/create-app.png +0 -0
- data/slack-ruby-client.gemspec +7 -12
- data/spec/fixtures/slack/web/429_error.yml +50 -54
- data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
- data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
- data/spec/fixtures/slack/web/conversations_info.yml +167 -0
- data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
- data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
- data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
- data/spec/fixtures/slack/web/paginated_users_list.yml +501 -69
- data/spec/fixtures/slack/web/rtm_connect.yml +267 -30
- data/spec/fixtures/slack/web/rtm_start.yml +771 -60
- data/spec/fixtures/slack/web/users_info.yml +153 -69
- data/spec/fixtures/slack/web/users_list.yml +102 -41
- data/spec/fixtures/slack/web/views_open_error.yml +83 -0
- data/spec/integration/integration_spec.rb +116 -48
- data/spec/slack/config_spec.rb +2 -0
- data/spec/slack/events/config_spec.rb +33 -0
- data/spec/slack/events/request_spec.rb +184 -0
- data/spec/slack/messages/formatting_spec.rb +25 -14
- data/spec/slack/real_time/api/message_spec.rb +6 -1
- data/spec/slack/real_time/api/ping_spec.rb +2 -0
- data/spec/slack/real_time/api/typing_spec.rb +5 -1
- data/spec/slack/real_time/client_spec.rb +258 -62
- data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
- data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
- data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
- data/spec/slack/real_time/event_handlers/bot_spec.rb +3 -2
- data/spec/slack/real_time/event_handlers/channel_spec.rb +14 -11
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +2 -1
- data/spec/slack/real_time/event_handlers/group_spec.rb +6 -5
- data/spec/slack/real_time/event_handlers/im_spec.rb +10 -9
- data/spec/slack/real_time/event_handlers/team_spec.rb +3 -1
- data/spec/slack/real_time/event_handlers/user_spec.rb +3 -2
- data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
- data/spec/slack/real_time/rtm_start_spec.rb +2 -1
- data/spec/slack/real_time/store_spec.rb +4 -3
- data/spec/slack/slack_spec.rb +42 -8
- data/spec/slack/version_spec.rb +2 -1
- data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -0
- data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
- data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
- data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
- data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
- data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
- data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
- data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
- data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
- data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
- data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
- data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
- data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
- data/spec/slack/web/api/endpoints/apps_spec.rb +16 -0
- data/spec/slack/web/api/endpoints/auth_teams_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/bookmarks_spec.rb +40 -0
- data/spec/slack/web/api/endpoints/bots_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
- data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
- data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +9 -7
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +131 -39
- data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +16 -6
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -3
- data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +103 -0
- data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
- data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
- data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
- data/spec/slack/web/api/endpoints/files_spec.rb +5 -4
- data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -22
- data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
- data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
- data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
- data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/team_billing_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
- data/spec/slack/web/api/endpoints/users_admin_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/users_prefs_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
- data/spec/slack/web/api/error_spec.rb +7 -7
- data/spec/slack/web/api/errors/slack_error_spec.rb +26 -7
- data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
- data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
- data/spec/slack/web/api/mixins/users_spec.rb +25 -14
- data/spec/slack/web/api/pagination/cursor_spec.rb +43 -15
- data/spec/slack/web/client_spec.rb +186 -19
- data/spec/slack/web/faraday/request_spec.rb +80 -0
- data/spec/slack/web/faraday/response/raise_error_spec.rb +48 -12
- data/spec/spec_helper.rb +9 -2
- data/spec/support/queue_with_timeout.rb +5 -4
- data/spec/support/real_time/concurrency/mock.rb +1 -0
- data/spec/support/real_time/connected_client.rb +6 -6
- data/spec/support/real_time/event.rb +1 -0
- data/spec/support/token.rb +1 -0
- data/spec/support/vcr.rb +37 -1
- metadata +177 -231
- data/.travis.yml +0 -30
- data/examples/hi_real_time/Gemfile +0 -5
- data/examples/hi_real_time/hi.gif +0 -0
- data/examples/hi_real_time/hi.rb +0 -37
- data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
- data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
- data/examples/hi_real_time_async_eventmachine/hi.rb +0 -36
- data/lib/slack/real_time/concurrency/celluloid.rb +0 -117
- data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
- data/lib/slack/web/api/mixins/channels.id.json +0 -20
- data/lib/slack/web/api/mixins/groups.id.json +0 -20
- data/lib/slack/web/api/mixins/groups.id.rb +0 -26
- data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
- data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
- data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
- data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
- data/screenshots/register-bot.png +0 -0
- data/spec/fixtures/slack/web/503_error.yml +0 -14
- data/spec/fixtures/slack/web/channels_info.yml +0 -46
- data/spec/fixtures/slack/web/groups_info.yml +0 -43
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -62
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
- data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
- data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
- data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -14
- data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
- 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 =
|
|
24
|
-
expect(client.token).to eq '
|
|
25
|
-
expect(client.web_client.token).to eq '
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
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 '
|
|
95
|
+
expect(client.self.id).to eq 'U0J1GAHN1'
|
|
69
96
|
end
|
|
70
97
|
it 'sets users' do
|
|
71
|
-
expect(client.users.count).to eq
|
|
72
|
-
expect(client.users.values.first['id']).to eq '
|
|
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
|
|
76
|
-
expect(client.channels.values.first['name']).to eq '
|
|
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
|
|
80
|
-
expect(client.ims.values.first['user']).to eq '
|
|
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
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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) {
|
|
133
|
-
let(:url) { 'wss://
|
|
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
|
|
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 '
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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) {
|
|
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
|
|
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).
|
|
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
|
|
350
|
+
expect(client.self).to be_nil
|
|
218
351
|
end
|
|
219
352
|
it 'team' do
|
|
220
|
-
expect(client.team).to
|
|
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) {
|
|
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
|
|
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) {
|
|
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)).
|
|
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
|
-
|
|
427
|
+
described_class.config.reset
|
|
261
428
|
end
|
|
262
|
-
|
|
263
|
-
let(:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|