Skip to content

Commit

Permalink
Merge 346e1ee into fb0b423
Browse files Browse the repository at this point in the history
  • Loading branch information
jvans1 committed Jun 25, 2014
2 parents fb0b423 + 346e1ee commit 45d4a28
Show file tree
Hide file tree
Showing 8 changed files with 160 additions and 62 deletions.
58 changes: 43 additions & 15 deletions app/concerns/twitter_concern.rb
Expand Up @@ -2,40 +2,68 @@ module TwitterConcern
extend ActiveSupport::Concern

included do
validate :validate_twitter_options
end

def validate_twitter_options
unless twitter_consumer_key.present? &&
twitter_consumer_secret.present? &&
twitter_oauth_token.present? &&
twitter_oauth_token_secret.present?
errors.add(:base, "Twitter consumer_key, consumer_secret, oauth_token, and oauth_token_secret are required to authenticate with the Twitter API. You can provide these as options to this Agent, or as Credentials with the same names, but starting with 'twitter_'.")
end
validate :twitter_consumer_key_present
validate :twitter_consumer_secret_present
validate :twitter_oauth_token_present
validate :twitter_oauth_token_secret_present
validate :valid_credentials
end

def twitter_consumer_key
options['consumer_key'].presence || credential('twitter_consumer_key')
@twitter_consumer_key ||= options['consumer_key'].presence || credential('twitter_consumer_key')
end

def twitter_consumer_secret
options['consumer_secret'].presence || credential('twitter_consumer_secret')
@twitter_consumer_secret ||= options['consumer_secret'].presence || credential('twitter_consumer_secret')
end

def twitter_oauth_token
options['oauth_token'].presence || options['access_key'].presence || credential('twitter_oauth_token')
@twitter_oauth_token ||= options['oauth_token'].presence || options['access_key'].presence || credential('twitter_oauth_token')
end

def twitter_oauth_token_secret
options['oauth_token_secret'].presence || options['access_secret'].presence || credential('twitter_oauth_token_secret')
@twitter_oauth_token_secret ||= options['oauth_token_secret'].presence || options['access_secret'].presence || credential('twitter_oauth_token_secret')
end

def twitter
Twitter::REST::Client.new do |config|
@twitter ||= Twitter::REST::Client.new do |config|
config.consumer_key = twitter_consumer_key
config.consumer_secret = twitter_consumer_secret
config.access_token = twitter_oauth_token
config.access_token_secret = twitter_oauth_token_secret
end
end


private
def twitter_consumer_key_present
if twitter_consumer_key.nil?
errors.add(:base, "Consumer Key cannot be blank")
end
end

def twitter_consumer_secret_present
if twitter_consumer_secret.nil?
errors.add(:base, "Consumer secret cannot be blank")
end
end

def twitter_oauth_token_present
if twitter_oauth_token.nil?
errors.add(:base, "Oauth token cannot be blank")
end
end

def twitter_oauth_token_secret_present
if twitter_oauth_token_secret.nil?
errors.add(:base, "Oauth secret cannot be blank")
end
end

def valid_credentials
twitter.verify_credentials.present?
rescue Twitter::Error
errors.add(:base, "Twitter credentials are invalid, a connection could not be established")
false
end
end
1 change: 0 additions & 1 deletion config/initializers/devise.rb
Expand Up @@ -6,7 +6,6 @@
# note that it will be overwritten if you use your own mailer class
# with default "from" parameter.
config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com"

# Configure the class responsible to send e-mails.
# config.mailer = "Devise::Mailer"

Expand Down
57 changes: 57 additions & 0 deletions spec/models/agents/twitter_stream_agent_spec/check_spec.rb
@@ -0,0 +1,57 @@
require 'spec_helper'

describe Agents::TwitterStreamAgent do
before do
@opts = {
:consumer_key => "---",
:consumer_secret => "---",
:oauth_token => "---",
:oauth_token_secret => "---",
:filters => %w[keyword1 keyword2],
:expected_update_period_in_days => "2",
:generate => "events"
}

@agent = Agents::TwitterStreamAgent.new(:name => "HuginnBot", :options => @opts)
@agent.user = users(:bob)
@agent.save!
end

describe '#check' do
context "when generate is set to 'counts'" do
before do
@agent.options[:generate] = 'counts'
@agent.save!
end

it 'emits events' do
@agent.process_tweet('keyword1', {:text => "something", :user => {:name => "Mr. Someone"}})
@agent.process_tweet('keyword2', {:text => "something", :user => {:name => "Mr. Someone"}})
@agent.process_tweet('keyword1', {:text => "something", :user => {:name => "Mr. Someone"}})

