fix: don't explode snikket on SSLError

Phillip Davis created

Change summary

lib/snikket.rb       |  4 +++-
test/test_snikket.rb | 23 +++++++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)

Detailed changes

lib/snikket.rb 🔗

@@ -284,7 +284,9 @@ module Snikket
 
 			def fetch
 				url = bootstrap_uri
-				req(url).then { |res|
+				EMPromise.resolve(nil).then {
+					req(url)
+				}.then { |res|
 					parse_invite(url, res)
 				}.catch { nil }
 			end

test/test_snikket.rb 🔗

@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
 require "snikket"
+require "openssl"
 
 class TestSnikket < Minitest::Test
 	NS = "xmpp:snikket.org/hosting/v1"
@@ -66,6 +67,28 @@ class TestSnikket < Minitest::Test
 		)
 	end
 
+	def test_fetch_invite_returns_nil_when_http_head_raises_ssl_error
+		instance = Snikket::CustomerInstance.new(
+			instance_id: "si-1234",
+			bootstrap_token: "fZLy6iTh",
+			customer_id: "test",
+			domain: "example.com"
+		)
+
+		request = Minitest::Mock.new
+		request.expect(:ahead, nil) do |redirects:|
+			assert_equal 5, redirects
+			raise OpenSSL::SSL::SSLError, "certificate verify failed"
+		end
+
+		EM::HttpRequest.stub(:new, request) do
+			assert_nil instance.fetch_invite.sync
+		end
+
+		request.verify
+	end
+	em :test_fetch_invite_returns_nil_when_http_head_raises_ssl_error
+
 	def test_instance_result
 		instance = Blather::XMPPNode.parse(<<~XML)
 			<iq type="result" from="hosting-api.snikket.net" id="000">