Mongrel2::

RequestFactory

class
Superclass
Object
Extended With
Loggability

A factory for generating Mongrel2::Request objects for testing.

Usage:

require 'mongrel2/testing'

describe "MyHandler" do
    before( :all ) do
        @factory = Mongrel2::RequestFactory.
            new( sender_id: 'my-handler',
                 route: '/api/v1',
                 headers: {accept: 'application/json'} )
    end

    before( :each ) do
        @app = MyHandler.new( 'my-handler', 'tcp://0.0.0.0:5556',
                              'tcp://0.0.0.0:5555' )
    end

    it "handles a JSON request for GET /" do
        request = @factory.get( '/api/v1' )
        response = @app.dispatch_request( request )
        #...
    end
end

Constants

DEFAULT_CONN_ID

Default connection ID

DEFAULT_FACTORY_CONFIG

The defaults used by the HTTP request factory

DEFAULT_TESTING_HEADERS

The default set of headers used for HTTP requests

DEFAULT_TESTING_HOST
DEFAULT_TESTING_PORT
DEFAULT_TESTING_ROUTE
DEFAULT_TESTING_URL

The testing URL to use by default

DEFAULT_TEST_UUID

Default testing UUID (sender_id)

TEST_RECV_SPEC
TEST_SEND_SPEC

0mq socket specifications for Handlers

Attributes

conn_id[RW]
headers[R]
host[RW]
port[RW]
route[RW]
sender_id[RW]

Public Class Methods

anchor
default_factory_config()

Return the default configuration for the receiving factory class.

# File lib/mongrel2/testing.rb, line 148
def self::default_factory_config
        return const_get( :DEFAULT_FACTORY_CONFIG )
end
anchor
default_headers()

Return the default testing headers hash for the receiving class.

# File lib/mongrel2/testing.rb, line 142
def self::default_headers
        return const_get( :DEFAULT_TESTING_HEADERS )
end
anchor
new( config={} )

Create a new RequestFactory with the given config, which will be merged with DEFAULT_FACTORY_CONFIG.

# File lib/mongrel2/testing.rb, line 159
def initialize( config={} )
        config[:headers] = self.class.default_headers.merge( config[:headers] ) if config[:headers]
        config = self.class.default_factory_config.merge( config )

        @sender_id = config[:sender_id]
        @host      = config[:host]
        @port      = config[:port]
        @route     = config[:route]
        @headers   = Mongrel2::Table.new( config[:headers] )

        @conn_id = 0
end

HTTP verb methods

↑ top

Public Instance Methods

anchor
delete( uri, headers={} )

Create a new DELETE Mongrel2::Request for the specified uri with the given headers.

# File lib/mongrel2/testing.rb, line 251
def delete( uri, headers={} )
        raise "Request doesn't route through %p" % [ self.route ] unless
                uri.start_with?( self.route )

        headers = self.make_merged_headers( :DELETE, uri, headers )
        rclass = Mongrel2::Request.subclass_for_method( :DELETE )

        return rclass.new( self.sender_id, self.conn_id.to_s, uri.to_s, headers )
end
anchor
get( uri, headers={} )

Create a new GET Mongrel2::Request for the specified uri and headers.

# File lib/mongrel2/testing.rb, line 196
def get( uri, headers={} )
        raise "Request doesn't route through %p" % [ self.route ] unless
                uri.start_with?( self.route )

        headers = self.make_merged_headers( :GET, uri, headers )
        rclass = Mongrel2::Request.subclass_for_method( :GET )

        return rclass.new( self.sender_id, self.conn_id.to_s, uri.to_s, headers )
end
anchor
head( uri, headers={} )

Create a new HEAD Mongrel2::Request for the specified uri and headers.

# File lib/mongrel2/testing.rb, line 208
def head( uri, headers={} )
        raise "Request doesn't route through %p" % [ self.route ] unless
                uri.start_with?( self.route )

        headers = self.make_merged_headers( :HEAD, uri, headers )
        rclass = Mongrel2::Request.subclass_for_method( :HEAD )

        return rclass.new( self.sender_id, self.conn_id.to_s, uri.to_s, headers )
end
anchor
options( uri, headers={} )

Create a new OPTIONS Mongrel2::Request with the specified uri and headers.

# File lib/mongrel2/testing.rb, line 184
def options( uri, headers={} )
        raise "Request doesn't route through %p" % [ self.route ] unless
                uri.start_with?( self.route )

        headers = self.make_merged_headers( :OPTIONS, uri, headers )
        rclass = Mongrel2::Request.subclass_for_method( :OPTIONS )

        return rclass.new( self.sender_id, self.conn_id.to_s, uri.to_s, headers )
end
anchor
post( uri, body='', headers={} )

Create a new POST Mongrel2::Request for the specified uri with the given body and headers.

# File lib/mongrel2/testing.rb, line 221
def post( uri, body='', headers={} )
        raise "Request doesn't route through %p" % [ self.route ] unless
                uri.start_with?( self.route )

        headers = self.make_merged_headers( :POST, uri, headers )
        rclass = Mongrel2::Request.subclass_for_method( :POST )

        req = rclass.new( self.sender_id, self.conn_id.to_s, uri.to_s, headers, body )

        return req
end
anchor
put( uri, body='', headers={} )

Create a new PUT Mongrel2::Request for the specified uri with the given body and headers.

# File lib/mongrel2/testing.rb, line 236
def put( uri, body='', headers={} )
        raise "Request doesn't route through %p" % [ self.route ] unless
                uri.start_with?( self.route )

        headers = self.make_merged_headers( :PUT, uri, headers )
        rclass = Mongrel2::Request.subclass_for_method( :PUT )

        req = rclass.new( self.sender_id, self.conn_id.to_s, uri.to_s, headers, body )

        return req
end

Protected Instance Methods

anchor
make_merged_headers( verb, uri, userheaders )

Merge the factory's headers with userheaders, and then merge in the special headers that Mongrel2 adds that are based on the uri and other server attributes.

# File lib/mongrel2/testing.rb, line 269
def make_merged_headers( verb, uri, userheaders )
        headers = self.headers.merge( userheaders )
        uri = URI( uri )

        # Add mongrel headers
        headers.uri       = uri.to_s
        headers.path      = uri.path
        headers['METHOD'] = verb.to_s
        headers.host      = "%s:%d" % [ self.host, self.port ]
        headers.query     = uri.query if uri.query
        headers.pattern   = self.route

        return headers
end