lib/pact/provider/dsl.rb



require_relative 'pact_verification'

module Pact

   module Provider
      module DSL

         #TODO: Move this into a module, out of configuration
         module Configuration
            def provider= provider
               @provider = provider
            end

            def provider
              if defined? @provider
                @provider
              else
                raise "Please configure your provider. See the Provider section in the README for examples."
              end
            end

            def add_pact_verification verification
              pact_verifications << verification
            end
            def pact_verifications
              @pact_verifications ||= []
            end
         end

         Pact::Configuration.send(:include, Configuration)

         def service_provider name, &block
            service_provider = ServiceProviderDSL.new(name, &block).create_service_provider
            Pact.configuration.provider = service_provider
            service_provider
         end

        class ServiceProviderConfig
           attr_accessor :name

           def initialize name, &app_block
             @name = name
             @app_block = app_block
           end

           def app
             @app_block.call
           end
         end

         class VerificationDSL
            def initialize consumer_name, options = {}, &block
              @consumer_name = consumer_name
              @ref = options.fetch(:ref, :head)
              @pact_uri = nil
              instance_eval(&block)
            end

            def pact_uri pact_uri, options = {}
              @pact_uri = pact_uri
            end

            def task task
              @task = task
            end

            def create_verification
              validate
              Pact::Provider::PactVerification.new(@consumer_name, @pact_uri, @ref)
            end

            private

            def validate
              raise "Please provide a pact_uri for the verification" unless @pact_uri
            end

         end

         class ServiceProviderDSL

           def initialize name, &block
             @name = name
             @app = nil
             instance_eval(&block)
           end

           def validate
             raise "Please provide a name for the Provider" unless @name && !@name.strip.empty?
             raise "Please configure an app for the Provider" unless @app_block
           end

           def name name
             @name = name
           end

           def app &block
             @app_block = block
           end

           def honours_pact_with consumer_name, options = {}, &app_block
              verification = VerificationDSL.new(consumer_name, options, &app_block).create_verification
              Pact.configuration.add_pact_verification verification
           end

           def create_service_provider
             validate
             ServiceProviderConfig.new(@name, &@app_block)
           end
         end
      end
   end
end

Pact.send(:extend, Pact::Provider::DSL)