slack-ruby-client 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/update_api.yml +1 -1
  3. data/.rubocop_todo.yml +43 -13
  4. data/CHANGELOG.md +12 -0
  5. data/CONTRIBUTING.md +7 -7
  6. data/Gemfile +1 -0
  7. data/README.md +46 -28
  8. data/bin/commands/admin_conversations.rb +21 -0
  9. data/bin/commands/admin_users_session.rb +1 -1
  10. data/bin/commands/admin_workflows.rb +3 -1
  11. data/bin/commands/admin_workflows_triggers_types_permissions.rb +4 -4
  12. data/bin/commands/assistant_threads.rb +45 -0
  13. data/bin/commands/bookmarks.rb +1 -0
  14. data/bin/commands/canvases.rb +4 -4
  15. data/bin/commands/canvases_access.rb +3 -3
  16. data/bin/commands/chat.rb +7 -3
  17. data/bin/commands/conversations.rb +5 -5
  18. data/bin/commands/conversations_canvases.rb +2 -2
  19. data/bin/commands/conversations_requestSharedInvite.rb +48 -0
  20. data/bin/commands/files.rb +2 -1
  21. data/bin/commands/usergroups.rb +5 -0
  22. data/bin/commands/usergroups_users.rb +2 -0
  23. data/examples/files_upload_v2/.env.example +1 -0
  24. data/examples/files_upload_v2/Gemfile +5 -0
  25. data/examples/files_upload_v2/README.md +13 -0
  26. data/examples/files_upload_v2/files_upload_v2.rb +37 -0
  27. data/examples/oauth_v2/.env.example +4 -0
  28. data/examples/oauth_v2/Gemfile +7 -0
  29. data/examples/oauth_v2/README.md +33 -0
  30. data/examples/oauth_v2/oauth_v2.rb +60 -0
  31. data/lib/slack/messages/formatting.rb +1 -1
  32. data/lib/slack/version.rb +1 -1
  33. data/lib/slack/web/api/endpoints/admin_conversations.rb +35 -0
  34. data/lib/slack/web/api/endpoints/admin_users_session.rb +2 -3
  35. data/lib/slack/web/api/endpoints/admin_workflows.rb +5 -1
  36. data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +2 -2
  37. data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
  38. data/lib/slack/web/api/endpoints/bookmarks.rb +2 -0
  39. data/lib/slack/web/api/endpoints/canvases.rb +2 -2
  40. data/lib/slack/web/api/endpoints/canvases_access.rb +4 -4
  41. data/lib/slack/web/api/endpoints/chat.rb +12 -3
  42. data/lib/slack/web/api/endpoints/conversations.rb +4 -4
  43. data/lib/slack/web/api/endpoints/conversations_canvases.rb +1 -1
  44. data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
  45. data/lib/slack/web/api/endpoints/files.rb +3 -1
  46. data/lib/slack/web/api/endpoints/usergroups.rb +10 -0
  47. data/lib/slack/web/api/endpoints/usergroups_users.rb +4 -0
  48. data/lib/slack/web/api/endpoints.rb +4 -0
  49. data/lib/slack/web/api/errors.rb +48 -4
  50. data/lib/slack/web/api/helpers/files.rb +87 -0
  51. data/lib/slack/web/api/helpers.rb +13 -0
  52. data/lib/slack/web/api/templates/method_spec.erb +4 -3
  53. data/lib/slack/web/client.rb +1 -0
  54. data/lib/slack/web/faraday/connection.rb +13 -26
  55. data/lib/slack/web/faraday/options.rb +24 -0
  56. data/lib/slack/web/faraday/request.rb +2 -1
  57. data/lib/slack-ruby-client.rb +2 -0
  58. data/slack-ruby-client.gemspec +2 -1
  59. metadata +32 -154
  60. data/screenshots/create-app.png +0 -0
  61. data/spec/fixtures/slack/web/429_error.yml +0 -81
  62. data/spec/fixtures/slack/web/auth_test_error.yml +0 -81
  63. data/spec/fixtures/slack/web/auth_test_success.yml +0 -81
  64. data/spec/fixtures/slack/web/conversations_info.yml +0 -167
  65. data/spec/fixtures/slack/web/conversations_setTopic.yml +0 -84
  66. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +0 -172
  67. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +0 -253
  68. data/spec/fixtures/slack/web/paginated_users_list.yml +0 -613
  69. data/spec/fixtures/slack/web/rtm_connect.yml +0 -391
  70. data/spec/fixtures/slack/web/users_info.yml +0 -214
  71. data/spec/fixtures/slack/web/users_list.yml +0 -133
  72. data/spec/fixtures/slack/web/views_open_error.yml +0 -83
  73. data/spec/integration/integration_spec.rb +0 -207
  74. data/spec/slack/config_spec.rb +0 -16
  75. data/spec/slack/events/config_spec.rb +0 -35
  76. data/spec/slack/events/request_spec.rb +0 -199
  77. data/spec/slack/messages/formatting_spec.rb +0 -156
  78. data/spec/slack/real_time/api/message_spec.rb +0 -20
  79. data/spec/slack/real_time/api/ping_spec.rb +0 -17
  80. data/spec/slack/real_time/api/typing_spec.rb +0 -19
  81. data/spec/slack/real_time/client_spec.rb +0 -601
  82. data/spec/slack/real_time/concurrency/clients/async_spec.rb +0 -16
  83. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -21
  84. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +0 -10
  85. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +0 -10
  86. data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -47
  87. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -16
  88. data/spec/slack/real_time/event_handlers/im_spec.rb +0 -51
  89. data/spec/slack/real_time/event_handlers/private_channel_spec.rb +0 -99
  90. data/spec/slack/real_time/event_handlers/public_channel_spec.rb +0 -123
  91. data/spec/slack/real_time/event_handlers/team_spec.rb +0 -63
  92. data/spec/slack/real_time/event_handlers/user_spec.rb +0 -65
  93. data/spec/slack/real_time/rtm_connect_spec.rb +0 -14
  94. data/spec/slack/real_time/stores/store_spec.rb +0 -50
  95. data/spec/slack/slack_spec.rb +0 -93
  96. data/spec/slack/version_spec.rb +0 -8
  97. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +0 -13
  98. data/spec/slack/web/api/endpoints/admin_apps_activities_spec.rb +0 -8
  99. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +0 -8
  100. data/spec/slack/web/api/endpoints/admin_apps_config_spec.rb +0 -18
  101. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +0 -13
  102. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +0 -8
  103. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +0 -18
  104. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +0 -8
  105. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +0 -35
  106. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +0 -38
  107. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +0 -8
  108. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +0 -32
  109. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +0 -133
  110. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +0 -37
  111. data/spec/slack/web/api/endpoints/admin_functions_permissions_spec.rb +0 -21
  112. data/spec/slack/web/api/endpoints/admin_functions_spec.rb +0 -13
  113. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +0 -8
  114. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +0 -8
  115. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +0 -18
  116. data/spec/slack/web/api/endpoints/admin_roles_spec.rb +0 -30
  117. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +0 -13
  118. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +0 -13
  119. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +0 -53
  120. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +0 -16
  121. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +0 -37
  122. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +0 -41
  123. data/spec/slack/web/api/endpoints/admin_users_spec.rb +0 -67
  124. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +0 -8
  125. data/spec/slack/web/api/endpoints/admin_workflows_collaborators_spec.rb +0 -24
  126. data/spec/slack/web/api/endpoints/admin_workflows_permissions_spec.rb +0 -13
  127. data/spec/slack/web/api/endpoints/admin_workflows_spec.rb +0 -13
  128. data/spec/slack/web/api/endpoints/admin_workflows_triggers_types_permissions_spec.rb +0 -21
  129. data/spec/slack/web/api/endpoints/api_spec.rb +0 -8
  130. data/spec/slack/web/api/endpoints/apps_activities_spec.rb +0 -13
  131. data/spec/slack/web/api/endpoints/apps_auth_external_spec.rb +0 -13
  132. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +0 -8
  133. data/spec/slack/web/api/endpoints/apps_datastore_spec.rb +0 -74
  134. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +0 -13
  135. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +0 -44
  136. data/spec/slack/web/api/endpoints/apps_spec.rb +0 -16
  137. data/spec/slack/web/api/endpoints/auth_spec.rb +0 -8
  138. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +0 -8
  139. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +0 -40
  140. data/spec/slack/web/api/endpoints/bots_spec.rb +0 -8
  141. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +0 -24
  142. data/spec/slack/web/api/endpoints/calls_spec.rb +0 -31
  143. data/spec/slack/web/api/endpoints/canvases_access_spec.rb +0 -21
  144. data/spec/slack/web/api/endpoints/canvases_sections_spec.rb +0 -16
  145. data/spec/slack/web/api/endpoints/canvases_spec.rb +0 -21
  146. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +0 -8
  147. data/spec/slack/web/api/endpoints/chat_spec.rb +0 -134
  148. data/spec/slack/web/api/endpoints/conversations_canvases_spec.rb +0 -13
  149. data/spec/slack/web/api/endpoints/conversations_externalInvitePermissions_spec.rb +0 -19
  150. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -8
  151. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -27
  152. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -206
  153. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +0 -13
  154. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -40
  155. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -38
  156. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +0 -112
  157. data/spec/slack/web/api/endpoints/dialog_spec.rb +0 -14
  158. data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -18
  159. data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -8
  160. data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -16
  161. data/spec/slack/web/api/endpoints/files_remote_spec.rb +0 -24
  162. data/spec/slack/web/api/endpoints/files_spec.rb +0 -57
  163. data/spec/slack/web/api/endpoints/functions_distributions_permissions_spec.rb +0 -10
  164. data/spec/slack/web/api/endpoints/functions_spec.rb +0 -28
  165. data/spec/slack/web/api/endpoints/functions_workflows_steps_responses_spec.rb +0 -13
  166. data/spec/slack/web/api/endpoints/functions_workflows_steps_spec.rb +0 -13
  167. data/spec/slack/web/api/endpoints/migration_spec.rb +0 -13
  168. data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -8
  169. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +0 -16
  170. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +0 -8
  171. data/spec/slack/web/api/endpoints/pins_spec.rb +0 -23
  172. data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -24
  173. data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -31
  174. data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -8
  175. data/spec/slack/web/api/endpoints/search_spec.rb +0 -23
  176. data/spec/slack/web/api/endpoints/stars_spec.rb +0 -8
  177. data/spec/slack/web/api/endpoints/team_billing_spec.rb +0 -8
  178. data/spec/slack/web/api/endpoints/team_externalTeams_spec.rb +0 -13
  179. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +0 -8
  180. data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -8
  181. data/spec/slack/web/api/endpoints/team_spec.rb +0 -8
  182. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +0 -13
  183. data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -28
  184. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -21
  185. data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -18
  186. data/spec/slack/web/api/endpoints/users_discoverableContacts_spec.rb +0 -13
  187. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -8
  188. data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -14
  189. data/spec/slack/web/api/endpoints/users_spec.rb +0 -8
  190. data/spec/slack/web/api/endpoints/views_spec.rb +0 -65
  191. data/spec/slack/web/api/endpoints/workflows_spec.rb +0 -34
  192. data/spec/slack/web/api/endpoints/workflows_triggers_permissions_spec.rb +0 -31
  193. data/spec/slack/web/api/error_spec.rb +0 -14
  194. data/spec/slack/web/api/errors/slack_error_spec.rb +0 -33
  195. data/spec/slack/web/api/mixins/conversations_list_spec.rb +0 -21
  196. data/spec/slack/web/api/mixins/conversations_spec.rb +0 -45
  197. data/spec/slack/web/api/mixins/users_spec.rb +0 -52
  198. data/spec/slack/web/api/options_spec.rb +0 -69
  199. data/spec/slack/web/api/pagination/cursor_spec.rb +0 -102
  200. data/spec/slack/web/client_spec.rb +0 -359
  201. data/spec/slack/web/faraday/request_spec.rb +0 -80
  202. data/spec/slack/web/faraday/response/raise_error_spec.rb +0 -86
  203. data/spec/spec_helper.rb +0 -30
  204. data/spec/support/queue_with_timeout.rb +0 -35
  205. data/spec/support/real_time/concurrency/mock.rb +0 -31
  206. data/spec/support/real_time/connected_client.rb +0 -21
  207. data/spec/support/real_time/event.rb +0 -12
  208. data/spec/support/real_time/loaded_client.rb +0 -120
  209. data/spec/support/token.rb +0 -11
  210. data/spec/support/vcr.rb +0 -45
