diff --git a/lib/diaspora_federation/discovery/discovery.rb b/lib/diaspora_federation/discovery/discovery.rb index 18f4054..743da34 100644 --- a/lib/diaspora_federation/discovery/discovery.rb +++ b/lib/diaspora_federation/discovery/discovery.rb @@ -15,6 +15,7 @@ module DiasporaFederation # Fetches all metadata for the account and saves it via callback # @return [Person] + # @raise [DiscoveryError] if something with the discovery failed def fetch_and_save logger.info "Fetch data for #{diaspora_id}" @@ -23,6 +24,10 @@ module DiasporaFederation DiasporaFederation.callbacks.trigger(:save_person_after_webfinger, person) logger.info "successfully webfingered #{diaspora_id}" person + rescue DiscoveryError + raise # simply re-raise DiscoveryError + rescue => e + raise DiscoveryError, "Failed discovery for #{diaspora_id}: #{e.class}: #{e.message}" end private diff --git a/spec/lib/diaspora_federation/discovery/discovery_spec.rb b/spec/lib/diaspora_federation/discovery/discovery_spec.rb index 5c380ac..7d0c4cf 100644 --- a/spec/lib/diaspora_federation/discovery/discovery_spec.rb +++ b/spec/lib/diaspora_federation/discovery/discovery_spec.rb @@ -144,6 +144,41 @@ module DiasporaFederation expect { Discovery::Discovery.new(account).fetch_and_save }.to raise_error Discovery::DiscoveryError end + + context "error handling" do + subject { Discovery::Discovery.new(account) } + + it "re-raises DiscoveryError" do + expect(subject).to receive(:validate_diaspora_id) + .and_raise(Discovery::DiscoveryError, "Something went wrong!") + + expect { subject.fetch_and_save }.to raise_error Discovery::DiscoveryError, "Something went wrong!" + end + + it "re-raises InvalidDocument" do + expect(subject).to receive(:validate_diaspora_id) + .and_raise(Discovery::InvalidDocument, "Wrong document!") + + expect { subject.fetch_and_save }.to raise_error Discovery::InvalidDocument, "Wrong document!" + end + + it "re-raises InvalidData" do + expect(subject).to receive(:validate_diaspora_id) + .and_raise(Discovery::InvalidData, "Wrong data!") + + expect { subject.fetch_and_save }.to raise_error Discovery::InvalidData, "Wrong data!" + end + + it "raises a DiscoveryError when an unhandled error occurs" do + expect(subject).to receive(:validate_diaspora_id) + .and_raise("OMG! EVERYTHING IS BROKEN!") + + expect { + subject.fetch_and_save + }.to raise_error Discovery::DiscoveryError, + "Failed discovery for #{account}: RuntimeError: OMG! EVERYTHING IS BROKEN!" + end + end end end end