From 2ace9b47b1de118c5766d780fb4b7f28719668fd Mon Sep 17 00:00:00 2001 From: Vinothan Shankar Date: Sat, 5 Sep 2015 23:21:38 +0100 Subject: [PATCH 1/2] * app/models/services/tumblr.rb (Services::Tumblr#post): Post only to primary blog Hardly a total fix, but it's a start. Based on meitar/diaspora:b5c01598. * app/models/services/tumblr.rb: style: double-quote string Line 22. Change from single-quotes. * app/models/services/tumblr.rb: parse URL only for blogs we care about ...which in this case is just the primary. This also fixes the failed test in 7079fda (and by extension, 7a1d3a9). * spec/models/services/tumblr_spec.rb: Add "primary" flag to test user-info * spec/models/services/tumblr_spec.rb: Add a secondary blog to test user-info This should not cause a request to be issued, so we can continue to expect the request for the primary blog only. Any request for the secondary indicates a bug in the service implementation. * spec/models/services/tumblr_spec.rb: Make the second blog returned the primary Just to catch if it's picking the first one * app/models/services/tumblr.rb: use blogs.find instead of blogs.each Since we're only handling the primary blog, this should be easy enough * app/models/services/tumblr.rb: Remove redundant if block The condition it would have caught is dealt with by the ifnone on the find * app/models/services/tumblr.rb: Style: remove space between { and | --- app/models/services/tumblr.rb | 16 +++++++++------- spec/models/services/tumblr_spec.rb | 8 +++++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/models/services/tumblr.rb b/app/models/services/tumblr.rb index 66dafe78c..3b1abb69e 100644 --- a/app/models/services/tumblr.rb +++ b/app/models/services/tumblr.rb @@ -16,16 +16,18 @@ class Services::Tumblr < Service 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"].map { |blog| URI.parse(blog['url']) } + blogs = user_info["response"]["user"]["blogs"] + primaryblog = blogs.find(blogs[0]) {|blog| blog["primary"] } tumblr_ids = {} - blogs.each do |blog| - resp = client.post("/v2/blog/#{blog.host}/post", body) - if resp.code == "201" - tumblr_ids[blog.host.to_s] = JSON.parse(resp.body)["response"]["id"] - end + + 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"] + end + post.tumblr_ids = tumblr_ids.to_json post.save - end end def build_tumblr_post(post, url) diff --git a/spec/models/services/tumblr_spec.rb b/spec/models/services/tumblr_spec.rb index c6ecb9c3e..263e9c187 100644 --- a/spec/models/services/tumblr_spec.rb +++ b/spec/models/services/tumblr_spec.rb @@ -11,17 +11,19 @@ describe Services::Tumblr, :type => :model do describe '#post' do it 'posts a status message to tumblr and saves the returned ids' do - response = double(body: '{"response": {"user": {"blogs": [{"url": "http://foo.tumblr.com"}]}}}') + response = double(body: '{"response": {"user": {"blogs": + [{"primary": false, "url": "http://foo.tumblr.com"}, + {"primary": true, "url": "http://bar.tumblr.com"}]}}}') expect_any_instance_of(OAuth::AccessToken).to receive(:get) .with("/v2/user/info") .and_return(response) response = double(code: "201", body: '{"response": {"id": "bla"}}') expect_any_instance_of(OAuth::AccessToken).to receive(:post) - .with("/v2/blog/foo.tumblr.com/post", @service.build_tumblr_post(@post, '')) + .with("/v2/blog/bar.tumblr.com/post", @service.build_tumblr_post(@post, "")) .and_return(response) - expect(@post).to receive(:tumblr_ids=).with({"foo.tumblr.com" => "bla"}.to_json) + expect(@post).to receive(:tumblr_ids=).with({"bar.tumblr.com" => "bla"}.to_json) @service.post(@post) end From 0e64d8de2aaaf50f4f8de07ac307b165062eb24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Mon, 7 Sep 2015 13:20:27 +0200 Subject: [PATCH 2/2] Refactor tumblr service spec closes #6386 --- Changelog.md | 1 + app/models/services/tumblr.rb | 2 +- spec/models/services/tumblr_spec.rb | 71 +++++++++++++++++------------ 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/Changelog.md b/Changelog.md index 6b2a3a7a7..6727f8da1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ ## Features * Show spinner on initial stream load [#6384](https://github.com/diaspora/diaspora/pull/6384) * Add new moderator role. Moderators can view and act on reported posts [#6351](https://github.com/diaspora/diaspora/pull/6351) +* Only post to the primary tumblr blog [#6386](https://github.com/diaspora/diaspora/pull/6386) # 0.5.3.0 diff --git a/app/models/services/tumblr.rb b/app/models/services/tumblr.rb index 3b1abb69e..52c7f8d6a 100644 --- a/app/models/services/tumblr.rb +++ b/app/models/services/tumblr.rb @@ -17,7 +17,7 @@ class Services::Tumblr < Service 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(blogs[0]) {|blog| blog["primary"] } + primaryblog = blogs.find {|blog| blog["primary"] } || blogs[0] tumblr_ids = {} blogurl = URI.parse(primaryblog["url"]) diff --git a/spec/models/services/tumblr_spec.rb b/spec/models/services/tumblr_spec.rb index 263e9c187..c10d62cf3 100644 --- a/spec/models/services/tumblr_spec.rb +++ b/spec/models/services/tumblr_spec.rb @@ -1,41 +1,56 @@ -require 'spec_helper' +require "spec_helper" -describe Services::Tumblr, :type => :model do +describe Services::Tumblr, type: :model do + let(:user) { alice } + let(:post) { user.post(:status_message, text: "hello", to: user.aspects.first.id) } + let(:service) { Services::Tumblr.new(access_token: "yeah", access_secret: "foobar") } - before do - @user = alice - @post = @user.post(:status_message, :text => "hello", :to =>@user.aspects.first.id) - @service = Services::Tumblr.new(:access_token => "yeah", :access_secret => "foobar") - @user.services << @service - end + describe "#post" do + let(:post_id) { "bla" } + let(:post_request) { {body: service.build_tumblr_post(post, "")} } + let(:post_response) { {status: 201, body: {response: {id: post_id}}.to_json} } - describe '#post' do - it 'posts a status message to tumblr and saves the returned ids' do - response = double(body: '{"response": {"user": {"blogs": - [{"primary": false, "url": "http://foo.tumblr.com"}, - {"primary": true, "url": "http://bar.tumblr.com"}]}}}') - expect_any_instance_of(OAuth::AccessToken).to receive(:get) - .with("/v2/user/info") - .and_return(response) + before do + user.services << service + stub_request(:get, "http://api.tumblr.com/v2/user/info").to_return(status: 200, body: user_info) + end - response = double(code: "201", body: '{"response": {"id": "bla"}}') - expect_any_instance_of(OAuth::AccessToken).to receive(:post) - .with("/v2/blog/bar.tumblr.com/post", @service.build_tumblr_post(@post, "")) - .and_return(response) + 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 + } - expect(@post).to receive(:tumblr_ids=).with({"bar.tumblr.com" => "bla"}.to_json) + it "posts a status message to the primary blog and stores the id" do + stub_request(:post, "http://api.tumblr.com/v2/blog/bar.tumblr.com/post") + .with(post_request).to_return(post_response) - @service.post(@post) + expect(post).to receive(:tumblr_ids=).with({"bar.tumblr.com" => post_id}.to_json) + + service.post(post) + end + end + + context "with a single blog" do + let(:user_info) { {response: {user: {blogs: [{url: "http://foo.tumblr.com"}]}}}.to_json } + + it "posts a status message to the returned blog" do + stub_request(:post, "http://api.tumblr.com/v2/blog/foo.tumblr.com/post") + .with(post_request).to_return(post_response) + + service.post(post) + end end end - describe '#delete_post' do - it 'removes posts from tumblr' do - stub_request(:post, "http://api.tumblr.com/v2/blog/foodbar.tumblr.com/post/delete"). - to_return(:status => 200) + describe "#delete_post" do + it "removes posts from tumblr" do + stub_request(:post, "http://api.tumblr.com/v2/blog/foodbar.tumblr.com/post/delete") + .to_return(status: 200) - @service.delete_post(@post) + service.delete_post(post) end end end -