spec/bot_spec.rb in twitter_ebooks-3.0.9 vs spec/bot_spec.rb in twitter_ebooks-3.1.0
- old
+ new
@@ -22,20 +22,29 @@
end
end
module Ebooks::Test
# Generates a random twitter id
- def twitter_id
- (rand*10**18).to_i
+ # Or a non-random one, given a string.
+ def twitter_id(seed = nil)
+ if seed.nil?
+ (rand*10**18).to_i
+ else
+ id = 1
+ seed.downcase.each_byte do |byte|
+ id *= byte/10
+ end
+ id
+ end
end
# Creates a mock direct message
# @param username User sending the DM
# @param text DM content
def mock_dm(username, text)
Twitter::DirectMessage.new(id: twitter_id,
- sender: { id: twitter_id, screen_name: username},
+ sender: { id: twitter_id(username), screen_name: username},
text: text)
end
# Creates a mock tweet
# @param username User sending the tweet
@@ -43,11 +52,11 @@
def mock_tweet(username, text, extra={})
mentions = text.split.find_all { |x| x.start_with?('@') }
tweet = Twitter::Tweet.new({
id: twitter_id,
in_reply_to_status_id: 'mock-link',
- user: { id: twitter_id, screen_name: username },
+ user: { id: twitter_id(username), screen_name: username },
text: text,
created_at: Time.now.to_s,
entities: {
user_mentions: mentions.map { |m|
{ screen_name: m.split('@')[1],
@@ -56,18 +65,25 @@
}
}.merge!(extra))
tweet
end
+ # Creates a mock user
+ def mock_user(username)
+ Twitter::User.new(id: twitter_id(username), screen_name: username)
+ end
+
def twitter_spy(bot)
twitter = spy("twitter")
allow(twitter).to receive(:update).and_return(mock_tweet(bot.username, "test tweet"))
+ allow(twitter).to receive(:user).with(no_args).and_return(mock_user(bot.username))
twitter
end
def simulate(bot, &b)
bot.twitter = twitter_spy(bot)
+ bot.update_myself # Usually called in prepare
b.call
end
def expect_direct_message(bot, content)
expect(bot.twitter).to have_received(:create_direct_message).with(anything(), content, {})
@@ -93,20 +109,42 @@
bot.receive_event(mock_dm("m1sp", "this is a dm"))
expect_direct_message(bot, "echo: this is a dm")
end
end
+ it "ignores its own dms" do
+ simulate(bot) do
+ expect(bot).to_not receive(:on_message)
+ bot.receive_event(mock_dm("Test_Ebooks", "why am I talking to myself"))
+ end
+ end
+
it "responds to mentions" do
simulate(bot) do
bot.receive_event(mock_tweet("m1sp", "@test_ebooks this is a mention"))
expect_tweet(bot, "@m1sp echo: this is a mention")
end
end
+ it "ignores its own mentions" do
+ simulate(bot) do
+ expect(bot).to_not receive(:on_mention)
+ expect(bot).to_not receive(:on_timeline)
+ bot.receive_event(mock_tweet("Test_Ebooks", "@m1sp i think that @test_ebooks is best bot"))
+ end
+ end
+
it "responds to timeline tweets" do
simulate(bot) do
bot.receive_event(mock_tweet("m1sp", "some excellent tweet"))
expect_tweet(bot, "@m1sp fine tweet good sir")
+ end
+ end
+
+ it "ignores its own timeline tweets" do
+ simulate(bot) do
+ expect(bot).to_not receive(:on_timeline)
+ bot.receive_event(mock_tweet("Test_Ebooks", "pudding is cute"))
end
end
it "links tweets to conversations correctly" do
tweet1 = mock_tweet("m1sp", "tweet 1", id: 1, in_reply_to_status_id: nil)