33require 'onelogin/ruby-saml/idp_metadata_parser'
44
55class IdpMetadataParserTest < Minitest ::Test
6+ class MockSuccessResponse < Net ::HTTPSuccess
7+ # override parent's initialize
8+ def initialize ; end
9+
10+ attr_accessor :body
11+ end
12+
13+ class MockFailureResponse < Net ::HTTPNotFound
14+ # override parent's initialize
15+ def initialize ; end
616
7- class MockResponse
817 attr_accessor :body
918 end
1019
@@ -24,7 +33,7 @@ class MockResponse
2433
2534 describe "download and parse IdP descriptor file" do
2635 before do
27- mock_response = MockResponse . new
36+ mock_response = MockSuccessResponse . new
2837 mock_response . body = idp_metadata
2938 @url = "https://example.com"
3039 uri = URI ( @url )
@@ -34,7 +43,6 @@ class MockResponse
3443 @http . expects ( :request ) . returns ( mock_response )
3544 end
3645
37-
3846 it "extract settings from remote xml" do
3947 idp_metadata_parser = OneLogin ::RubySaml ::IdpMetadataParser . new
4048 settings = idp_metadata_parser . parse_remote ( @url )
@@ -49,10 +57,39 @@ class MockResponse
4957
5058 it "accept self signed certificate if insturcted" do
5159 idp_metadata_parser = OneLogin ::RubySaml ::IdpMetadataParser . new
52- settings = idp_metadata_parser . parse_remote ( @url , false )
60+ idp_metadata_parser . parse_remote ( @url , false )
5361
5462 assert_equal OpenSSL ::SSL ::VERIFY_NONE , @http . verify_mode
5563 end
5664 end
5765
66+ describe "download failure cases" do
67+ it "raises an exception when the url has no scheme" do
68+ idp_metadata_parser = OneLogin ::RubySaml ::IdpMetadataParser . new
69+
70+ exception = assert_raises ( ArgumentError ) do
71+ idp_metadata_parser . parse_remote ( "blahblah" )
72+ end
73+
74+ assert_equal ( "url must begin with http or https" , exception . message )
75+ end
76+
77+ it "raises an exception when unable to download metadata" do
78+ mock_response = MockFailureResponse . new
79+ @url = "https://example.com"
80+ uri = URI ( @url )
81+
82+ @http = Net ::HTTP . new ( uri . host , uri . port )
83+ Net ::HTTP . expects ( :new ) . returns ( @http )
84+ @http . expects ( :request ) . returns ( mock_response )
85+
86+ idp_metadata_parser = OneLogin ::RubySaml ::IdpMetadataParser . new
87+
88+ exception = assert_raises ( OneLogin ::RubySaml ::HttpError ) do
89+ idp_metadata_parser . parse_remote ( "https://example.hello.com/access/saml/idp.xml" )
90+ end
91+
92+ assert_equal ( "Failed to fetch idp metadata" , exception . message )
93+ end
94+ end
5895end
0 commit comments