Commit b667cc2

mo <mo@mokhan.ca>
2017-11-30 16:52:03
provide .build api for clients.
1 parent ca1538c
lib/saml/kit/buildable.rb
@@ -0,0 +1,16 @@
+module Saml
+  module Kit
+    module Buildable
+      extend ActiveSupport::Concern
+
+      class_methods do
+        def build
+          puts builder_class.inspect
+          builder = builder_class.new
+          yield builder
+          builder.build
+        end
+      end
+    end
+  end
+end
lib/saml/kit/document.rb
@@ -5,6 +5,7 @@ module Saml
       include XsdValidatable
       include ActiveModel::Validations
       include Trustable
+      include Buildable
       validates_presence_of :content
       validates_presence_of :id
       validate :must_match_xsd
@@ -76,6 +77,21 @@ module Saml
           Saml::Kit.logger.error(error)
           InvalidDocument.new(xml)
         end
+
+        def builder_class
+          case name
+          when Saml::Kit::Builders::Response.to_s
+            Saml::Kit::Builders::Response
+          when Saml::Kit::Builders::LogoutResponse.to_s
+            Saml::Kit::Builders::LogoutResponse
+          when Saml::Kit::AuthenticationRequest.to_s
+            Saml::Kit::Builders::AuthenticationRequest
+          when Saml::Kit::Builders::LogoutRequest.to_s
+            Saml::Kit::Builders::LogoutRequest
+          else
+            raise ArgumentError.new("Unknown SAML Document")
+          end
+        end
       end
 
       private
lib/saml/kit/metadata.rb
@@ -3,6 +3,7 @@ module Saml
     class Metadata
       include ActiveModel::Validations
       include XsdValidatable
+      include Buildable
       METADATA_XSD = File.expand_path("./xsd/saml-schema-metadata-2.0.xsd", File.dirname(__FILE__)).freeze
 
       validates_presence_of :metadata
@@ -97,12 +98,6 @@ module Saml
         end
       end
 
-      def self.build
-        builder = builder_class.new
-        yield builder
-        builder.build
-      end
-
       private
 
       def document
lib/saml/kit.rb
@@ -13,6 +13,7 @@ require "nokogiri"
 require "securerandom"
 require "xmldsig"
 
+require "saml/kit/buildable"
 require "saml/kit/namespaces"
 require "saml/kit/serializable"
 require "saml/kit/xsd_validatable"
spec/saml/authentication_request_spec.rb
@@ -149,4 +149,20 @@ XML
       expect(subject.acs_url).to be_nil
     end
   end
+
+  describe ".build" do
+    let(:url) { FFaker::Internet.uri("https") }
+    let(:entity_id) { FFaker::Internet.uri("https") }
+
+    it 'provides a nice API for building metadata' do
+      result = described_class.build do |builder|
+        builder.issuer = entity_id
+        builder.acs_url = url
+      end
+
+      expect(result).to be_instance_of(described_class)
+      expect(result.issuer).to eql(entity_id)
+      expect(result.acs_url).to eql(url)
+    end
+  end
 end
spec/saml/identity_provider_metadata_spec.rb
@@ -198,7 +198,7 @@ RSpec.describe Saml::Kit::IdentityProviderMetadata do
         builder.add_single_sign_on_service(url, binding: :http_post)
       end
 
-      expect(result).to be_instance_of(Saml::Kit::IdentityProviderMetadata)
+      expect(result).to be_instance_of(described_class)
       expect(result.entity_id).to eql(entity_id)
       expect(result.single_sign_on_service_for(binding: :http_post).location).to eql(url)
     end
spec/saml/service_provider_metadata_spec.rb
@@ -137,7 +137,7 @@ RSpec.describe Saml::Kit::ServiceProviderMetadata do
         builder.add_assertion_consumer_service(acs_url, binding: :http_post)
       end
 
-      expect(result).to be_instance_of(Saml::Kit::ServiceProviderMetadata)
+      expect(result).to be_instance_of(described_class)
       expect(result.entity_id).to eql(entity_id)
       expect(result.assertion_consumer_service_for(binding: :http_post).location).to eql(acs_url)
     end