<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/helper.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -380,59 +380,61 @@ typically don't have to +use+ them explicitly.
 
 == Testing
 
-=== Test/Unit
+The Sinatra::Test module includes a variety of helper methods for testing
+your Sinatra app. Sinatra includes support for Test::Unit, test-spec, RSpec,
+and Bacon through separate source files.
+
+=== Test::Unit
 
-  require 'rubygems'
   require 'sinatra'
   require 'sinatra/test/unit'
   require 'my_sinatra_app'
 
   class MyAppTest &lt; Test::Unit::TestCase
-
     def test_my_default
-      get_it '/'
+      get '/'
       assert_equal 'My Default Page!', @response.body
     end
 
     def test_with_agent
-      get_it '/', :agent =&gt; 'Songbird'
+      get '/', :agent =&gt; 'Songbird'
       assert_equal 'You're in Songbird!', @response.body
     end
 
     ...
-
   end
 
-=== Test/Spec
+=== Test::Spec
+
+Install the test-spec gem and require &lt;tt&gt;'sinatra/test/spec'&lt;/tt&gt; before
+your app:
 
-  require 'rubygems'
   require 'sinatra'
   require 'sinatra/test/spec'
   require 'my_sinatra_app'
 
   describe 'My app' do
-
     it &quot;should show a default page&quot; do
-      get_it '/'
+      get '/'
       should.be.ok
       body.should.equal 'My Default Page!'
     end
 
     ...
-
   end
 
 === RSpec
 
-  require 'rubygems'
-  require 'spec'
+Install the rspec gem and require &lt;tt&gt;'sinatra/test/rspec'&lt;/tt&gt; before
+your app:
+
   require 'sinatra'
   require 'sinatra/test/rspec'
   require 'my_sinatra_app'
 
   describe 'My app' do
     it 'should show a default page' do
-      get_it '/'
+      get '/'
       @response.should be_ok
       @response.body.should == 'My Default Page!'
     end</diff>
      <filename>README.rdoc</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,6 @@
 require File.dirname(__FILE__) + '/helper'
 
 context &quot;Simple Events&quot; do
