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.
75 lines
2.6 KiB
Ruby
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
|