From b1900399acd3a45346427d528be25a64aa406f9f Mon Sep 17 00:00:00 2001 From: joerg-seitz Date: Mon, 6 Mar 2017 09:14:26 +0100 Subject: [PATCH] 22 RSpec-Tests, twittercontent displayed in the content-area --- Gemfile | 1 + Gemfile.lock | 3 +- app/controllers/islands_controller.rb | 6 +++- app/services/twitter_service.rb | 45 ++++++++++++--------------- app/views/layouts/_tweet.html.erb | 11 +++++++ app/views/layouts/application.slim | 1 + spec/fixtures/testconfig.yml | 4 +++ spec/helpers/twitter_helper.rb | 0 spec/services/twitter_service_spec.rb | 45 ++++++++++++++++++++++++--- 9 files changed, 84 insertions(+), 32 deletions(-) create mode 100644 app/views/layouts/_tweet.html.erb create mode 100644 spec/fixtures/testconfig.yml create mode 100644 spec/helpers/twitter_helper.rb diff --git a/Gemfile b/Gemfile index ffff7fc..c13d621 100644 --- a/Gemfile +++ b/Gemfile @@ -13,6 +13,7 @@ gem 'rails', '~> 5.0.0', '>= 5.0.0.1' gem 'sass-rails' gem 'slim' gem 'twitter' +gem 'simplecov' group :test do gem 'codecov', require: false diff --git a/Gemfile.lock b/Gemfile.lock index c0388e8..1d5ca23 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -262,6 +262,7 @@ DEPENDENCIES rspec-rails rubocop sass-rails + simplecov slim spring spring-watcher-listen (~> 2.0.0) @@ -269,4 +270,4 @@ DEPENDENCIES web-console BUNDLED WITH - 1.14.3 + 1.14.6 diff --git a/app/controllers/islands_controller.rb b/app/controllers/islands_controller.rb index 60205da..daf7a1e 100644 --- a/app/controllers/islands_controller.rb +++ b/app/controllers/islands_controller.rb @@ -1,3 +1,7 @@ class IslandsController < ApplicationController - def index; end + def index + twitter = TwitterService.new + @trend_names = twitter.trend_names + @tweets = twitter.search_tweets('', 5, 'puppy', 'cute') + end end diff --git a/app/services/twitter_service.rb b/app/services/twitter_service.rb index 6d0cd81..92c734b 100644 --- a/app/services/twitter_service.rb +++ b/app/services/twitter_service.rb @@ -1,12 +1,9 @@ - require 'twitter' - +APP_CONFIG = YAML.load(File.read('config/settings/development.yml')) + .with_indifferent_access class TwitterService - APP_CONFIG = YAML.load(File.read('config/settings/development.yml')) - .with_indifferent_access - def initialize - @client = Twitter::REST::Client.new do |config| + @twitter = Twitter::REST::Client.new do |config| config.consumer_key = APP_CONFIG['consumer_key'] config.consumer_secret = APP_CONFIG['consumer_secret'] config.access_token = APP_CONFIG['access_token'] @@ -14,35 +11,33 @@ def initialize end end - def tweets_from_user_that_contain(user, number_of_posts = 5, *tags) - @client.search("from:#{user} #{make_hashtags(tags)}", result_type: 'recent') - .take(number_of_posts) - .each do |tweet| - puts tweet.text - end + def search_tweets(user = '', number_of_posts = 5, *tags) + @twitter.search("#{user} #{make_hashtags(tags)}", result_type: 'recent') + .take(number_of_posts) end - def tweets_containing(*tags) - tweets = @client.search(make_hashtags(tags), - result_type: 'recent', - language: 'en') - tweets.attrs[:statuses].each do |tweet| - puts "#{tweet[:user][:name]}: #{tweet[:text]}" - end - end - - def list_trend_names - @client.trends.attrs[:trends].each do |trend| - puts trend[:name] + def trend_names + names = [] + trends.attrs[:trends].each do |trend| + names << trend[:name] end + names end private + def trends # returns Twitter::Trendresults + @twitter.trends + end + def make_hashtags(tags) # takes an array of words hashtags = [] tags.each do |tag| - hashtags << '#' + tag + hashtags << if tag[0] == '#' + tag + else + '#' + tag + end end hashtags.join(', ') end diff --git a/app/views/layouts/_tweet.html.erb b/app/views/layouts/_tweet.html.erb new file mode 100644 index 0000000..3fc9443 --- /dev/null +++ b/app/views/layouts/_tweet.html.erb @@ -0,0 +1,11 @@ +

Wow there is content on this island!

+ +<% @tweets.each do |tweet| %> +

<%= tweet.user.name %>

Show source tweet +

<%= tweet.text %>

+ +<% tweet.media.each do |item| %> + +<% end %> +
+<% end %> diff --git a/app/views/layouts/application.slim b/app/views/layouts/application.slim index 903ee72..c42dd3a 100644 --- a/app/views/layouts/application.slim +++ b/app/views/layouts/application.slim @@ -8,5 +8,6 @@ html = render 'layouts/nav' main<> == yield + = render "layouts/tweet" = render 'layouts/footer' = javascript_include_tag 'application' diff --git a/spec/fixtures/testconfig.yml b/spec/fixtures/testconfig.yml new file mode 100644 index 0000000..b506bf0 --- /dev/null +++ b/spec/fixtures/testconfig.yml @@ -0,0 +1,4 @@ +consumer_key: consumer_key +consumer_secret: consumer_secret +access_token: consumer_secret +access_token_secret: access_token_secret diff --git a/spec/helpers/twitter_helper.rb b/spec/helpers/twitter_helper.rb new file mode 100644 index 0000000..e69de29 diff --git a/spec/services/twitter_service_spec.rb b/spec/services/twitter_service_spec.rb index 65dd1ab..3ca9dca 100644 --- a/spec/services/twitter_service_spec.rb +++ b/spec/services/twitter_service_spec.rb @@ -1,13 +1,48 @@ require 'pry' require 'rails_helper' +require 'twitter' describe 'TwitterService' do - let(:APP_CONFIG) { {"consumer_key"=>"con_key", - "consumer_secret"=>"con_secret", - "access_token"=>"access_tk", - "access_token_secret"=>"access_secret_tk"}} - let(:service) { TwitterService.new} + let(:service) do + TwitterService.new do |config| + config.consumer_key = APP_CONFIG['consumer_key'] + config.consumer_secret = APP_CONFIG['consumer_secret'] + config.access_token = APP_CONFIG['access_token'] + config.access_token_secret = APP_CONFIG['access_token_secret'] + end + end + context '#initialize' do # pointless test + it 'creates a new TwitterService with given parameters' do + expect(service.class).to eq(TwitterService) + end + end + context '#trend_names' do + it 'returns the trend names' do + trend_results = Twitter::TrendResults.new(trends: + [{ name: 'Foo', + url: 'http://foo.baz/', + promoted_content: nil, + query: '1', + tweet_volume: 1 }, + { name: 'Bar', + url: 'http://bar.baz/', + promoted_content: nil, + query: '1', + tweet_volume: 1 }]) + allow(service).to receive(:trends).and_return(trend_results) + expect(service.trend_names).to eq %w(Foo Bar) + end + end + context 'search_tweets' do + it 'returns a given number of tweets containing specific words ' do + expect(service.search_tweets('', 5, 'puppy', 'cute').first.class) + .to eq(Twitter::Tweet) + expect(service.search_tweets('', 5, 'puppy', 'cute').count).to eq(5) + expect(service.search_tweets('', 5, 'puppy', 'cute').first.text) + .to include('puppy') + end + end end