Improve Service::Tumblr

- Fix rubocop styles
- Improve specs coverage
This commit is contained in:
Allan Klaus 2020-10-04 09:41:14 -03:00 committed by Benjamin Neff
parent 92a096f03c
commit b2b03d2679
No known key found for this signature in database
GPG key ID: 971464C3F1A90194
2 changed files with 82 additions and 63 deletions

View file

@ -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

View file

@ -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")