diaspora/spec/shared_behaviors/receiving.rb
Jonne Haß 5d318400c9
Diaspora::Federation::Receive::ignore_existing_guid returns nil when
ignoring the error message

Previously it returned the return value of Logging::Logger#warn, which
is true for loggers that log the warn level. However
Diaspora::Federation::Receive::receive_relayable checks the return value
for truthiness in order to decide whether to attempt to relay it,
resulting in a NoMethodError: undefined method `parent' for
true:TrueClass in Diaspora::Federation::Receive::relay_relayable

This change is cosmetic as the exception raised prevented any action
that shouldn't happen anyway, so there's no actual logic change.
2016-06-26 17:01:33 +02:00

75 lines
2.6 KiB
Ruby

require "spec_helper"
shared_examples_for "it ignores existing object received twice" do |klass|
it "return nil if the #{klass} already exists" do
expect(Diaspora::Federation::Receive.perform(entity)).not_to be_nil
expect(Diaspora::Federation::Receive.perform(entity)).to be_nil
end
it "does not change anything if the #{klass} already exists" do
Diaspora::Federation::Receive.perform(entity)
expect_any_instance_of(klass).not_to receive(:create_or_update)
Diaspora::Federation::Receive.perform(entity)
end
end
shared_examples_for "it rejects if the parent author ignores the author" do |klass|
it "saves the relayable if the author is not ignored" do
Diaspora::Federation::Receive.perform(entity)
expect(klass.find_by!(guid: entity.guid)).to be_instance_of(klass)
end
context "if the author is ignored" do
before do
alice.blocks.create(person: sender)
end
it "raises an error and does not save the relayable" do
expect {
Diaspora::Federation::Receive.perform(entity)
}.to raise_error Diaspora::Federation::AuthorIgnored
expect(klass.find_by(guid: entity.guid)).to be_nil
end
it "it sends a retraction back to the author" do
dispatcher = double
expect(Diaspora::Federation::Dispatcher).to receive(:build) do |retraction_sender, retraction, opts|
expect(retraction_sender).to eq(alice)
expect(retraction.data[:target_guid]).to eq(entity.guid)
expect(retraction.data[:target_type]).to eq(klass.to_s)
expect(opts).to eq(subscribers: [sender])
dispatcher
end
expect(dispatcher).to receive(:dispatch)
expect {
Diaspora::Federation::Receive.perform(entity)
}.to raise_error Diaspora::Federation::AuthorIgnored
end
end
end
shared_examples_for "it relays relayables" do |klass|
it "dispatches the received relayable" do
expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch) do |parent_author, relayable|
expect(parent_author).to eq(alice)
expect(relayable).to be_instance_of(klass)
expect(relayable.guid).to eq(entity.guid)
end
Diaspora::Federation::Receive.perform(entity)
end
it "does not dispatch the received relayable if there was an error saving it and it exists already" do
allow_any_instance_of(klass).to receive(:save!).and_raise(RuntimeError, "something went wrong")
allow(Diaspora::Federation::Receive).to receive(:load_from_database).and_return(true)
expect(Diaspora::Federation::Dispatcher).to_not receive(:defer_dispatch)
Diaspora::Federation::Receive.perform(entity)
end
end