lambda {
@agent.reload.check
}.should change { @agent.events.count }.by(2)

@agent.events[-1].payload[:filter].should == 'keyword1'
@agent.events[-1].payload[:count].should == 2

@agent.events[-2].payload[:filter].should == 'keyword2'
@agent.events[-2].payload[:count].should == 1

@agent.memory[:filter_counts].should == {}
end
end

context "when generate is not set to 'counts'" do
it 'does nothing' do
@agent.memory[:filter_counts] = { :keyword1 => 2 }
@agent.save!
lambda {
@agent.reload.check
}.should_not change { Event.count }
@agent.memory[:filter_counts].should == {}
end
end
end
end
27 changes: 27 additions & 0 deletions spec/models/agents/twitter_stream_agent_spec/credentials_spec.rb
@@ -0,0 +1,27 @@
require 'spec_helper'

describe Agents::TwitterStreamAgent do
describe "#valid_credentials" do
let(:stream) { Agents::TwitterStreamAgent.new }
let(:invalid_error_message) { "Twitter credentials are invalid, a connection could not be established" }
let(:user) { User.new }
before do
stream.user = user
end
context "invalid credentials" do
it 'includes invalid credential errors' do
mock.any_instance_of(Twitter::REST::Client).verify_credentials { raise Twitter::Error::Unauthorized.new("invalid") }
stream.valid?
expect(stream.errors.full_messages).to include(invalid_error_message)
end
end

context "valid credentials" do
it 'includes invalid credential errors' do
mock.any_instance_of(Twitter::REST::Client).verify_credentials { true }
stream.valid?
expect(stream.errors.full_messages).to_not include(invalid_error_message)
end
end
end
end
Expand Up @@ -86,42 +86,4 @@
end
end
end

describe '#check' do
context "when generate is set to 'counts'" do
before do
@agent.options[:generate] = 'counts'
@agent.save!
end

it 'emits events' do
@agent.process_tweet('keyword1', {:text => "something", :user => {:name => "Mr. Someone"}})
@agent.process_tweet('keyword2', {:text => "something", :user => {:name => "Mr. Someone"}})
@agent.process_tweet('keyword1', {:text => "something", :user => {:name => "Mr. Someone"}})

lambda {
@agent.reload.check
}.should change { @agent.events.count }.by(2)

@agent.events[-1].payload[:filter].should == 'keyword1'
@agent.events[-1].payload[:count].should == 2

@agent.events[-2].payload[:filter].should == 'keyword2'
@agent.events[-2].payload[:count].should == 1

@agent.memory[:filter_counts].should == {}
end
end

context "when generate is not set to 'counts'" do
it 'does nothing' do
@agent.memory[:filter_counts] = { :keyword1 => 2 }
@agent.save!
lambda {
@agent.reload.check
}.should_not change { Event.count }
@agent.memory[:filter_counts].should == {}
end
end
end
end
12 changes: 4 additions & 8 deletions spec/support/spec_helpers.rb
@@ -1,12 +1,8 @@
module SpecHelpers
def build_events(options = {})
options[:values].map.with_index do |tuple, index|
event = Event.new
event.agent = agents(:bob_weather_agent)
event.payload = (options[:pattern] || {}).dup.merge((options[:keys].zip(tuple)).inject({}) { |memo, (key, value)| memo[key] = value; memo })
event.created_at = (100 - index).hours.ago
event.updated_at = (100 - index).hours.ago
event
def self.included(klass)
klass.class_eval do
include BuildEvents
include TwitterCredentials
end
end
end
14 changes: 14 additions & 0 deletions spec/support/spec_helpers/build_events.rb
@@ -0,0 +1,14 @@
module SpecHelpers
module BuildEvents
def build_events(options = {})
options[:values].map.with_index do |tuple, index|
event = Event.new
event.agent = agents(:bob_weather_agent)
event.payload = (options[:pattern] || {}).dup.merge((options[:keys].zip(tuple)).inject({}) { |memo, (key, value)| memo[key] = value; memo })
event.created_at = (100 - index).hours.ago
event.updated_at = (100 - index).hours.ago
event
end
end
end
end
15 changes: 15 additions & 0 deletions spec/support/spec_helpers/twitter_credentials.rb
@@ -0,0 +1,15 @@
module SpecHelpers
module TwitterCredentials
def self.included(klass)
klass.class_eval do
RSpec.configure do |config|
config.before(:each) do
any_instance_of(Twitter::REST::Client) do |klass|
stub(klass).verify_credentials { 'true' }
end
end
end
end
end
end
end

0 comments on commit 45d4a28

Please sign in to comment.