diaspora/spec/lib/diaspora/fetcher/public_spec.rb
Jonne Haß 3fc3b249e7 End the require mess
* Rename and reorganize post fetcher to fix autoloading, also let it use
  Faradays default connection so we get nice redirects
* Add initializer to load libs at a central place
* added lib dir to autoload_once paths to increase thread safety
* Moved lib/exceptions.rb to lib/diaspora/ to conform namespacing
2013-03-21 23:37:53 +01:00

255 lines
8.1 KiB
Ruby

# Copyright (c) 2010-2012, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
# Tests fetching public posts of a person on a remote server
describe Diaspora::Fetcher::Public do
before do
# the fixture is taken from an actual json request.
# it contains 10 StatusMessages and 5 Reshares, all of them public
# the guid of the person is "7445f9a0a6c28ebb"
@fixture = File.open(Rails.root.join('spec', 'fixtures', 'public_posts.json')).read
@fetcher = Diaspora::Fetcher::Public.new
@person = FactoryGirl.create(:person, {:guid => "7445f9a0a6c28ebb",
:url => "https://remote-testpod.net",
:diaspora_handle => "testuser@remote-testpod.net"})
stub_request(:get, /remote-testpod.net\/people\/.*/)
.with(headers: {
'Accept'=>'application/json',
'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
'User-Agent'=>'diaspora-fetcher'
}).to_return(:body => @fixture)
end
describe "#retrieve_posts" do
before do
person = @person
@fetcher.instance_eval {
@person = person
retrieve_posts
}
end
it "sets the operation status on the person" do
@person.reload
@person.fetch_status.should_not eql(Diaspora::Fetcher::Public::Status_Initial)
@person.fetch_status.should eql(Diaspora::Fetcher::Public::Status_Fetched)
end
it "sets the @data variable to the parsed JSON data" do
data = @fetcher.instance_eval {
@data
}
data.should_not be_nil
data.size.should eql JSON.parse(@fixture).size
end
end
describe "#process_posts" do
before do
person = @person
data = JSON.parse(@fixture)
@fetcher.instance_eval {
@person = person
@data = data
}
end
it 'creates 10 new posts in the database' do
before_count = Post.count
@fetcher.instance_eval {
process_posts
}
after_count = Post.count
after_count.should eql(before_count + 10)
end
it 'sets the operation status on the person' do
@fetcher.instance_eval {
process_posts
}
@person.reload
@person.fetch_status.should_not eql(Diaspora::Fetcher::Public::Status_Initial)
@person.fetch_status.should eql(Diaspora::Fetcher::Public::Status_Processed)
end
context 'created post' do
before do
Timecop.freeze
@now = DateTime.now.utc
@data = JSON.parse(@fixture).select { |item| item['post_type'] == 'StatusMessage' }
#save posts to db
@fetcher.instance_eval {
process_posts
}
end
after do
Timecop.return
end
it 'applies the date from JSON to the record' do
@data.each do |post|
date = ActiveSupport::TimeZone.new('UTC').parse(post['created_at']).to_i
entry = StatusMessage.find_by_guid(post['guid'])
entry.created_at.to_i.should eql(date)
end
end
it 'copied the text correctly' do
@data.each do |post|
entry = StatusMessage.find_by_guid(post['guid'])
entry.raw_message.should eql(post['text'])
end
end
it 'applies now to interacted_at on the record' do
@data.each do |post|
date = @now.to_i
entry = StatusMessage.find_by_guid(post['guid'])
entry.interacted_at.to_i.should eql(date)
end
end
end
end
context "private methods" do
let(:public_fetcher) { Diaspora::Fetcher::Public.new }
describe '#qualifies_for_fetching?' do
it "raises an error if the person doesn't exist" do
lambda {
public_fetcher.instance_eval {
@person = Person.by_account_identifier "someone@unknown.com"
qualifies_for_fetching?
}
}.should raise_error ActiveRecord::RecordNotFound
end
it 'returns false if the person is unfetchable' do
public_fetcher.instance_eval {
@person = FactoryGirl.create(:person, {:fetch_status => Diaspora::Fetcher::Public::Status_Unfetchable})
qualifies_for_fetching?
}.should be_false
end
it 'returns false and sets the person unfetchable for a local account' do
user = FactoryGirl.create(:user)
public_fetcher.instance_eval {
@person = user.person
qualifies_for_fetching?
}.should be_false
user.person.fetch_status.should eql Diaspora::Fetcher::Public::Status_Unfetchable
end
it 'returns false if the person is processing already (or has been processed)' do
person = FactoryGirl.create(:person)
person.fetch_status = Diaspora::Fetcher::Public::Status_Fetched
person.save
public_fetcher.instance_eval {
@person = person
qualifies_for_fetching?
}.should be_false
end
it "returns true, if the user is remote and hasn't been fetched" do
person = FactoryGirl.create(:person, {:diaspora_handle => 'neo@theone.net'})
public_fetcher.instance_eval {
@person = person
qualifies_for_fetching?
}.should be_true
end
end
describe '#set_fetch_status' do
it 'sets the current status of fetching on the person' do
person = @person
public_fetcher.instance_eval {
@person = person
set_fetch_status Diaspora::Fetcher::Public::Status_Unfetchable
}
@person.fetch_status.should eql Diaspora::Fetcher::Public::Status_Unfetchable
public_fetcher.instance_eval {
set_fetch_status Diaspora::Fetcher::Public::Status_Initial
}
@person.fetch_status.should eql Diaspora::Fetcher::Public::Status_Initial
end
end
describe '#validate' do
it "calls all validation helper methods" do
public_fetcher.should_receive(:check_existing).and_return(true)
public_fetcher.should_receive(:check_author).and_return(true)
public_fetcher.should_receive(:check_public).and_return(true)
public_fetcher.should_receive(:check_type).and_return(true)
public_fetcher.instance_eval { validate({}) }.should be_true
end
end
describe '#check_existing' do
it 'returns false if a post with the same guid exists' do
post = {'guid' => FactoryGirl.create(:status_message).guid}
public_fetcher.instance_eval { check_existing post }.should be_false
end
it 'returns true if the guid cannot be found' do
post = {'guid' => SecureRandom.hex(8)}
public_fetcher.instance_eval { check_existing post }.should be_true
end
end
describe '#check_author' do
let!(:some_person) { FactoryGirl.create(:person) }
before do
person = some_person
public_fetcher.instance_eval { @person = person }
end
it "returns false if the person doesn't match" do
post = { 'author' => { 'guid' => SecureRandom.hex(8) } }
public_fetcher.instance_eval { check_author post }.should be_false
end
it "returns true if the persons match" do
post = { 'author' => { 'guid' => some_person.guid } }
public_fetcher.instance_eval { check_author post }.should be_true
end
end
describe '#check_public' do
it "returns false if the post is not public" do
post = {'public' => false}
public_fetcher.instance_eval { check_public post }.should be_false
end
it "returns true if the post is public" do
post = {'public' => true}
public_fetcher.instance_eval { check_public post }.should be_true
end
end
describe '#check_type' do
it "returns false if the type is anything other that 'StatusMessage'" do
post = {'post_type'=>'Reshare'}
public_fetcher.instance_eval { check_type post }.should be_false
end
it "returns true if the type is 'StatusMessage'" do
post = {'post_type'=>'StatusMessage'}
public_fetcher.instance_eval { check_type post }.should be_true
end
end
end
end