slack-ruby-client 0.13.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/workflows/integration_test.yml +26 -0
- data/.github/workflows/lint.yml +14 -0
- data/.github/workflows/pr_lint.yml +21 -0
- data/.github/workflows/test.yml +36 -0
- data/.gitignore +5 -3
- data/.rubocop.yml +34 -5
- data/.rubocop_todo.yml +180 -46
- data/.ruby-version +1 -0
- data/CHANGELOG.md +119 -2
- data/CONTRIBUTING.md +23 -11
- data/Dangerfile +2 -0
- data/Gemfile +22 -5
- data/Gemfile.danger +6 -0
- data/LICENSE.md +1 -1
- data/README.md +236 -101
- data/RELEASING.md +2 -2
- data/Rakefile +2 -1
- data/UPGRADING.md +100 -2
- 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_audit_anomaly_allow.rb +23 -0
- data/bin/commands/admin_auth_policy.rb +39 -0
- data/bin/commands/admin_barriers.rb +47 -0
- data/bin/commands/admin_conversations.rb +171 -0
- data/bin/commands/admin_conversations_ekm.rb +17 -0
- data/bin/commands/admin_conversations_restrictAccess.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/auth.rb +1 -0
- data/bin/commands/auth_teams.rb +16 -0
- data/bin/commands/bookmarks.rb +53 -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/chat.rb +61 -14
- data/bin/commands/chat_scheduledMessages.rb +19 -0
- data/bin/commands/conversations.rb +82 -10
- 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 +34 -18
- data/bin/commands/files_comments.rb +1 -21
- data/bin/commands/files_remote.rb +78 -0
- data/bin/commands/migration.rb +2 -0
- data/bin/commands/oauth.rb +2 -14
- 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 +3 -3
- data/bin/commands/reminders.rb +7 -0
- data/bin/commands/rtm.rb +1 -15
- data/bin/commands/search.rb +6 -1
- data/bin/commands/stars.rb +8 -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 +6 -4
- data/bin/commands/users_admin.rb +1 -0
- data/bin/commands/users_prefs.rb +1 -0
- data/bin/commands/users_profile.rb +6 -5
- data/bin/commands/views.rb +50 -0
- data/bin/commands/workflows.rb +38 -0
- data/bin/commands.rb +41 -8
- data/bin/slack +3 -4
- 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_async/Gemfile +1 -0
- data/examples/hi_real_time_async_async/hi.rb +6 -2
- 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 -0
- data/lib/slack/messages/message.rb +1 -4
- data/lib/slack/real_time/api/message.rb +6 -3
- 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/templates/event_handler.erb +5 -1
- data/lib/slack/real_time/api/typing.rb +5 -2
- data/lib/slack/real_time/client.rb +105 -54
- data/lib/slack/real_time/concurrency/async.rb +77 -6
- data/lib/slack/real_time/concurrency.rb +1 -2
- data/lib/slack/real_time/config.rb +9 -13
- 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 +5 -0
- data/lib/slack/real_time/models/im.rb +1 -0
- data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
- 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 +3 -1
- data/lib/slack/real_time/socket.rb +45 -17
- data/lib/slack/real_time/stores/base.rb +28 -14
- data/lib/slack/real_time/stores/starter.rb +325 -297
- data/lib/slack/real_time/stores/store.rb +271 -196
- data/lib/slack/real_time/stores.rb +2 -7
- 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_audit_anomaly_allow.rb +34 -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 +264 -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_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/auth.rb +2 -1
- data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
- data/lib/slack/web/api/endpoints/bookmarks.rb +88 -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/chat.rb +168 -65
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
- data/lib/slack/web/api/endpoints/conversations.rb +182 -67
- data/lib/slack/web/api/endpoints/dialog.rb +5 -4
- 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 +69 -37
- data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
- data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
- data/lib/slack/web/api/endpoints/migration.rb +6 -3
- data/lib/slack/web/api/endpoints/oauth.rb +7 -31
- 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 +11 -18
- data/lib/slack/web/api/endpoints/reactions.rb +22 -21
- data/lib/slack/web/api/endpoints/reminders.rb +23 -10
- data/lib/slack/web/api/endpoints/rtm.rb +3 -25
- data/lib/slack/web/api/endpoints/search.rb +31 -16
- data/lib/slack/web/api/endpoints/stars.rb +14 -11
- 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 +31 -20
- data/lib/slack/web/api/endpoints/usergroups_users.rb +13 -8
- data/lib/slack/web/api/endpoints/users.rb +24 -23
- data/lib/slack/web/api/endpoints/users_admin.rb +3 -2
- data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
- data/lib/slack/web/api/endpoints/users_profile.rb +8 -7
- data/lib/slack/web/api/endpoints/views.rb +102 -0
- data/lib/slack/web/api/endpoints/workflows.rb +61 -0
- data/lib/slack/web/api/endpoints.rb +82 -18
- 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 +1116 -0
- data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +5 -6
- data/lib/slack/web/api/mixins/ids.id.rb +3 -2
- data/lib/slack/web/api/mixins/users.id.rb +3 -4
- data/lib/slack/web/api/mixins/users.search.rb +3 -1
- data/lib/slack/web/api/mixins.rb +2 -2
- data/lib/slack/web/api/patches/chat.attachments-blocks.patch +69 -0
- data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
- data/lib/slack/web/api/patches/views.view-json.patch +55 -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 +6 -2
- 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 +5 -2
- 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 +51 -21
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +48 -12
- 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 +347 -26
- 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 +115 -47
- data/spec/slack/config_spec.rb +2 -0
- data/spec/slack/events/config_spec.rb +35 -0
- data/spec/slack/events/request_spec.rb +188 -0
- data/spec/slack/messages/formatting_spec.rb +35 -13
- data/spec/slack/real_time/api/message_spec.rb +7 -2
- data/spec/slack/real_time/api/ping_spec.rb +3 -1
- data/spec/slack/real_time/api/typing_spec.rb +6 -2
- data/spec/slack/real_time/client_spec.rb +300 -142
- 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 +20 -17
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +3 -2
- data/spec/slack/real_time/event_handlers/im_spec.rb +31 -27
- data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +36 -27
- data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +31 -24
- data/spec/slack/real_time/event_handlers/team_spec.rb +8 -7
- data/spec/slack/real_time/event_handlers/user_spec.rb +7 -5
- data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
- data/spec/slack/real_time/stores/store_spec.rb +50 -0
- data/spec/slack/slack_spec.rb +41 -6
- 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_audit_anomaly_allow_spec.rb +8 -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/{apps_permissions_resources_spec.rb → auth_teams_spec.rb} +2 -1
- 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 +144 -40
- data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +18 -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 +112 -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 +18 -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/{apps_permissions_scopes_spec.rb → team_billing_spec.rb} +2 -1
- 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 +45 -0
- data/spec/slack/web/api/mixins/users_spec.rb +19 -8
- data/spec/slack/web/api/pagination/cursor_spec.rb +47 -15
- data/spec/slack/web/client_spec.rb +199 -22
- 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/real_time/loaded_client.rb +120 -0
- data/spec/support/token.rb +1 -0
- data/spec/support/vcr.rb +37 -1
- metadata +174 -262
- data/.travis.yml +0 -32
- data/bin/commands/apps_permissions.rb +0 -22
- data/bin/commands/apps_permissions_resources.rb +0 -14
- data/bin/commands/apps_permissions_scopes.rb +0 -12
- data/bin/commands/apps_permissions_users.rb +0 -25
- data/bin/commands/channels.rb +0 -175
- data/bin/commands/groups.rb +0 -174
- data/bin/commands/im.rb +0 -67
- data/bin/commands/mpim.rb +0 -65
- 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_celluloid/Procfile +0 -2
- data/examples/hi_real_time_async_celluloid/hi.rb +0 -35
- data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
- data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
- data/examples/hi_real_time_async_eventmachine/hi.rb +0 -35
- data/lib/slack/real_time/concurrency/celluloid.rb +0 -118
- data/lib/slack/real_time/concurrency/eventmachine.rb +0 -66
- data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
- data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -30
- data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -20
- data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -49
- data/lib/slack/web/api/endpoints/channels.rb +0 -266
- data/lib/slack/web/api/endpoints/groups.rb +0 -265
- data/lib/slack/web/api/endpoints/im.rb +0 -113
- data/lib/slack/web/api/endpoints/mpim.rb +0 -108
- data/lib/slack/web/api/endpoints/presence.rb +0 -23
- 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/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -13
- 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/fixtures/slack/web/rtm_start.yml +0 -104
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -106
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
- data/spec/slack/real_time/rtm_start_spec.rb +0 -13
- data/spec/slack/real_time/store_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
- data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -18
- 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 -33
- data/spec/slack/web/api/mixins/groups_spec.rb +0 -33
|
@@ -1,121 +1,152 @@
|
|
|
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
|
|
28
|
+
|
|
27
29
|
context 'with real time config' do
|
|
28
30
|
before do
|
|
29
|
-
|
|
31
|
+
described_class.configure do |config|
|
|
30
32
|
config.token = 'custom real time token'
|
|
31
33
|
end
|
|
32
34
|
end
|
|
35
|
+
|
|
33
36
|
it 'overrides token to real time config' do
|
|
34
|
-
client =
|
|
37
|
+
client = described_class.new
|
|
35
38
|
expect(client.token).to eq 'custom real time token'
|
|
36
39
|
expect(client.web_client.token).to eq 'custom real time token'
|
|
37
40
|
end
|
|
41
|
+
|
|
38
42
|
it 'overrides token to specific token' do
|
|
39
|
-
client =
|
|
43
|
+
client = described_class.new(token: 'local token')
|
|
40
44
|
expect(client.token).to eq 'local token'
|
|
41
45
|
expect(client.web_client.token).to eq 'local token'
|
|
42
46
|
end
|
|
43
47
|
end
|
|
44
48
|
end
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
49
|
+
|
|
50
|
+
context 'websocket_ping_timer' do
|
|
51
|
+
context 'with defaults' do
|
|
52
|
+
let(:client) { described_class.new }
|
|
53
|
+
|
|
54
|
+
it 'defaults to websocket_ping / 2' do
|
|
55
|
+
expect(client.websocket_ping_timer).to eq 15
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'with websocket_ping value changed' do
|
|
60
|
+
let(:client) { described_class.new(websocket_ping: 22) }
|
|
61
|
+
|
|
62
|
+
it 'defaults to websocket_ping / 2' do
|
|
63
|
+
expect(client.websocket_ping_timer).to eq 11
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
context 'client with a full store',
|
|
69
|
+
vcr: { cassette_name: 'web/rtm_connect', allow_playback_repeats: true } do
|
|
70
|
+
let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Store) }
|
|
71
|
+
let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
|
|
72
|
+
|
|
48
73
|
describe '#start!' do
|
|
49
74
|
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
75
|
+
|
|
50
76
|
before do
|
|
51
|
-
allow(Slack::RealTime::Socket).to
|
|
77
|
+
allow(Slack::RealTime::Socket).to(
|
|
78
|
+
receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
|
|
79
|
+
)
|
|
52
80
|
allow(socket).to receive(:connect!)
|
|
53
81
|
allow(socket).to receive(:start_sync)
|
|
54
82
|
client.start!
|
|
55
83
|
end
|
|
84
|
+
|
|
56
85
|
describe 'properties provided upon connection' do
|
|
57
86
|
it 'sets url' do
|
|
58
87
|
expect(client.url).to eq url
|
|
59
88
|
end
|
|
89
|
+
|
|
60
90
|
it 'sets team' do
|
|
61
91
|
expect(client.team.domain).to eq 'dblockdotorg'
|
|
62
92
|
end
|
|
93
|
+
|
|
63
94
|
it 'sets teams' do
|
|
64
95
|
expect(client.teams.count).to eq 1
|
|
65
96
|
expect(client.teams.values.first).to eq client.team
|
|
66
97
|
end
|
|
98
|
+
|
|
67
99
|
it 'sets self' do
|
|
68
|
-
expect(client.self.id).to eq '
|
|
100
|
+
expect(client.self.id).to eq 'U0J1GAHN1'
|
|
69
101
|
end
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
expect(client.users.
|
|
73
|
-
|
|
74
|
-
it 'sets channels' do
|
|
75
|
-
expect(client.channels.count).to eq 37
|
|
76
|
-
expect(client.channels.values.first['name']).to eq 'a1'
|
|
77
|
-
end
|
|
78
|
-
it 'sets ims' do
|
|
79
|
-
expect(client.ims.count).to eq 2
|
|
80
|
-
expect(client.ims.values.first['user']).to eq 'USLACKBOT'
|
|
81
|
-
end
|
|
82
|
-
it 'sets bots' do
|
|
83
|
-
expect(client.bots.count).to eq 16
|
|
84
|
-
expect(client.bots.values.first['name']).to eq 'bot'
|
|
102
|
+
|
|
103
|
+
it 'sets user' do
|
|
104
|
+
expect(client.users.count).to eq 1
|
|
105
|
+
expect(client.users.values.first['id']).to eq 'U0J1GAHN1'
|
|
85
106
|
end
|
|
86
|
-
|
|
87
|
-
|
|
107
|
+
|
|
108
|
+
it 'includes team name in to_s' do
|
|
109
|
+
expect(client.to_s).to eq(
|
|
110
|
+
"id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
|
|
111
|
+
)
|
|
88
112
|
end
|
|
89
113
|
end
|
|
114
|
+
|
|
90
115
|
it 'uses web client to fetch url' do
|
|
91
116
|
expect(client.web_client).to be_a Slack::Web::Client
|
|
92
117
|
end
|
|
118
|
+
|
|
93
119
|
it 'remembers socket' do
|
|
94
|
-
expect(client.instance_variable_get(
|
|
120
|
+
expect(client.instance_variable_get(:@socket)).to eq socket
|
|
95
121
|
end
|
|
122
|
+
|
|
96
123
|
it 'cannot be invoked twice' do
|
|
97
124
|
expect do
|
|
98
125
|
client.start!
|
|
99
126
|
end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
|
|
100
127
|
end
|
|
128
|
+
|
|
101
129
|
describe '#stop!' do
|
|
102
130
|
before do
|
|
103
|
-
|
|
131
|
+
allow(socket).to receive(:disconnect!)
|
|
104
132
|
client.stop!
|
|
105
133
|
end
|
|
134
|
+
|
|
106
135
|
it 'cannot be invoked twice' do
|
|
107
|
-
client.instance_variable_set(
|
|
136
|
+
client.instance_variable_set(:@socket, nil) # caused by a :close callback
|
|
108
137
|
expect do
|
|
109
138
|
client.stop!
|
|
110
139
|
end.to raise_error Slack::RealTime::Client::ClientNotStartedError
|
|
111
140
|
end
|
|
112
141
|
end
|
|
142
|
+
|
|
113
143
|
describe '#next_id' do
|
|
114
144
|
it 'increments' do
|
|
115
145
|
previous_id = client.send(:next_id)
|
|
116
146
|
expect(client.send(:next_id)).to eq previous_id + 1
|
|
117
147
|
end
|
|
118
148
|
end
|
|
149
|
+
|
|
119
150
|
context 'subclassed' do
|
|
120
151
|
it 'runs event handlers' do
|
|
121
152
|
event = Slack::RealTime::Event.new(
|
|
@@ -126,71 +157,184 @@ RSpec.describe Slack::RealTime::Client do
|
|
|
126
157
|
expect(client.store.team.name).to eq 'New Team Name Inc.'
|
|
127
158
|
end
|
|
128
159
|
end
|
|
160
|
+
|
|
161
|
+
describe '#run_handlers' do
|
|
162
|
+
context 'when store has no event hooks' do
|
|
163
|
+
before do
|
|
164
|
+
@events = client.store.class.events.dup
|
|
165
|
+
client.store.class.events.clear
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
after do
|
|
169
|
+
client.store.class.events.merge!(@events)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'returns empty array of handlers' do
|
|
173
|
+
expect(client.send(:run_handlers, 'example', {})).to be_empty
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
describe '#start_async' do
|
|
180
|
+
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
181
|
+
|
|
182
|
+
before do
|
|
183
|
+
allow(Slack::RealTime::Socket).to(
|
|
184
|
+
receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
|
|
185
|
+
)
|
|
186
|
+
allow(socket).to receive(:connect!)
|
|
187
|
+
allow(socket).to receive(:start_async)
|
|
188
|
+
client.start_async
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
describe '#run_ping!' do
|
|
192
|
+
it 'sends ping messages when the websocket connection is idle' do
|
|
193
|
+
allow(socket).to receive(:time_since_last_message).and_return(30)
|
|
194
|
+
expect(socket).to receive(:send_data).with('{"type":"ping","id":1}')
|
|
195
|
+
client.run_ping!
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it 'reconnects the websocket if it has been idle for too long' do
|
|
199
|
+
allow(socket).to receive(:time_since_last_message).and_return(75)
|
|
200
|
+
allow(socket).to receive(:connected?).and_return(true)
|
|
201
|
+
expect(socket).to receive(:close)
|
|
202
|
+
expect(socket).to receive(:restart_async)
|
|
203
|
+
client.run_ping!
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
[
|
|
207
|
+
EOFError,
|
|
208
|
+
Errno::ECONNRESET,
|
|
209
|
+
Errno::EPIPE,
|
|
210
|
+
Faraday::ClientError,
|
|
211
|
+
Slack::Web::Api::Errors::SlackError
|
|
212
|
+
].each do |err|
|
|
213
|
+
context "raising #{err}" do
|
|
214
|
+
it 'does not terminate the ping worker' do
|
|
215
|
+
allow(socket).to receive(:time_since_last_message) { raise err }
|
|
216
|
+
expect(socket).not_to receive(:send_data)
|
|
217
|
+
client.run_ping!
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
context 'raising Slack::Web::Api::Errors::SlackError' do
|
|
222
|
+
%w[invalid_auth account_inactive].each do |code|
|
|
223
|
+
context code do
|
|
224
|
+
it 'does not terminate the ping worker' do
|
|
225
|
+
allow(socket).to receive(:time_since_last_message) {
|
|
226
|
+
raise Slack::Web::Api::Errors::SlackError, code
|
|
227
|
+
}
|
|
228
|
+
expect(socket).not_to receive(:send_data)
|
|
229
|
+
expect do
|
|
230
|
+
client.run_ping!
|
|
231
|
+
end.to raise_error Slack::Web::Api::Errors::SlackError, code
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
describe 'to_s' do
|
|
240
|
+
it 'defaults to class instance' do
|
|
241
|
+
expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
|
|
242
|
+
end
|
|
129
243
|
end
|
|
130
244
|
end
|
|
245
|
+
|
|
131
246
|
context 'client with starter store', vcr: { cassette_name: 'web/rtm_connect' } do
|
|
132
|
-
let(:client) {
|
|
133
|
-
let(:url) { 'wss://
|
|
247
|
+
let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Starter) }
|
|
248
|
+
let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
|
|
249
|
+
|
|
134
250
|
describe '#start!' do
|
|
135
251
|
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
252
|
+
|
|
136
253
|
before do
|
|
137
|
-
allow(Slack::RealTime::Socket).to
|
|
254
|
+
allow(Slack::RealTime::Socket).to(
|
|
255
|
+
receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
|
|
256
|
+
)
|
|
138
257
|
allow(socket).to receive(:connect!)
|
|
139
258
|
allow(socket).to receive(:start_sync)
|
|
140
259
|
client.start!
|
|
141
260
|
end
|
|
261
|
+
|
|
142
262
|
describe 'properties provided upon connection' do
|
|
143
263
|
it 'sets url' do
|
|
144
264
|
expect(client.url).to eq url
|
|
145
265
|
end
|
|
266
|
+
|
|
146
267
|
it 'sets team' do
|
|
147
268
|
expect(client.team.domain).to eq 'dblockdotorg'
|
|
148
269
|
end
|
|
270
|
+
|
|
149
271
|
it 'sets self' do
|
|
150
|
-
expect(client.self.id).to eq '
|
|
272
|
+
expect(client.self.id).to eq 'U0J1GAHN1'
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
it 'no teams' do
|
|
276
|
+
expect(client.teams).to be_nil
|
|
151
277
|
end
|
|
278
|
+
|
|
152
279
|
it 'no users' do
|
|
153
280
|
expect(client.users).to be_nil
|
|
154
281
|
end
|
|
155
|
-
|
|
156
|
-
|
|
282
|
+
|
|
283
|
+
it 'no bots' do
|
|
284
|
+
expect(client.bots).to be_nil
|
|
157
285
|
end
|
|
158
|
-
|
|
159
|
-
|
|
286
|
+
|
|
287
|
+
it 'no public channels' do
|
|
288
|
+
expect(client.public_channels).to be_nil
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it 'no private channels' do
|
|
292
|
+
expect(client.private_channels).to be_nil
|
|
160
293
|
end
|
|
294
|
+
|
|
161
295
|
it 'no ims' do
|
|
162
296
|
expect(client.ims).to be_nil
|
|
163
297
|
end
|
|
164
|
-
|
|
165
|
-
|
|
298
|
+
|
|
299
|
+
it 'no mpims' do
|
|
300
|
+
expect(client.mpims).to be_nil
|
|
166
301
|
end
|
|
167
|
-
|
|
168
|
-
|
|
302
|
+
|
|
303
|
+
it 'includes team name in to_s' do
|
|
304
|
+
expect(client.to_s).to eq(
|
|
305
|
+
"id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
|
|
306
|
+
)
|
|
169
307
|
end
|
|
170
308
|
end
|
|
309
|
+
|
|
171
310
|
it 'uses web client to fetch url' do
|
|
172
311
|
expect(client.web_client).to be_a Slack::Web::Client
|
|
173
312
|
end
|
|
313
|
+
|
|
174
314
|
it 'remembers socket' do
|
|
175
|
-
expect(client.instance_variable_get(
|
|
315
|
+
expect(client.instance_variable_get(:@socket)).to eq socket
|
|
176
316
|
end
|
|
317
|
+
|
|
177
318
|
it 'cannot be invoked twice' do
|
|
178
319
|
expect do
|
|
179
320
|
client.start!
|
|
180
321
|
end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
|
|
181
322
|
end
|
|
323
|
+
|
|
182
324
|
describe '#stop!' do
|
|
183
325
|
before do
|
|
184
|
-
|
|
326
|
+
allow(socket).to receive(:disconnect!)
|
|
185
327
|
client.stop!
|
|
186
328
|
end
|
|
329
|
+
|
|
187
330
|
it 'cannot be invoked twice' do
|
|
188
|
-
client.instance_variable_set(
|
|
331
|
+
client.instance_variable_set(:@socket, nil) # caused by a :close callback
|
|
189
332
|
expect do
|
|
190
333
|
client.stop!
|
|
191
334
|
end.to raise_error Slack::RealTime::Client::ClientNotStartedError
|
|
192
335
|
end
|
|
193
336
|
end
|
|
337
|
+
|
|
194
338
|
describe '#next_id' do
|
|
195
339
|
it 'increments' do
|
|
196
340
|
previous_id = client.send(:next_id)
|
|
@@ -199,96 +343,151 @@ RSpec.describe Slack::RealTime::Client do
|
|
|
199
343
|
end
|
|
200
344
|
end
|
|
201
345
|
end
|
|
346
|
+
|
|
202
347
|
context 'client with nil store', vcr: { cassette_name: 'web/rtm_connect' } do
|
|
203
|
-
let(:client) {
|
|
348
|
+
let(:client) { described_class.new(store_class: nil) }
|
|
204
349
|
let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
|
|
350
|
+
|
|
205
351
|
it 'sets store to nil' do
|
|
206
|
-
expect(client.store).to
|
|
352
|
+
expect(client.store).to be_nil
|
|
207
353
|
end
|
|
354
|
+
|
|
208
355
|
it "doesn't handle events" do
|
|
209
356
|
event = Slack::RealTime::Event.new(
|
|
210
357
|
'type' => 'team_rename',
|
|
211
358
|
'name' => 'New Team Name Inc.'
|
|
212
359
|
)
|
|
213
|
-
expect(client).
|
|
360
|
+
expect(client).not_to receive(:run_handlers)
|
|
214
361
|
client.send(:dispatch, event)
|
|
215
362
|
end
|
|
363
|
+
|
|
216
364
|
it 'self' do
|
|
217
|
-
expect(client.self).to
|
|
365
|
+
expect(client.self).to be_nil
|
|
218
366
|
end
|
|
367
|
+
|
|
219
368
|
it 'team' do
|
|
220
|
-
expect(client.team).to
|
|
369
|
+
expect(client.team).to be_nil
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
describe 'to_s' do
|
|
373
|
+
it 'defaults to class instance' do
|
|
374
|
+
expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
|
|
375
|
+
end
|
|
221
376
|
end
|
|
222
377
|
end
|
|
378
|
+
|
|
223
379
|
context 'client with defaults' do
|
|
224
|
-
let(:client) {
|
|
380
|
+
let(:client) { described_class.new }
|
|
381
|
+
|
|
225
382
|
describe '#initialize' do
|
|
226
383
|
it 'sets ping' do
|
|
227
384
|
expect(client.websocket_ping).to eq 30
|
|
228
385
|
end
|
|
386
|
+
|
|
229
387
|
it "doesn't set proxy" do
|
|
230
|
-
expect(client.websocket_proxy).to
|
|
388
|
+
expect(client.websocket_proxy).to be_nil
|
|
231
389
|
end
|
|
390
|
+
|
|
232
391
|
it 'defaults logger' do
|
|
233
392
|
expect(client.send(:logger)).to be_a ::Logger
|
|
234
393
|
end
|
|
394
|
+
|
|
235
395
|
it 'sets default store_class' do
|
|
236
|
-
expect(client.send(:store_class)).to eq Slack::RealTime::
|
|
396
|
+
expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Starter
|
|
237
397
|
end
|
|
238
|
-
|
|
398
|
+
|
|
399
|
+
(Slack::RealTime::Config::ATTRIBUTES - %i[logger store_class token]).each do |key|
|
|
239
400
|
it "sets #{key}" do
|
|
240
401
|
expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
|
|
241
402
|
end
|
|
242
403
|
end
|
|
243
404
|
end
|
|
405
|
+
|
|
406
|
+
describe '#run_ping?' do
|
|
407
|
+
it 'returns true when websocket_ping is greater than 0' do
|
|
408
|
+
client.websocket_ping = 30
|
|
409
|
+
expect(client.run_ping?).to be true
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
it 'returns false when websocket_ping is less than 1' do
|
|
413
|
+
client.websocket_ping = 0
|
|
414
|
+
expect(client.run_ping?).to be false
|
|
415
|
+
client.websocket_ping = nil
|
|
416
|
+
expect(client.run_ping?).to be false
|
|
417
|
+
end
|
|
418
|
+
end
|
|
244
419
|
end
|
|
420
|
+
|
|
245
421
|
context 'with custom settings' do
|
|
246
422
|
describe '#initialize' do
|
|
247
423
|
Slack::RealTime::Config::ATTRIBUTES.each do |key|
|
|
248
|
-
context key do
|
|
249
|
-
let(:client) {
|
|
424
|
+
context key.to_s do
|
|
425
|
+
let(:client) { described_class.new(key => 'custom') }
|
|
426
|
+
|
|
250
427
|
it "sets #{key}" do
|
|
251
|
-
expect(client.send(key)).
|
|
428
|
+
expect(client.send(key)).not_to eq Slack::RealTime::Config.send(key)
|
|
252
429
|
expect(client.send(key)).to eq 'custom'
|
|
253
430
|
end
|
|
254
431
|
end
|
|
255
432
|
end
|
|
256
433
|
end
|
|
434
|
+
|
|
435
|
+
describe 'logger accessor' do
|
|
436
|
+
let(:client) { described_class.new }
|
|
437
|
+
|
|
438
|
+
it 'exposes public logger' do
|
|
439
|
+
expect(client.logger).to be_a(::Logger)
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
it 'exposes public logger=' do
|
|
443
|
+
expect { client.logger = nil }.not_to raise_error(NoMethodError)
|
|
444
|
+
end
|
|
445
|
+
end
|
|
257
446
|
end
|
|
447
|
+
|
|
258
448
|
context 'global config' do
|
|
259
449
|
after do
|
|
260
|
-
|
|
450
|
+
described_class.config.reset
|
|
261
451
|
end
|
|
262
|
-
|
|
263
|
-
let(:
|
|
452
|
+
|
|
453
|
+
let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
|
|
454
|
+
let(:client) { described_class.new }
|
|
455
|
+
|
|
264
456
|
context 'ping' do
|
|
265
457
|
before do
|
|
266
|
-
|
|
458
|
+
described_class.configure do |config|
|
|
267
459
|
config.websocket_ping = 15
|
|
268
460
|
end
|
|
269
461
|
end
|
|
462
|
+
|
|
270
463
|
describe '#initialize' do
|
|
271
464
|
it 'sets ping' do
|
|
272
465
|
expect(client.websocket_ping).to eq 15
|
|
273
466
|
end
|
|
274
|
-
|
|
275
|
-
|
|
467
|
+
|
|
468
|
+
it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_connect' } do
|
|
469
|
+
expect(Slack::RealTime::Concurrency::Mock::WebSocket).to(
|
|
470
|
+
receive(:new).with(url, nil, { ping: 15 }).and_return(ws)
|
|
471
|
+
)
|
|
276
472
|
client.start!
|
|
277
473
|
end
|
|
474
|
+
|
|
278
475
|
it 'sets start_options' do
|
|
279
476
|
expect(client.start_options).to eq(request: { timeout: 180 })
|
|
280
477
|
end
|
|
281
478
|
end
|
|
282
479
|
end
|
|
480
|
+
|
|
283
481
|
context 'proxy' do
|
|
284
482
|
before do
|
|
285
|
-
|
|
483
|
+
described_class.configure do |config|
|
|
286
484
|
config.websocket_proxy = {
|
|
287
485
|
origin: 'http://username:password@proxy.example.com',
|
|
288
486
|
headers: { 'User-Agent' => 'ruby' }
|
|
289
487
|
}
|
|
290
488
|
end
|
|
291
489
|
end
|
|
490
|
+
|
|
292
491
|
describe '#initialize' do
|
|
293
492
|
it 'sets proxy' do
|
|
294
493
|
expect(client.websocket_proxy).to eq(
|
|
@@ -296,66 +495,82 @@ RSpec.describe Slack::RealTime::Client do
|
|
|
296
495
|
headers: { 'User-Agent' => 'ruby' }
|
|
297
496
|
)
|
|
298
497
|
end
|
|
299
|
-
|
|
498
|
+
|
|
499
|
+
it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_connect' } do
|
|
300
500
|
expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
|
|
301
501
|
url,
|
|
302
502
|
nil,
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
503
|
+
{
|
|
504
|
+
ping: 30,
|
|
505
|
+
proxy: {
|
|
506
|
+
origin: 'http://username:password@proxy.example.com',
|
|
507
|
+
headers: { 'User-Agent' => 'ruby' }
|
|
508
|
+
}
|
|
307
509
|
}
|
|
308
510
|
).and_return(ws)
|
|
309
511
|
client.start!
|
|
310
512
|
end
|
|
311
513
|
end
|
|
312
514
|
end
|
|
515
|
+
|
|
313
516
|
context 'start_options' do
|
|
314
517
|
before do
|
|
315
|
-
|
|
316
|
-
config.start_options = {
|
|
518
|
+
described_class.configure do |config|
|
|
519
|
+
config.start_options = { presence_sub: true }
|
|
317
520
|
end
|
|
318
521
|
end
|
|
522
|
+
|
|
319
523
|
describe '#initialize' do
|
|
320
524
|
it 'sets start_options' do
|
|
321
|
-
expect(client.start_options).to eq(
|
|
525
|
+
expect(client.start_options).to eq(presence_sub: true)
|
|
322
526
|
end
|
|
527
|
+
|
|
323
528
|
context 'start!' do
|
|
324
529
|
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
530
|
+
|
|
325
531
|
before do
|
|
326
532
|
allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
|
|
327
533
|
allow(socket).to receive(:connect!)
|
|
328
534
|
allow(socket).to receive(:start_sync)
|
|
329
535
|
end
|
|
330
|
-
|
|
331
|
-
|
|
536
|
+
|
|
537
|
+
it 'calls rtm.connect with start options', vcr: { cassette_name: 'web/rtm_connect' } do
|
|
538
|
+
expect(client.web_client).to(
|
|
539
|
+
receive(:rtm_connect).with({ presence_sub: true }).and_call_original
|
|
540
|
+
)
|
|
332
541
|
client.start!
|
|
333
542
|
end
|
|
334
543
|
end
|
|
335
544
|
end
|
|
336
545
|
end
|
|
546
|
+
|
|
337
547
|
context 'store_class' do
|
|
338
|
-
context '
|
|
548
|
+
context 'when configured with Starter class' do
|
|
339
549
|
before do
|
|
340
|
-
|
|
550
|
+
described_class.configure do |config|
|
|
341
551
|
config.store_class = Slack::RealTime::Stores::Starter
|
|
342
552
|
end
|
|
343
553
|
end
|
|
554
|
+
|
|
344
555
|
describe '#initialize' do
|
|
345
|
-
it 'can
|
|
346
|
-
client =
|
|
347
|
-
expect(client.send(:store_class)).to eq Slack::RealTime::Store
|
|
556
|
+
it 'can override the configured store class' do
|
|
557
|
+
client = described_class.new(store_class: Slack::RealTime::Stores::Store)
|
|
558
|
+
expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Store
|
|
348
559
|
end
|
|
560
|
+
|
|
349
561
|
it 'sets store_class' do
|
|
350
562
|
expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter)
|
|
351
563
|
end
|
|
564
|
+
|
|
352
565
|
context 'start!' do
|
|
353
566
|
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
567
|
+
|
|
354
568
|
before do
|
|
355
569
|
allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
|
|
356
570
|
allow(socket).to receive(:connect!)
|
|
357
571
|
allow(socket).to receive(:start_sync)
|
|
358
572
|
end
|
|
573
|
+
|
|
359
574
|
it 'instantiates the correct store class', vcr: { cassette_name: 'web/rtm_connect' } do
|
|
360
575
|
client.start!
|
|
361
576
|
expect(client.store).to be_a Slack::RealTime::Stores::Starter
|
|
@@ -363,63 +578,6 @@ RSpec.describe Slack::RealTime::Client do
|
|
|
363
578
|
end
|
|
364
579
|
end
|
|
365
580
|
end
|
|
366
|
-
context 'store' do
|
|
367
|
-
before do
|
|
368
|
-
Slack::RealTime::Client.configure do |config|
|
|
369
|
-
config.store_class = Slack::RealTime::Stores::Store
|
|
370
|
-
end
|
|
371
|
-
end
|
|
372
|
-
describe '#initialize' do
|
|
373
|
-
context 'start!' do
|
|
374
|
-
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
375
|
-
before do
|
|
376
|
-
allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
|
|
377
|
-
allow(socket).to receive(:connect!)
|
|
378
|
-
allow(socket).to receive(:start_sync)
|
|
379
|
-
end
|
|
380
|
-
it 'calls rtm_start and not rtm_connect', vcr: { cassette_name: 'web/rtm_start' } do
|
|
381
|
-
expect(client.web_client).to receive(:rtm_start).and_call_original
|
|
382
|
-
client.start!
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
end
|
|
386
|
-
end
|
|
387
|
-
end
|
|
388
|
-
context 'start_method' do
|
|
389
|
-
describe '#initialize' do
|
|
390
|
-
it 'can be overriden explicitly' do
|
|
391
|
-
client = Slack::RealTime::Client.new(start_method: :overriden)
|
|
392
|
-
expect(client.send(:start_method)).to eq :overriden
|
|
393
|
-
end
|
|
394
|
-
context 'with start_method' do
|
|
395
|
-
before do
|
|
396
|
-
Slack::RealTime::Client.configure do |config|
|
|
397
|
-
config.start_method = :overriden
|
|
398
|
-
end
|
|
399
|
-
end
|
|
400
|
-
it 'sets start_method' do
|
|
401
|
-
expect(client.send(:start_method)).to eq :overriden
|
|
402
|
-
end
|
|
403
|
-
it 'calls the overriden method' do
|
|
404
|
-
expect(client.web_client).to receive(:overriden).and_raise('overriden')
|
|
405
|
-
expect do
|
|
406
|
-
client.start!
|
|
407
|
-
end.to raise_error RuntimeError, 'overriden'
|
|
408
|
-
end
|
|
409
|
-
end
|
|
410
|
-
context 'start!' do
|
|
411
|
-
let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
|
|
412
|
-
before do
|
|
413
|
-
allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
|
|
414
|
-
allow(socket).to receive(:connect!)
|
|
415
|
-
allow(socket).to receive(:start_sync)
|
|
416
|
-
end
|
|
417
|
-
it 'defaults to :rtm_start when using full store', vcr: { cassette_name: 'web/rtm_start' } do
|
|
418
|
-
expect(client.web_client).to receive(:rtm_start).and_call_original
|
|
419
|
-
client.start!
|
|
420
|
-
end
|
|
421
|
-
end
|
|
422
|
-
end
|
|
423
581
|
end
|
|
424
582
|
end
|
|
425
583
|
end
|