From b2b03d2679edd88b4ad81f6e6839371ab3d72784 Mon Sep 17 00:00:00 2001 From: Allan Klaus Date: Sun, 4 Oct 2020 09:41:14 -0300 Subject: [PATCH] Improve Service::Tumblr - Fix rubocop styles - Improve specs coverage --- app/models/services/tumblr.rb | 116 ++++++++++++++-------------- spec/models/services/tumblr_spec.rb | 29 +++++-- 2 files changed, 82 insertions(+), 63 deletions(-) diff --git a/app/models/services/tumblr.rb b/app/models/services/tumblr.rb index 59f93ef79..c45ce3b1e 100644 --- a/app/models/services/tumblr.rb +++ b/app/models/services/tumblr.rb @@ -1,69 +1,71 @@ # frozen_string_literal: true -class Services::Tumblr < Service - MAX_CHARACTERS = 1000 +module Services + class Tumblr < Service + MAX_CHARACTERS = 1000 - def provider - "tumblr" - end - - def consumer_key - AppConfig.services.tumblr.key - end - - def consumer_secret - AppConfig.services.tumblr.secret - end - - def post(post, url='') - body = build_tumblr_post(post, url) - user_info = JSON.parse(client.get("/v2/user/info").body) - blogs = user_info["response"]["user"]["blogs"] - primaryblog = blogs.find {|blog| blog["primary"] } || blogs[0] - tumblr_ids = {} - - blogurl = URI.parse(primaryblog["url"]) - resp = client.post("/v2/blog/#{blogurl.host}/post", body) - if resp.code == "201" - tumblr_ids[blogurl.host.to_s] = JSON.parse(resp.body)["response"]["id"] + def provider + "tumblr" end - post.tumblr_ids = tumblr_ids.to_json - post.save - end + def post(post, url="") + body = build_tumblr_post(post, url) + user_info = JSON.parse(client.get("/v2/user/info").body) + blogs = user_info["response"]["user"]["blogs"] + primaryblog = blogs.find {|blog| blog["primary"] } || blogs[0] + tumblr_ids = {} - def build_tumblr_post(post, url) - { :type => 'text', :format => "markdown", :body => tumblr_template(post, url) } - end + blogurl = URI.parse(primaryblog["url"]) + tumblr_ids[blogurl.host.to_s] = request_to_external_blog(blogurl, body) - def tumblr_template(post, url) - photo_html = post.photos.map {|photo| - "![photo](#{photo.url(:scaled_full)})\n\n" - }.join - - "#{photo_html}#{post.message.html(mentioned_people: [])}\n\n[original post](#{url})" - end - - def post_opts(post) - {tumblr_ids: post.tumblr_ids} if post.tumblr_ids.present? - end - - def delete_from_service(opts) - logger.debug "event=delete_from_service type=tumblr sender_id=#{user_id} tumblr_ids=#{opts[:tumblr_ids]}" - tumblr_posts = JSON.parse(opts[:tumblr_ids]) - tumblr_posts.each do |blog_name, post_id| - delete_from_tumblr(blog_name, post_id) + post.tumblr_ids = tumblr_ids.to_json + post.save end - end - def delete_from_tumblr(blog_name, service_post_id) - client.post("/v2/blog/#{blog_name}/post/delete", "id" => service_post_id) - end + def post_opts(post) + {tumblr_ids: post.tumblr_ids} if post.tumblr_ids.present? + end - private - def client - @consumer ||= OAuth::Consumer.new(consumer_key, consumer_secret, :site => 'http://api.tumblr.com') - @client ||= OAuth::AccessToken.new(@consumer, self.access_token, self.access_secret) + def delete_from_service(opts) + logger.debug "event=delete_from_service type=tumblr sender_id=#{user_id} tumblr_ids=#{opts[:tumblr_ids]}" + tumblr_posts = JSON.parse(opts[:tumblr_ids]) + tumblr_posts.each do |blog_name, post_id| + delete_from_tumblr(blog_name, post_id) + end + end + + def build_tumblr_post(post, url) + {type: "text", format: "markdown", body: tumblr_template(post, url)} + end + + private + + def client + @consumer ||= OAuth::Consumer.new(consumer_key, consumer_secret, site: "http://api.tumblr.com") + @client ||= OAuth::AccessToken.new(@consumer, access_token, access_secret) + end + + def tumblr_template(post, url) + photo_html = post.photos.map {|photo| "![photo](#{photo.url(:scaled_full)})\n\n" }.join + + "#{photo_html}#{post.message.html(mentioned_people: [])}\n\n[original post](#{url})" + end + + def delete_from_tumblr(blog_name, service_post_id) + client.post("/v2/blog/#{blog_name}/post/delete", "id" => service_post_id) + end + + def request_to_external_blog(blogurl, body) + resp = client.post("/v2/blog/#{blogurl.host}/post", body) + JSON.parse(resp.body)["response"]["id"] if resp.code == "201" + end + + def consumer_key + AppConfig.services.tumblr.key + end + + def consumer_secret + AppConfig.services.tumblr.secret + end end end - diff --git a/spec/models/services/tumblr_spec.rb b/spec/models/services/tumblr_spec.rb index 0da20eb37..16cafb481 100644 --- a/spec/models/services/tumblr_spec.rb +++ b/spec/models/services/tumblr_spec.rb @@ -6,6 +6,16 @@ describe Services::Tumblr, type: :model do let(:service) { Services::Tumblr.new(access_token: "yeah", access_secret: "foobar") } let(:post_id) { "bla" } + describe "#provider" do + subject(:provider) { service.provider } + + let(:expected_provider) { "tumblr" } + + it "returns service provider" do + is_expected.to eq expected_provider + end + end + describe "#post" do let(:post_request) { {body: service.build_tumblr_post(post, "")} } let(:post_response) { {status: 201, body: {response: {id: post_id}}.to_json} } @@ -16,12 +26,19 @@ describe Services::Tumblr, type: :model do end context "with multiple blogs" do - let(:user_info) { - {response: {user: {blogs: [ - {primary: false, url: "http://foo.tumblr.com"}, - {primary: true, url: "http://bar.tumblr.com"} - ]}}}.to_json - } + let(:user_info) do + { + response: + { + user: { + blogs: [ + {primary: false, url: "http://foo.tumblr.com"}, + {primary: true, url: "http://bar.tumblr.com"} + ] + } + } + }.to_json + end it "posts a status message to the primary blog and stores the id" do stub = stub_request(:post, "http://api.tumblr.com/v2/blog/bar.tumblr.com/post")