@@ -1,199 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe Slack::Events::Request do
5
- subject(:request) do
6
- described_class.new(http_request)
7
- end
8
-
9
- before do
10
- Slack::Events.configure do |config|
11
- config.signing_secret = signing_secret
12
- config.signature_expires_in = 30
13
- end
14
- end
15
-
16
- let(:signing_secret) { 'ade6ca762ade4db0e7d31484cd616b9c' }
17
- let(:signature) { 'v0=91177eea054d65de0fc0f9b4ec57714307bc0ce2c5f3bf0d28b1b720c8f92ba2' }
18
- let(:timestamp) { '1547933148' }
19
- let(:body) do
20
- '{"token":"X34FAqCu8tmGEkEEpoDncnja","challenge":' \
21
- '"P7sFXA4o3HV2hTx4zb4zcQ9yrvuQs8pDh6EacOxmMRj0tJaXfQFF","type":"url_verification"}'
22
- end
23
- let(:http_request) do
24
- request_double = double(
25
- body: StringIO.new(body)
26
- )
27
-
28
- allow(request_double).to receive(:get_header).with('HTTP_X_SLACK_REQUEST_TIMESTAMP') { timestamp }
29
- allow(request_double).to receive(:get_header).with('HTTP_X_SLACK_SIGNATURE') { signature }
30
-
31
- request_double
32
- end
33
-
34
- after do
35
- Slack::Events.config.reset
36
- end
37
-
38
- it 'reads http request' do
39
- expect(request.signature).to eq signature
40
- expect(request.body).to eq body
41
- expect(request.timestamp).to eq timestamp
42
- expect(request.version).to eq 'v0'
43
- end
44
-
45
- it 'rewinds the request body after reading it' do
46
- expect(request.body).to eq body
47
- expect(http_request.body.read).to eq body
48
- end
49
-
50
- context 'with an already read body' do
51
- before do
52
- http_request.body.read
53
- end
54
-
55
- it 'rewinds the request body before reading it' do
56
- expect(request.body).to eq body
57
- expect(http_request.body.read).to eq body
58
- end
59
- end
60
-
61
- context 'time' do
62
- after do
63
- Timecop.return
64
- end
65
-
66
- context 'with an invalid signature' do
67
- let(:signature) { 'v0=invalid' }
68
-
69
- before do
70
- Timecop.freeze(Time.at(timestamp.to_i))
71
- end
72
-
73
- it 'is invalid but not expired' do
74
- expect(request).not_to be_valid
75
- expect(request).not_to be_expired
76
- end
77
- end
78
-
79
- context 'with an invalid body' do
80
- let(:body) { 'invalid' }
81
-
82
- before do
83
- Timecop.freeze(Time.at(timestamp.to_i))
84
- end
85
-
86
- it 'is invalid but not expired' do
87
- expect(request).not_to be_valid
88
- expect(request).not_to be_expired
89
- end
90
- end
91
-
92
- context 'with an invalid signing secret' do
93
- before do
94
- Slack::Events.configure do |config|
95
- config.signing_secret = 'invalid'
96
- end
97
- Timecop.freeze(Time.at(timestamp.to_i))
98
- end
99
-
100
- it 'is invalid but not expired' do
101
- expect(request).not_to be_valid
102
- expect(request).not_to be_expired
103
- end
104
- end
105
-
106
- context 'within time window' do
107
- before do
108
- Timecop.freeze(Time.at(timestamp.to_i) + Slack::Events.config.signature_expires_in - 1)
109
- end
110
-
111
- it 'is valid' do
112
- expect(request).to be_valid
113
- expect(request).not_to be_expired
114
- end
115
-
116
- it 'does not raise an error and returns true' do
117
- expect(request.verify!).to be true
118
- end
119
- end
120
-
121
- context 'after time window' do
122
- before do
123
- Timecop.freeze(Time.at(timestamp.to_i) + Slack::Events.config.signature_expires_in + 1)
124
- end
125
-
126
- it 'is valid but expired' do
127
- expect(request).to be_valid
128
- expect(request).to be_expired
129
- end
130
-
131
- it 'raises an error on verify!' do
132
- expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
133
- end
134
- end
135
-
136
- context 'before time but within window' do
137
- before do
138
- Timecop.freeze(Time.at(timestamp.to_i) - Slack::Events.config.signature_expires_in + 1)
139
- end
140
-
141
- it 'is valid and not expired' do
142
- expect(request).to be_valid
143
- expect(request).not_to be_expired
144
- end
145
-
146
- it 'does not raise an error on verify!' do
147
- expect(request.verify!).to be true
148
- end
149
- end
150
-
151
- context 'before time window' do
152
- before do
153
- Timecop.freeze(Time.at(timestamp.to_i) - Slack::Events.config.signature_expires_in - 1)
154
- end
155
-
156
- it 'is valid but expired' do
157
- expect(request).to be_valid
158
- expect(request).to be_expired
159
- end
160
-
161
- it 'raises an error on verify!' do
162
- expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
163
- end
164
- end
165
- end
166
-
167
- context 'without global config' do
168
- before do
169
- Slack::Events.config.reset
170
- end
171
-
172
- context 'without a signing secret parameter' do
173
- subject(:request) do
174
- described_class.new(http_request)
175
- end
176
-
177
- it 'raises MissingSigningSecret' do
178
- expect { request.valid? }.to raise_error Slack::Events::Request::MissingSigningSecret
179
- end
180
- end
181
-
182
- context 'with a signing secret parameter' do
183
- subject(:request) do
184
- described_class.new(http_request,
185
- signing_secret: signing_secret,
186
- signature_expires_in: 30)
187
- end
188
-
189
- before do
190
- Timecop.freeze(Time.at(timestamp.to_i))
191
- end
192
-
193
- it 'is valid and not expired' do
194
- expect(request).to be_valid
195
- expect(request).not_to be_expired
196
- end
197
- end
198
- end
199
- end
@@ -1,156 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- describe Slack::Messages::Formatting do
5
- subject(:formatting) do
6
- described_class
7
- end
8
-
9
- context '#unescape' do
10
- it 'plain text' do
11
- expect(formatting.unescape('plain text')).to eq 'plain text'
12
- end
13
-
14
- it 'decodes an HTML-encoded message' do
15
- expect(formatting.unescape('Hello &amp; &lt;world&gt;')).to eq 'Hello & <world>'
16
- end
17
-
18
- it 'unescapes a user reference' do
19
- expect(formatting.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to(
20
- eq('Hey @bob, did you see my file?')
21
- )
22
- end
23
-
24
- it 'unescapes a user reference without a name' do
25
- expect(formatting.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
26
- end
27
-
28
- it 'unescapes a URL without text' do
29
- expect(formatting.unescape('This message contains a URL <http://foo.com/>')).to(
30
- eq('This message contains a URL http://foo.com/')
31
- )
32
- end
33
-
34
- it 'unescapes a URL with text' do
35
- expect(formatting.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to(
36
- eq('So does this one: www.foo.com')
37
- )
38
- end
39
-
40
- it 'removes mailto' do
41
- expect(formatting.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
42
- end
43
-
44
- it 'unlinkifies references' do
45
- expect(
46
- formatting.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')
47
- ).to(
48
- eq('Hello @bob, say hi to @everyone in #general')
49
- )
50
- end
51
-
52
- it 'can handle a lone &gt;' do
53
- expect(formatting.unescape('Hello <@U123|bob> &gt; file.txt')).to eq 'Hello @bob > file.txt'
54
- end
55
-
56
- it 'unescapes a double smart quote' do
57
- expect(formatting.unescape('“hello”')).to eq '"hello"'
58
- end
59
-
60
- it 'unescapes a single smart quote' do
61
- expect(formatting.unescape('‘hello’')).to eq "'hello'"
62
- end
63
- end
64
-
65
- context '#escape' do
66
- it 'plain text' do
67
- expect(formatting.escape('plain text')).to eq 'plain text'
68
- end
69
-
70
- it 'escapes a message' do
71
- expect(formatting.escape('Hello & <world>')).to eq 'Hello &amp; &lt;world&gt;'
72
- end
73
- end
74
-
75
- context '#date' do
76
- let(:timestamp) { -2955646679 }
77
- let(:time) { Time.at(timestamp) }
78
- let(:custom_format) { '{date_short}' }
79
- let(:optional_link) { 'https://www.timeanddate.com/worldclock/fixedtime.html?year=1876&month=5&day=4&hour=03&min=02&sec=01' }
80
- let(:fallback_text) { 'a long, long time ago' }
81
-
82
- it 'formats a timestamp' do
83
- expect(formatting.date(time)).to eq "<!date^#{timestamp}^{date_num} {time_secs}|#{time}>"
84
- end
85
-
86
- it 'can use custom format' do
87
- expect(formatting.date(time, format: custom_format)).to eq "<!date^#{timestamp}^#{custom_format}|#{time}>"
88
- end
89
-
90
- it 'can add a custom link' do
91
- expect(formatting.date(time,
92
- link: optional_link)).to eq "<!date^#{timestamp}^{date_num} {time_secs}^#{optional_link}|#{time}>"
93
- end
94
-
95
- it 'can add custom fallback text' do
96
- expect(formatting.date(time, text: fallback_text)).to eq "<!date^#{timestamp}^{date_num} {time_secs}|#{fallback_text}>"
97
- end
98
- end
99
-
100
- context '#channel_link' do
101
- let(:channel_id) { 'C0000000001' }
102
-
103
- it 'links to a channel by its ID' do
104
- expect(formatting.channel_link(channel_id)).to eq "<##{channel_id}>"
105
- end
106
- end
107
-
108
- context '#user_link' do
109
- let(:user_id) { 'U0000000001' }
110
-
111
- it 'links to a user by its ID' do
112
- expect(formatting.user_link(user_id)).to eq "<@#{user_id}>"
113
- end
114
- end
115
-
116
- context '#url_link' do
117
- let(:text) { 'super cool website' }
118
- let(:url) { 'https://theuselessweb.site/' }
119
-
120
- it 'formats a URL with custom link text' do
121
- expect(formatting.url_link(text, url)).to eq "<#{url}|#{text}>"
122
- end
123
- end
124
-
125
- context '#markdown' do
126
- it 'formats markdown bold' do
127
- expect(formatting.markdown('**Le bold**')).to eq '*Le bold*'
128
- end
129
-
130
- it 'formats markdown italic' do
131
- expect(formatting.markdown("*L'italic*")).to eq "_L'italic_"
132
- end
133
-
134
- it 'formats markdown bold and italic' do
135
- expect(formatting.markdown('***Le bold italic***')).to eq '*_Le bold italic_*'
136
- end
137
-
138
- it 'formats markdown strikethrough' do
139
- expect(formatting.markdown('~~Le strikethrough~~')).to eq '~Le strikethrough~'
140
- end
141
-
142
- it 'formats markdown links' do
143
- expect(formatting.markdown('[Le link](https://theuselessweb.site)')).to eq '<https://theuselessweb.site|Le link>'
144
- end
145
-
146
- it 'formats nested markdown' do
147
- expect(formatting.markdown('**[Le **bold and ~~struckout with *italic*~~** link](https://theuselessweb.site)**')).to(
148
- eq '*<https://theuselessweb.site|Le *bold and ~struckout with _italic_~* link>*'
149
- )
150
- end
151
-
152
- it "doesn't format other markdown" do
153
- expect(formatting.markdown('## A heading\n_Italics_\n`code`')).to eq '## A heading\n_Italics_\n`code`'
154
- end
155
- end
156
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
5
- include_context 'connected client'
6
-
7
- describe '#message' do
8
- before do
9
- allow(client).to receive(:next_id).and_return(42)
10
- end
11
-
12
- it 'sends message' do
13
- expect(socket).to(
14
- receive(:send_data)
15
- .with({ type: 'message', id: 42, text: 'hello world', channel: 'channel' }.to_json)
16
- )
17
- client.message(text: 'hello world', channel: 'channel')
18
- end
19
- end
20
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
5
- include_context 'connected client'
6
-
7
- describe '#ping' do
8
- before do
9
- allow(client).to receive(:next_id).and_return(42)
10
- end
11
-
12
- it 'sends message' do
13
- expect(socket).to receive(:send_data).with({ type: 'ping', id: 42 }.to_json)
14
- client.ping
15
- end
16
- end
17
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
5
- include_context 'connected client'
6
-
7
- describe '#typing' do
8
- before do
9
- allow(client).to receive(:next_id).and_return(42)
10
- end
11
-
12
- it 'sends a typing indicator' do
13
- expect(socket).to(
14
- receive(:send_data).with({ type: 'typing', id: 42, channel: 'channel' }.to_json)
15
- )
16
- client.typing(channel: 'channel')
17
- end
18
- end
19
- end