-
   def simple_request_hash(method, path)
     Rack::Request.new({
       'REQUEST_METHOD' =&gt; method.to_s.upcase,
@@ -14,16 +13,16 @@ context &quot;Simple Events&quot; do
 
   def invoke_simple(path, request_path, &amp;b)
     params = nil
-    mock_app {
-      get path do
-        params = self.params
-        b.call if b
-      end
-    }
+    get path do
+      params = self.params
+      b.call if b
+    end
     get_it request_path
     MockResult.new(b, params)
   end
 
+  setup { Sinatra.application = nil }
+
   specify &quot;return last value&quot; do
     block = Proc.new { 'Simple' }
     result = invoke_simple('/', '/', &amp;block)
@@ -38,6 +37,7 @@ context &quot;Simple Events&quot; do
     result.params.should.equal &quot;foo&quot; =&gt; 'a', &quot;bar&quot; =&gt; 'b'
 
     # unscapes
+    Sinatra.application = nil
     result = invoke_simple('/:foo/:bar', '/a/blake%20mizerany')
     result.should.not.be.nil
     result.params.should.equal &quot;foo&quot; =&gt; 'a', &quot;bar&quot; =&gt; 'blake mizerany'
@@ -48,14 +48,17 @@ context &quot;Simple Events&quot; do
     result.should.not.be.nil
     result.params.should.equal &quot;foo&quot; =&gt; 'a', &quot;bar&quot; =&gt; 'b'
 
+    Sinatra.application = nil
     result = invoke_simple('/?:foo?/?:bar?', '/a/')
     result.should.not.be.nil
     result.params.should.equal &quot;foo&quot; =&gt; 'a', &quot;bar&quot; =&gt; nil
 
+    Sinatra.application = nil
     result = invoke_simple('/?:foo?/?:bar?', '/a')
     result.should.not.be.nil
     result.params.should.equal &quot;foo&quot; =&gt; 'a', &quot;bar&quot; =&gt; nil
 
+    Sinatra.application = nil
     result = invoke_simple('/:foo?/?:bar?', '/')
     result.should.not.be.nil
     result.params.should.equal &quot;foo&quot; =&gt; nil, &quot;bar&quot; =&gt; nil</diff>
      <filename>compat/events_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,9 +13,18 @@ require 'sinatra/test'
 require 'sinatra/test/unit'
 require 'sinatra/test/spec'
 
+module Sinatra::Test
+  # we need to remove the new test helper methods since they conflict with
+  # the top-level methods of the same name.
+  %w(get head post put delete).each do |verb|
+    remove_method verb
+  end
+  include Sinatra::Delegator
+end
+
 class Test::Unit::TestCase
+  include Sinatra::Test
   def setup
     @app = lambda { |env| Sinatra::Application.call(env) }
   end
-  include Sinatra::Test
 end</diff>
      <filename>compat/helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,112 +1,110 @@
 require 'sinatra/base'
-require 'test/unit'
 
-module Sinatra::Test
-  include Rack::Utils
-
-  attr_reader :app, :request, :response
-
-  def mock_app(base=Sinatra::Base, &amp;block)
-    @app = Sinatra.new(base, &amp;block)
-  end
-
-  undef request if method_defined?(:request)
-
-  def request(verb, path, *args)
-    fail &quot;@app not set - cannot make request&quot; if @app.nil?
-    @request = Rack::MockRequest.new(@app)
-    opts, input =
-      case args.size
-      when 2 # input, env
-        input, env = args
-        if input.kind_of?(Hash) # params, env
-          [env, param_string(input)]
+module Sinatra
+
+  module Test
+    include Rack::Utils
+
+    attr_reader :app, :request, :response
+
+    def test_request(verb, path, *args)
+      @app = Sinatra::Application if @app.nil? &amp;&amp; defined?(Sinatra::Application)
+      fail &quot;@app not set - cannot make request&quot; if @app.nil?
+      @request = Rack::MockRequest.new(@app)
+      opts, input =
+        case args.size
+        when 2 # input, env
+          input, env = args
+          if input.kind_of?(Hash) # params, env
+            [env, param_string(input)]
+          else
+            [env, input]
+          end
+        when 1 # params
+          if (data = args.first).kind_of?(Hash)
+            env = (data.delete(:env) || {})
+            [env, param_string(data)]
+          else
+            [{}, data]
+          end
+        when 0
+          [{}, '']
         else
-          [env, input]
+          raise ArgumentError, &quot;zero, one, or two arguments expected&quot;
         end
-      when 1 # params
-        if (data = args.first).kind_of?(Hash)
-          env = (data.delete(:env) || {})
-          [env, param_string(data)]
-        else
-          [{}, data]
-        end
-      when 0
-        [{}, '']
-      else
-        raise ArgumentError, &quot;zero, one, or two arguments expected&quot;
-      end
-    opts = rack_opts(opts)
-    opts[:input] ||= input
-    yield @request if block_given?
-    @response = @request.request(verb, path, opts)
-  end
+      opts = rack_opts(opts)
+      opts[:input] ||= input
+      yield @request if block_given?
+      @response = @request.request(verb, path, opts)
+    end
 
-  def get(path, *args, &amp;b)  ; request('GET', path, *args, &amp;b) ; end
-  def head(path, *args, &amp;b) ; request('HEAD', path, *args, &amp;b) ; end
-  def post(path, *args, &amp;b) ; request('POST', path, *args, &amp;b) ; end
-  def put(path, *args, &amp;b)  ; request('PUT', path, *args, &amp;b) ; end
-  def delete(path, *args, &amp;b) ; request('DELETE', path, *args, &amp;b) ; end
+    def get(path, *args, &amp;b)  ; test_request('GET', path, *args, &amp;b) ; end
+    def head(path, *args, &amp;b) ; test_request('HEAD', path, *args, &amp;b) ; end
+    def post(path, *args, &amp;b) ; test_request('POST', path, *args, &amp;b) ; end
+    def put(path, *args, &amp;b)  ; test_request('PUT', path, *args, &amp;b) ; end
+    def delete(path, *args, &amp;b) ; test_request('DELETE', path, *args, &amp;b) ; end
 
-  def follow!
-    request 'GET', @response.location
-  end
+    def follow!
+      test_request 'GET', @response.location
+    end
 
-  def should
-    @response.should
-  end
+    def body
+      @response.body
+    end
 
-  def body
-    @response.body
-  end
+    def status
+      @response.status
+    end
 
-  def status
-    @response.status
-  end
+    RACK_OPT_NAMES = {
+      :accept =&gt; &quot;HTTP_ACCEPT&quot;,
+      :agent =&gt; &quot;HTTP_USER_AGENT&quot;,
+      :host =&gt; &quot;HTTP_HOST&quot;,
+      :session =&gt; &quot;HTTP_COOKIE&quot;,
+      :cookies =&gt; &quot;HTTP_COOKIE&quot;,
+      :content_type =&gt; &quot;CONTENT_TYPE&quot;
+    }
+
+    def rack_opts(opts)
+      opts.inject({}) do |hash,(key,val)|
+        key = RACK_OPT_NAMES[key] || key
+        hash[key] = val
+        hash
+      end
+    end
 
-  RACK_OPT_NAMES = {
-    :accept =&gt; &quot;HTTP_ACCEPT&quot;,
-    :agent =&gt; &quot;HTTP_USER_AGENT&quot;,
-    :host =&gt; &quot;HTTP_HOST&quot;,
-    :session =&gt; &quot;HTTP_COOKIE&quot;,
-    :cookies =&gt; &quot;HTTP_COOKIE&quot;,
-    :content_type =&gt; &quot;CONTENT_TYPE&quot;
-  }
-
-  def rack_opts(opts)
-    opts.inject({}) do |hash,(key,val)|
-      key = RACK_OPT_NAMES[key] || key
-      hash[key] = val
-      hash
+    def env_for(opts={})
+      opts = rack_opts(opts)
+      Rack::MockRequest.env_for(opts)
     end
-  end
 
-  def env_for(opts={})
-    opts = rack_opts(opts)
-    Rack::MockRequest.env_for(opts)
-  end
+    def param_string(hash)
+      hash.map { |pair| pair.map{|v|escape(v)}.join('=') }.join('&amp;')
+    end
 
-  def param_string(hash)
-    hash.map { |pair| pair.map{|v|escape(v)}.join('=') }.join('&amp;')
-  end
+    if defined? Sinatra::Compat
+      # Deprecated. Use: &quot;get&quot; instead of &quot;get_it&quot;.
+      %w(get head post put delete).each do |verb|
+        alias_method &quot;#{verb}_it&quot;, verb
+      end
 
-  if defined? Sinatra::Compat
-    # Deprecated. Use: &quot;get&quot; instead of &quot;get_it&quot;.
-    %w(get head post put delete).each do |verb|
-      alias_method &quot;#{verb}_it&quot;, verb
-      remove_method verb
+      # Deprecated. Tests no longer delegate missing methods to the
+      # mock response. Use: @response
+      def method_missing(name, *args, &amp;block)
+        if @response &amp;&amp; @response.respond_to?(name)
+          @response.send(name, *args, &amp;block)
+        else
+          super
+        end
+      end
     end
+  end
 
-    include Sinatra::Delegator
+  class TestHarness
+    include Test
 
-    # Deprecated. Tests no longer delegate missing methods to the
-    # mock response. Use: @response
-    def method_missing(name, *args, &amp;block)
-      if @response &amp;&amp; @response.respond_to?(name)
-        @response.send(name, *args, &amp;block)
-      else
-        super
-      end
+    def initialize(app=nil)
+      @app = app || Sinatra::Application
     end
   end
 end</diff>
      <filename>lib/sinatra/test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,9 @@
 require 'sinatra/test'
 require 'spec/interop/test'
+
+Sinatra::Default.set(
+  :env =&gt; :test,
+  :run =&gt; false,
+  :raise_errors =&gt; true,
+  :logging =&gt; false
+)</diff>
      <filename>lib/sinatra/test/rspec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,9 @@
 require 'test/spec'
 require 'sinatra/test'
+require 'sinatra/test/unit'
+
+module Sinatra::Test
+  def should
+    @response.should
+  end
+end</diff>
      <filename>lib/sinatra/test/spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
-require 'test/unit'
 require 'sinatra/test'
+require 'test/unit'
 
 Test::Unit::TestCase.send :include, Sinatra::Test
 </diff>
      <filename>lib/sinatra/test/unit.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Sinatra::Base' do
-  include Sinatra::Test
-
   it 'includes Rack::Utils' do
     Sinatra::Base.should.include Rack::Utils
   end</diff>
      <filename>test/base_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;Builder Templates&quot; do
-  include Sinatra::Test
-
   def builder_app(&amp;block)
     mock_app {
       set :views, File.dirname(__FILE__) + '/views'</diff>
      <filename>test/builder_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;ERB Templates&quot; do
-  include Sinatra::Test
-
   def erb_app(&amp;block)
     mock_app {
       set :views, File.dirname(__FILE__) + '/views'</diff>
      <filename>test/erb_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;Filters&quot; do
-  include Sinatra::Test
-
   it &quot;executes filters in the order defined&quot; do
     count = 0
     mock_app do</diff>
      <filename>test/filter_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;HAML Templates&quot; do
-  include Sinatra::Test
-
   def haml_app(&amp;block)
     mock_app {
       set :views, File.dirname(__FILE__) + '/views'</diff>
      <filename>test/haml_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,4 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
-
-class Test::Unit::TestCase
-  include Sinatra::Test
-end
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Sinatra::Helpers' do
   describe '#status' do</diff>
      <filename>test/helpers_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Exception Mappings' do
-  include Sinatra::Test
-
   class FooError &lt; RuntimeError
   end
 </diff>
      <filename>test/mapped_error_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;Middleware&quot; do
-  include Sinatra::Test
-
   before do
     @app = mock_app(Sinatra::Default) {
       get '/*' do</diff>
      <filename>test/middleware_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,7 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Options' do
-  include Sinatra::Test
-
-  before do
-    @app = Class.new(Sinatra::Base)
-  end
+  before { @app = Class.new(Sinatra::Base) }
 
   it 'sets options to literal values' do
     @app.set(:foo, 'bar')</diff>
      <filename>test/options_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,9 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 $reload_count = 0
 $reload_app = nil
 
 describe &quot;Reloading&quot; do
-  include Sinatra::Test
-
   before {
     @app = mock_app(Sinatra::Default)
     $reload_app = @app</diff>
      <filename>test/reload_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,4 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Sinatra::Request' do
   it 'responds to #user_agent' do</diff>
      <filename>test/request_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Result Handling' do
-  include Sinatra::Test
-
   it &quot;sets response.body when result is a String&quot; do
     mock_app {
       get '/' do</diff>
      <filename>test/result_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;Routing&quot; do
-  include Sinatra::Test
-
   %w[get put post delete head].each do |verb|
     it &quot;defines #{verb.upcase} request handlers with #{verb}&quot; do
       mock_app {</diff>
      <filename>test/routing_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe &quot;Sass Templates&quot; do
-  include Sinatra::Test
-
   def sass_app(&amp;block)
     mock_app {
       set :views, File.dirname(__FILE__) + '/views'</diff>
      <filename>test/sass_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,4 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Sinatra' do
   it 'creates a new Sinatra::Base subclass on new' do</diff>
      <filename>test/sinatra_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,10 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Static' do
-  include Sinatra::Test
   F = ::File
 
   before do
-    @app = mock_app {
+    mock_app {
       set :static, true
       set :public, F.dirname(__FILE__)
     }</diff>
      <filename>test/static_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,6 @@
-require 'test/spec'
-require 'sinatra/base'
-require 'sinatra/test'
+require File.dirname(__FILE__) + '/helper'
 
 describe 'Templating' do
-  include Sinatra::Test
-
   def render_app(&amp;block)
     mock_app {
       def render_test(template, data, options, &amp;block)</diff>
      <filename>test/templates_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9482a913a109e70e8732af65588e077108ed7055</id>
    </parent>
  </parents>
  <author>
    <name>Ryan Tomayko</name>
    <email>rtomayko@gmail.com</email>
  </author>
  <url>http://github.com/bmizerany/sinatra/commit/c00a25ee4168e62b52042acc6d5de37991747fdc</url>
  <id>c00a25ee4168e62b52042acc6d5de37991747fdc</id>
  <committed-date>2009-01-14T07:52:04-08:00</committed-date>
  <authored-date>2009-01-13T09:53:53-08:00</authored-date>
  <message>Test framework refactoring

* Adds test/helper.rb and moves mock_app and other code specific
  to testing the framework out of Sinatra::Test.
* Do not require test/unit. The sinatra/test/unit,
  sinatra/test/spec, and sinatra/test/rspec files can be used to
  choose the framework.
* Add Sinatra::TestHarness, which should act similar to the
  Rack::Session proposal here: http://gist.github.com/41270
* Update the README with information on using the different test
  frameworks.</message>
  <tree>99a10029df50ef788534d8b44111d445d9d5077f</tree>
  <committer>
    <name>Ryan Tomayko</name>
    <email>rtomayko@gmail.com</email>
  </committer>
</commit>
