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)