slack-ruby-bot 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.rubocop.yml +6 -0
- data/.rubocop_todo.yml +41 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +4 -0
- data/CONTRIBUTING.md +139 -0
- data/DEPLOYMENT.md +25 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +107 -0
- data/LICENSE.md +22 -0
- data/README.md +69 -0
- data/Rakefile +19 -0
- data/examples/minimal/Gemfile +3 -0
- data/examples/minimal/Gemfile.lock +62 -0
- data/examples/minimal/pongbot.rb +14 -0
- data/lib/config/application.rb +14 -0
- data/lib/config/boot.rb +8 -0
- data/lib/config/environment.rb +3 -0
- data/lib/initializers/giphy.rb +3 -0
- data/lib/initializers/slack/request.rb +13 -0
- data/lib/slack-ruby-bot/about.rb +7 -0
- data/lib/slack-ruby-bot/app.rb +83 -0
- data/lib/slack-ruby-bot/commands/about.rb +9 -0
- data/lib/slack-ruby-bot/commands/base.rb +27 -0
- data/lib/slack-ruby-bot/commands/help.rb +9 -0
- data/lib/slack-ruby-bot/commands/hi.rb +9 -0
- data/lib/slack-ruby-bot/commands/unknown.rb +9 -0
- data/lib/slack-ruby-bot/commands.rb +5 -0
- data/lib/slack-ruby-bot/config.rb +13 -0
- data/lib/slack-ruby-bot/fixtures/slack/auth_test.yml +48 -0
- data/lib/slack-ruby-bot/hooks/base.rb +10 -0
- data/lib/slack-ruby-bot/hooks/hello.rb +11 -0
- data/lib/slack-ruby-bot/hooks/message.rb +41 -0
- data/lib/slack-ruby-bot/hooks.rb +3 -0
- data/lib/slack-ruby-bot/rspec/fixtures/slack/auth_test.yml +48 -0
- data/lib/slack-ruby-bot/rspec/support/fixtures/slack/auth_test.yml +103 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/it_behaves_like_a_slack_bot.rb +27 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb +31 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb +19 -0
- data/lib/slack-ruby-bot/rspec/support/slack_api_key.rb +5 -0
- data/lib/slack-ruby-bot/rspec/support/slack_ruby_bot_configure.rb +4 -0
- data/lib/slack-ruby-bot/rspec/support/vcr.rb +8 -0
- data/lib/slack-ruby-bot/rspec.rb +12 -0
- data/lib/slack-ruby-bot/version.rb +3 -0
- data/lib/slack-ruby-bot.rb +20 -0
- data/lib/slack_ruby_bot.rb +1 -0
- data/screenshots/register-bot.png +0 -0
- data/slack-ruby-bot.gemspec +27 -0
- data/spec/slack-ruby-bot/app_spec.rb +8 -0
- data/spec/slack-ruby-bot/commands/about_spec.rb +16 -0
- data/spec/slack-ruby-bot/commands/help_spec.rb +13 -0
- data/spec/slack-ruby-bot/commands/hi_spec.rb +13 -0
- data/spec/slack-ruby-bot/commands/unknown_spec.rb +17 -0
- data/spec/slack-ruby-bot/version_spec.rb +7 -0
- data/spec/spec_helper.rb +1 -0
- metadata +246 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module SlackRubyBot
|
2
|
+
module Commands
|
3
|
+
class Base
|
4
|
+
def self.send_message(channel, text)
|
5
|
+
Slack.chat_postMessage(channel: channel, text: text)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.send_message_with_gif(channel, text, keywords)
|
9
|
+
gif = begin
|
10
|
+
Giphy.random(keywords)
|
11
|
+
rescue StandardError => e
|
12
|
+
logger.warn "Giphy.random: #{e.message}"
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
text = text + "\n" + gif.image_url.to_s if gif
|
16
|
+
send_message channel, text
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.logger
|
20
|
+
@logger ||= begin
|
21
|
+
$stdout.sync = true
|
22
|
+
Logger.new(STDOUT)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://slack.com/api/auth.test
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: token=test
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json; charset=utf-8
|
12
|
+
User-Agent:
|
13
|
+
- Slack Ruby Gem 1.1.6
|
14
|
+
Content-Type:
|
15
|
+
- application/x-www-form-urlencoded
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Access-Control-Allow-Origin:
|
24
|
+
- "*"
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Date:
|
28
|
+
- Thu, 02 Jul 2015 17:55:20 GMT
|
29
|
+
Server:
|
30
|
+
- Apache
|
31
|
+
Strict-Transport-Security:
|
32
|
+
- max-age=31536000; includeSubDomains; preload
|
33
|
+
Vary:
|
34
|
+
- Accept-Encoding
|
35
|
+
X-Content-Type-Options:
|
36
|
+
- nosniff
|
37
|
+
X-Xss-Protection:
|
38
|
+
- '0'
|
39
|
+
Content-Length:
|
40
|
+
- '55'
|
41
|
+
Connection:
|
42
|
+
- keep-alive
|
43
|
+
body:
|
44
|
+
encoding: UTF-8
|
45
|
+
string: '{"ok":false,"error":"invalid_auth"}'
|
46
|
+
http_version:
|
47
|
+
recorded_at: Thu, 02 Jul 2015 17:55:48 GMT
|
48
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SlackRubyBot
|
2
|
+
module Hooks
|
3
|
+
module Message
|
4
|
+
extend Base
|
5
|
+
|
6
|
+
def message(data)
|
7
|
+
data = Hashie::Mash.new(data)
|
8
|
+
bot_name, command, arguments = parse_command(data.text)
|
9
|
+
return unless bot_name == SlackRubyBot.config.user
|
10
|
+
klass = command_to_class(command || 'Default')
|
11
|
+
klass.call data, command, arguments
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def parse_command(text)
|
17
|
+
return unless text
|
18
|
+
text = '= ' + text[1..text.length] if text[0] == '='
|
19
|
+
parts = text.split.reject(&:blank?)
|
20
|
+
if parts && parts[0] == '='
|
21
|
+
parts[0] = SlackRubyBot.config.user
|
22
|
+
parts.insert 1, 'calculate'
|
23
|
+
end
|
24
|
+
[parts.first.downcase, parts[1].try(:downcase), parts[2..parts.length]] if parts && parts.any?
|
25
|
+
end
|
26
|
+
|
27
|
+
def command_classes(include_slack_ruby_bot = false)
|
28
|
+
klasses = SlackRubyBot::Commands::Base.descendants
|
29
|
+
klasses.reject! { |k| k.name.starts_with? 'SlackRubyBot::Commands::' } unless include_slack_ruby_bot
|
30
|
+
klasses
|
31
|
+
end
|
32
|
+
|
33
|
+
def command_to_class(command)
|
34
|
+
# prioritize implementations to built-in classes
|
35
|
+
klass = command_classes.detect { |d| d.name.ends_with? "::#{command.titleize}" }
|
36
|
+
klass ||= command_classes(true).detect { |d| d.name.ends_with? "::#{command.titleize}" }
|
37
|
+
klass || SlackRubyBot::Commands::Unknown
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://slack.com/api/auth.test
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: token=test
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json; charset=utf-8
|
12
|
+
User-Agent:
|
13
|
+
- Slack Ruby Gem 1.1.6
|
14
|
+
Content-Type:
|
15
|
+
- application/x-www-form-urlencoded
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Access-Control-Allow-Origin:
|
24
|
+
- "*"
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Date:
|
28
|
+
- Thu, 02 Jul 2015 17:48:15 GMT
|
29
|
+
Server:
|
30
|
+
- Apache
|
31
|
+
Strict-Transport-Security:
|
32
|
+
- max-age=31536000; includeSubDomains; preload
|
33
|
+
Vary:
|
34
|
+
- Accept-Encoding
|
35
|
+
X-Content-Type-Options:
|
36
|
+
- nosniff
|
37
|
+
X-Xss-Protection:
|
38
|
+
- '0'
|
39
|
+
Content-Length:
|
40
|
+
- '55'
|
41
|
+
Connection:
|
42
|
+
- keep-alive
|
43
|
+
body:
|
44
|
+
encoding: UTF-8
|
45
|
+
string: '{"ok":false,"error":"invalid_auth"}'
|
46
|
+
http_version:
|
47
|
+
recorded_at: Thu, 02 Jul 2015 17:48:42 GMT
|
48
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,103 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://slack.com/api/auth.test
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: token=token
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json; charset=utf-8
|
12
|
+
User-Agent:
|
13
|
+
- Slack Ruby Gem 1.1.1
|
14
|
+
Content-Type:
|
15
|
+
- application/x-www-form-urlencoded
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Access-Control-Allow-Origin:
|
24
|
+
- '*'
|
25
|
+
Cache-Control:
|
26
|
+
- private, no-cache, no-store, must-revalidate
|
27
|
+
Content-Type:
|
28
|
+
- application/json; charset=utf-8
|
29
|
+
Date:
|
30
|
+
- Tue, 28 Apr 2015 12:55:23 GMT
|
31
|
+
Expires:
|
32
|
+
- Mon, 26 Jul 1997 05:00:00 GMT
|
33
|
+
Pragma:
|
34
|
+
- no-cache
|
35
|
+
Server:
|
36
|
+
- Apache
|
37
|
+
Strict-Transport-Security:
|
38
|
+
- max-age=31536000; includeSubDomains; preload
|
39
|
+
Vary:
|
40
|
+
- Accept-Encoding
|
41
|
+
X-Accepted-Oauth-Scopes:
|
42
|
+
- identify
|
43
|
+
X-Content-Type-Options:
|
44
|
+
- nosniff
|
45
|
+
X-Oauth-Scopes:
|
46
|
+
- identify,read,post,client
|
47
|
+
X-Xss-Protection:
|
48
|
+
- '0'
|
49
|
+
Content-Length:
|
50
|
+
- '128'
|
51
|
+
Connection:
|
52
|
+
- keep-alive
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: '{"ok":true,"url":"https:\/\/rubybot.slack.com\/","team":"team","user":"user","team_id":"TDEADBEEF","user_id":"UBAADFOOD"}'
|
56
|
+
http_version:
|
57
|
+
recorded_at: Tue, 28 Apr 2015 12:55:22 GMT
|
58
|
+
- request:
|
59
|
+
method: post
|
60
|
+
uri: https://slack.com/api/rtm.start
|
61
|
+
body:
|
62
|
+
encoding: UTF-8
|
63
|
+
string: token=token
|
64
|
+
headers:
|
65
|
+
Accept:
|
66
|
+
- application/json; charset=utf-8
|
67
|
+
User-Agent:
|
68
|
+
- Slack Ruby Gem 1.1.1
|
69
|
+
Content-Type:
|
70
|
+
- application/x-www-form-urlencoded
|
71
|
+
Accept-Encoding:
|
72
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
73
|
+
response:
|
74
|
+
status:
|
75
|
+
code: 200
|
76
|
+
message: OK
|
77
|
+
headers:
|
78
|
+
Access-Control-Allow-Origin:
|
79
|
+
- '*'
|
80
|
+
Content-Type:
|
81
|
+
- application/json; charset=utf-8
|
82
|
+
Date:
|
83
|
+
- Tue, 28 Apr 2015 21:41:33 GMT
|
84
|
+
Server:
|
85
|
+
- Apache
|
86
|
+
Strict-Transport-Security:
|
87
|
+
- max-age=31536000; includeSubDomains; preload
|
88
|
+
Vary:
|
89
|
+
- Accept-Encoding
|
90
|
+
X-Content-Type-Options:
|
91
|
+
- nosniff
|
92
|
+
X-Xss-Protection:
|
93
|
+
- '0'
|
94
|
+
Content-Length:
|
95
|
+
- '55'
|
96
|
+
Connection:
|
97
|
+
- keep-alive
|
98
|
+
body:
|
99
|
+
encoding: UTF-8
|
100
|
+
string: '{"ok":false,"error":"invalid_auth"}'
|
101
|
+
http_version:
|
102
|
+
recorded_at: Tue, 28 Apr 2015 21:41:33 GMT
|
103
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,27 @@
|
|
1
|
+
shared_examples 'a slack ruby bot' do
|
2
|
+
context 'not configured' do
|
3
|
+
before do
|
4
|
+
@slack_api_token = ENV.delete('SLACK_API_TOKEN')
|
5
|
+
end
|
6
|
+
after do
|
7
|
+
ENV['SLACK_API_TOKEN'] = @slack_api_token
|
8
|
+
end
|
9
|
+
it 'requires SLACK_API_TOKEN' do
|
10
|
+
expect { subject }.to raise_error RuntimeError, "Missing ENV['SLACK_API_TOKEN']."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
context 'configured', vcr: { cassette_name: 'auth_test' } do
|
14
|
+
context 'run' do
|
15
|
+
before do
|
16
|
+
subject.send(:auth!)
|
17
|
+
end
|
18
|
+
it 'succeeds auth' do
|
19
|
+
expect(subject.config.url).to eq 'https://rubybot.slack.com/'
|
20
|
+
expect(subject.config.team).to eq 'team'
|
21
|
+
expect(subject.config.user).to eq 'user'
|
22
|
+
expect(subject.config.team_id).to eq 'TDEADBEEF'
|
23
|
+
expect(subject.config.user_id).to eq 'UBAADFOOD'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :respond_with_error do |expected|
|
4
|
+
match do |actual|
|
5
|
+
channel, user, message = parse(actual)
|
6
|
+
app = SlackRubyBot::App.new
|
7
|
+
SlackRubyBot.config.user = 'rubybot'
|
8
|
+
allow(Giphy).to receive(:random)
|
9
|
+
begin
|
10
|
+
expect do
|
11
|
+
app.send(:message, text: message, channel: channel, user: user)
|
12
|
+
end.to raise_error ArgumentError, expected
|
13
|
+
rescue RSpec::Expectations::ExpectationNotMetError => e
|
14
|
+
@error_message = e.message
|
15
|
+
raise e
|
16
|
+
end
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
failure_message do |actual|
|
21
|
+
_, _, message = parse(actual)
|
22
|
+
@error_message || "expected for '#{message}' to fail with '#{expected}'"
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def parse(actual)
|
28
|
+
actual = { message: actual } unless actual.is_a?(Hash)
|
29
|
+
[actual[:channel] || 'channel', actual[:user] || 'user', actual[:message]]
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :respond_with_slack_message do |expected|
|
4
|
+
match do |actual|
|
5
|
+
channel, user, message = parse(actual)
|
6
|
+
SlackRubyBot.config.user ||= 'rubybot'
|
7
|
+
allow(Giphy).to receive(:random)
|
8
|
+
expect(SlackRubyBot::Commands::Base).to receive(:send_message).with(channel, expected)
|
9
|
+
app.send(:message, text: message, channel: channel, user: user)
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def parse(actual)
|
16
|
+
actual = { message: actual } unless actual.is_a?(Hash)
|
17
|
+
[actual[:channel] || 'channel', actual[:user] || 'user', actual[:message]]
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rspec'
|
5
|
+
require 'rack/test'
|
6
|
+
|
7
|
+
require 'config/environment'
|
8
|
+
require 'slack-ruby-bot'
|
9
|
+
|
10
|
+
Dir[File.join(File.dirname(__FILE__), 'rspec/support', '**/*.rb')].each do |file|
|
11
|
+
require file
|
12
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path('../config/environment', __FILE__)
|
2
|
+
|
3
|
+
require 'slack-ruby-bot/version'
|
4
|
+
require 'slack-ruby-bot/about'
|
5
|
+
require 'slack-ruby-bot/config'
|
6
|
+
require 'slack-ruby-bot/hooks'
|
7
|
+
require 'slack-ruby-bot/commands'
|
8
|
+
require 'slack-ruby-bot/app'
|
9
|
+
|
10
|
+
module SlackRubyBot
|
11
|
+
class << self
|
12
|
+
def configure
|
13
|
+
block_given? ? yield(Config) : Config
|
14
|
+
end
|
15
|
+
|
16
|
+
def config
|
17
|
+
Config
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'slack-ruby-bot'
|
Binary file
|
@@ -0,0 +1,27 @@
|
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
2
|
+
require 'slack-ruby-bot/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'slack-ruby-bot'
|
6
|
+
s.version = SlackRubyBot::VERSION
|
7
|
+
s.authors = ['Daniel Doubrovkine']
|
8
|
+
s.email = 'dblock@dblock.org'
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.required_rubygems_version = '>= 1.3.6'
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
13
|
+
s.require_paths = ['lib']
|
14
|
+
s.homepage = 'http://github.com/dblock/slack-ruby-bot'
|
15
|
+
s.licenses = ['MIT']
|
16
|
+
s.summary = 'Generic bot framework written in Ruby.'
|
17
|
+
s.add_dependency 'hashie'
|
18
|
+
s.add_dependency 'slack-api', '~> 1.1.6'
|
19
|
+
s.add_dependency 'activesupport'
|
20
|
+
s.add_dependency 'giphy', '~> 2.0.2'
|
21
|
+
s.add_development_dependency 'rake'
|
22
|
+
s.add_development_dependency 'rspec'
|
23
|
+
s.add_development_dependency 'rack-test'
|
24
|
+
s.add_development_dependency 'vcr'
|
25
|
+
s.add_development_dependency 'webmock'
|
26
|
+
s.add_development_dependency 'rubocop', '0.32.1'
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SlackRubyBot::Commands::Default do
|
4
|
+
def app
|
5
|
+
SlackRubyBot::App.new
|
6
|
+
end
|
7
|
+
before do
|
8
|
+
app.config.user = 'rubybot'
|
9
|
+
end
|
10
|
+
it 'rubybot' do
|
11
|
+
expect(message: 'rubybot').to respond_with_slack_message(SlackRubyBot::ABOUT)
|
12
|
+
end
|
13
|
+
it 'Rubybot' do
|
14
|
+
expect(message: 'Rubybot').to respond_with_slack_message(SlackRubyBot::ABOUT)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SlackRubyBot::Commands::Help do
|
4
|
+
def app
|
5
|
+
SlackRubyBot::App.new
|
6
|
+
end
|
7
|
+
before do
|
8
|
+
app.config.user = 'rubybot'
|
9
|
+
end
|
10
|
+
it 'help' do
|
11
|
+
expect(message: 'rubybot help').to respond_with_slack_message('See https://github.com/dblock/slack-ruby-bot, please.')
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SlackRubyBot::Commands::Hi do
|
4
|
+
def app
|
5
|
+
SlackRubyBot::App.new
|
6
|
+
end
|
7
|
+
before do
|
8
|
+
app.config.user = 'rubybot'
|
9
|
+
end
|
10
|
+
it 'says hi' do
|
11
|
+
expect(message: 'rubybot hi').to respond_with_slack_message('Hi <@user>!')
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SlackRubyBot::Commands::Unknown, vcr: { cassette_name: 'user_info' } do
|
4
|
+
def app
|
5
|
+
SlackRubyBot::App.new
|
6
|
+
end
|
7
|
+
before do
|
8
|
+
app.config.user = 'rubybot'
|
9
|
+
end
|
10
|
+
it 'invalid command' do
|
11
|
+
expect(message: 'rubybot foobar').to respond_with_slack_message("Sorry <@user>, I don't understand that command!")
|
12
|
+
end
|
13
|
+
it 'does not respond to sad face' do
|
14
|
+
expect(SlackRubyBot::Commands::Base).to_not receive(:send_message)
|
15
|
+
SlackRubyBot::App.new.send(:message, text: ':((')
|
16
|
+
end
|
17
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'slack-ruby-bot/rspec'
|