* Splat works
[sinatra.git] / test / application_test.rb
bloba2ab27acdb8d37331ab274b0d46b38099550c761
1 require File.dirname(__FILE__) + '/helper'
3 context "Looking up a request" do
5   setup do
6     @app = Sinatra::Application.new
7   end
9   specify "returns what's at the end" do
10     block = Proc.new { 'Hello' }
11     @app.define_event(:get, '/', &block)
12         
13     result = @app.lookup(
14       'REQUEST_METHOD' => 'GET',
15       'PATH_INFO' => '/'
16     )
17     
18     result.should.not.be.nil
19     result.block.should.be block
20   end
21   
22   specify "takes params in path" do
23     block = Proc.new { 'Hello' }
24     @app.define_event(:get, '/:foo', &block)
25     
26     result = @app.lookup(
27       'REQUEST_METHOD' => 'GET',
28       'PATH_INFO' => '/bar'
29     )
30     
31     result.should.not.be.nil
32     result.block.should.be block
33     result.params.should.equal :foo => 'bar'
34   end
35               
36 end
38 context "An app returns" do
39   
40   setup do
41     @app = Sinatra::Application.new
42   end
43     
44   specify "404 if no events found" do
45     request = Rack::MockRequest.new(@app)
46     result = request.get('/')
47     result.should.be.not_found
48     result.body.should.equal '<h1>Not Found</h1>'
49   end
50   
51   specify "200 if success" do
52     @app.define_event(:get, '/') do
53       'Hello World'
54     end
55     
56     request = Rack::MockRequest.new(@app)
57     result = request.get('/')
58     result.should.be.ok
59     result.body.should.equal 'Hello World'
60   end
61   
62   specify "an objects result from each if it has it" do
63     
64     class TesterWithEach
65       def each
66         yield 'foo'
67         yield 'bar'
68         yield 'baz'
69       end
70     end
71     
72     @app.define_event(:get, '/') do
73       TesterWithEach.new
74     end
75     
76     request = Rack::MockRequest.new(@app)
77     result = request.get('/')
78     result.should.be.ok
79     result.body.should.equal 'foobarbaz'
80     
81   end
82   
83   specify "the body set if set before the last" do
84         
85     @app.define_event(:get, '/') do
86       body 'Blake'
87       'Mizerany'
88     end
89     
90     request = Rack::MockRequest.new(@app)
91     result = request.get('/')
92     result.should.be.ok
93     result.body.should.equal 'Blake'
94     
95   end
96   
97 end
98   
99 context "Events in an app" do
100   
101   setup do
102     @app = Sinatra::Application.new
103   end
104   
105   specify "evaluate in a clean context" do
106     Sinatra::EventContext.class_eval do
107       def foo
108         'foo'
109       end
110     end
111     
112     @app.define_event(:get, '/foo') do
113       foo
114     end
115     
116     request = Rack::MockRequest.new(@app)
117     result = request.get('/foo')
118     result.should.be.ok
119     result.body.should.equal 'foo'
120   end
121   
122   specify "get access to request, response, and params" do
123     @app.define_event(:get, '/:foo') do
124       params[:foo] + params[:bar]
125     end
126     
127     request = Rack::MockRequest.new(@app)
128     result = request.get('/foo?bar=baz')
129     result.should.be.ok
130     result.body.should.equal 'foobaz'
131   end
132   
133   specify "can filters by agent" do
134     
135     @app.define_event(:get, '/', :agent => /Windows/) do
136       request.env['HTTP_USER_AGENT']
137     end
138     
139     Rack::MockRequest::DEFAULT_ENV.merge!('HTTP_USER_AGENT' => 'Windows')
140     
141     request = Rack::MockRequest.new(@app)
142     result = request.get('/')
143     result.should.be.ok
144     result.body.should.equal 'Windows'
146     Rack::MockRequest::DEFAULT_ENV.merge!('HTTP_USER_AGENT' => 'Mac')
148     request = Rack::MockRequest.new(@app)
149     result = request.get('/')
150     result.should.not.be.ok
152     Rack::MockRequest::DEFAULT_ENV.delete('HTTP_USER_AGENT')
153         
154   end
155   
156