manveru-innate 2009.02.06

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/CHANGELOG +1409 -0
  2. data/COPYING +18 -0
  3. data/MANIFEST +100 -0
  4. data/README.md +485 -0
  5. data/Rakefile +139 -0
  6. data/example/app/retro_games.rb +57 -0
  7. data/example/app/whywiki_erb/layout/wiki.html.erb +15 -0
  8. data/example/app/whywiki_erb/spec/wiki.rb +19 -0
  9. data/example/app/whywiki_erb/start.rb +45 -0
  10. data/example/app/whywiki_erb/view/edit.html.erb +6 -0
  11. data/example/app/whywiki_erb/view/index.html.erb +10 -0
  12. data/example/custom_middleware.rb +43 -0
  13. data/example/error_handling.rb +31 -0
  14. data/example/hello.rb +12 -0
  15. data/example/howto_spec.rb +60 -0
  16. data/example/link.rb +35 -0
  17. data/example/providing_hash.rb +46 -0
  18. data/example/session.rb +42 -0
  19. data/innate.gemspec +118 -0
  20. data/lib/innate.rb +191 -0
  21. data/lib/innate/action.rb +156 -0
  22. data/lib/innate/adapter.rb +89 -0
  23. data/lib/innate/cache.rb +117 -0
  24. data/lib/innate/cache/api.rb +106 -0
  25. data/lib/innate/cache/drb.rb +58 -0
  26. data/lib/innate/cache/file_based.rb +39 -0
  27. data/lib/innate/cache/marshal.rb +17 -0
  28. data/lib/innate/cache/memory.rb +22 -0
  29. data/lib/innate/cache/yaml.rb +17 -0
  30. data/lib/innate/core_compatibility/basic_object.rb +9 -0
  31. data/lib/innate/core_compatibility/string.rb +3 -0
  32. data/lib/innate/current.rb +37 -0
  33. data/lib/innate/dynamap.rb +81 -0
  34. data/lib/innate/helper.rb +195 -0
  35. data/lib/innate/helper/aspect.rb +62 -0
  36. data/lib/innate/helper/cgi.rb +39 -0
  37. data/lib/innate/helper/flash.rb +36 -0
  38. data/lib/innate/helper/link.rb +55 -0
  39. data/lib/innate/helper/partial.rb +90 -0
  40. data/lib/innate/helper/redirect.rb +85 -0
  41. data/lib/innate/helper/send_file.rb +18 -0
  42. data/lib/innate/log.rb +23 -0
  43. data/lib/innate/log/color_formatter.rb +43 -0
  44. data/lib/innate/log/hub.rb +72 -0
  45. data/lib/innate/mock.rb +49 -0
  46. data/lib/innate/node.rb +471 -0
  47. data/lib/innate/options.rb +91 -0
  48. data/lib/innate/options/dsl.rb +155 -0
  49. data/lib/innate/request.rb +165 -0
  50. data/lib/innate/response.rb +18 -0
  51. data/lib/innate/route.rb +109 -0
  52. data/lib/innate/session.rb +104 -0
  53. data/lib/innate/session/flash.rb +94 -0
  54. data/lib/innate/setup.rb +23 -0
  55. data/lib/innate/spec.rb +42 -0
  56. data/lib/innate/state.rb +22 -0
  57. data/lib/innate/state/accessor.rb +130 -0
  58. data/lib/innate/state/fiber.rb +68 -0
  59. data/lib/innate/state/thread.rb +39 -0
  60. data/lib/innate/traited.rb +20 -0
  61. data/lib/innate/trinity.rb +22 -0
  62. data/lib/innate/version.rb +3 -0
  63. data/lib/innate/view.rb +67 -0
  64. data/lib/innate/view/erb.rb +17 -0
  65. data/lib/innate/view/none.rb +9 -0
  66. data/lib/rack/middleware_compiler.rb +62 -0
  67. data/lib/rack/reloader.rb +192 -0
  68. data/spec/example/hello.rb +14 -0
  69. data/spec/example/link.rb +29 -0
  70. data/spec/helper.rb +2 -0
  71. data/spec/innate/cache/common.rb +45 -0
  72. data/spec/innate/cache/marshal.rb +5 -0
  73. data/spec/innate/cache/memory.rb +5 -0
  74. data/spec/innate/cache/yaml.rb +5 -0
  75. data/spec/innate/dynamap.rb +22 -0
  76. data/spec/innate/helper.rb +66 -0
  77. data/spec/innate/helper/aspect.rb +80 -0
  78. data/spec/innate/helper/cgi.rb +37 -0
  79. data/spec/innate/helper/flash.rb +148 -0
  80. data/spec/innate/helper/link.rb +82 -0
  81. data/spec/innate/helper/partial.rb +66 -0
  82. data/spec/innate/helper/redirect.rb +148 -0
  83. data/spec/innate/helper/send_file.rb +21 -0
  84. data/spec/innate/helper/view/aspect_hello.erb +1 -0
  85. data/spec/innate/helper/view/locals.erb +1 -0
  86. data/spec/innate/helper/view/loop.erb +4 -0
  87. data/spec/innate/helper/view/num.erb +1 -0
  88. data/spec/innate/helper/view/partial.erb +1 -0
  89. data/spec/innate/helper/view/recursive.erb +8 -0
  90. data/spec/innate/mock.rb +84 -0
  91. data/spec/innate/node.rb +180 -0
  92. data/spec/innate/node/bar.html +1 -0
  93. data/spec/innate/node/foo.html.erb +1 -0
  94. data/spec/innate/node/with_layout.erb +3 -0
  95. data/spec/innate/options.rb +90 -0
  96. data/spec/innate/parameter.rb +154 -0
  97. data/spec/innate/request.rb +73 -0
  98. data/spec/innate/route.rb +129 -0
  99. data/spec/innate/session.rb +59 -0
  100. data/spec/innate/traited.rb +55 -0
  101. metadata +160 -0
@@ -0,0 +1,82 @@
1
+ require 'spec/helper'
2
+
3
+ class One
4
+ include Innate::Node
5
+ map '/'
6
+ end
7
+
8
+ class Two
9
+ include Innate::Node
10
+ map '/two'
11
+ end
12
+
13
+ describe Innate::Helper::Link do
14
+ describe '#route' do
15
+ should 'respond with URI for node' do
16
+ One.route.should == URI('/')
17
+ Two.route.should == URI('/two/')
18
+ end
19
+
20
+ should 'respond with URI for node with path /' do
21
+ One.route('/').should == URI('/')
22
+ Two.route('/').should == URI('/two/')
23
+ end
24
+
25
+ should 'respond with URI for node with path /foo' do
26
+ One.route('/foo').should == URI('/foo')
27
+ One.route(:foo).should == URI('/foo')
28
+
29
+ Two.route('/foo').should == URI('/two/foo')
30
+ Two.route(:foo).should == URI('/two/foo')
31
+ end
32
+
33
+ should 'respond with URI for node with path /foo/bar' do
34
+ One.route('/foo/bar').should == URI('/foo/bar')
35
+ One.route(:foo, :bar).should == URI('/foo/bar')
36
+
37
+ Two.route('/foo/bar').should == URI('/two/foo/bar')
38
+ Two.route(:foo, :bar).should == URI('/two/foo/bar')
39
+ end
40
+
41
+ should 'respond with URI for node with GET params' do
42
+ One.route('/', :a => :b).should == URI('/?a=b')
43
+
44
+ One.route('/foo', :a => :b).should == URI('/foo?a=b')
45
+ One.route(:foo, :a => :b ).should == URI('/foo?a=b')
46
+
47
+ One.route('/foo/bar', :a => :b).should == URI('/foo/bar?a=b')
48
+ One.route(:foo, :bar, :a => :b).should == URI('/foo/bar?a=b')
49
+
50
+ Two.route('/', :a => :b).should == URI('/two/?a=b')
51
+
52
+ Two.route('foo', :a => :b).should == URI('/two/foo?a=b')
53
+ Two.route(:foo, :a => :b ).should == URI('/two/foo?a=b')
54
+ Two.route('/foo/bar', :a => :b).should == URI('/two/foo/bar?a=b')
55
+ Two.route(:foo, :bar, :a => :b).should == URI('/two/foo/bar?a=b')
56
+ end
57
+ end
58
+
59
+ describe '#anchor' do
60
+ should 'respond with a tag with default text' do
61
+ One.anchor('hello').should == '<a href="/hello">hello</a>'
62
+ Two.anchor('hello').should == '<a href="/two/hello">hello</a>'
63
+ end
64
+
65
+ should 'respond with a tag with explicit text' do
66
+ One.anchor('hello', :foo).should == '<a href="/foo">hello</a>'
67
+ Two.anchor('hello', :foo).should == '<a href="/two/foo">hello</a>'
68
+ end
69
+
70
+ should 'pass parameters to #route' do
71
+ One.anchor('hello', :foo, :a => :b).
72
+ should == '<a href="/foo?a=b">hello</a>'
73
+ Two.anchor('hello', :foo, :a => :b).
74
+ should == '<a href="/two/foo?a=b">hello</a>'
75
+ end
76
+
77
+ should 'escape text' do
78
+ One.anchor('<blink> & <a>', :foo).
79
+ should == '<a href="/foo">&lt;blink&gt; &amp; &lt;a&gt;</a>'
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecHelperPartial
4
+ include Innate::Node
5
+ map '/'
6
+
7
+ def index
8
+ '<html><head><title><%= render_partial("/title") %></title></head></html>'
9
+ end
10
+
11
+ def title
12
+ "Title"
13
+ end
14
+
15
+ def with_params
16
+ '<html><head><title><%= render_partial("/message", :msg => "hello") %></title></head></html>'
17
+ end
18
+
19
+ def message
20
+ "Message: #{request[:msg]}"
21
+ end
22
+
23
+ def composed
24
+ @here = 'there'
25
+ 'From Action | ' << render_template("partial.erb")
26
+ end
27
+
28
+ def recursive(locals = false)
29
+ respond render_template('recursive_locals.erb', :n => 1) if locals
30
+ @n = 1
31
+ end
32
+
33
+ def without_ext
34
+ render_template('title')
35
+ end
36
+ end
37
+
38
+ Innate.options.app.root = File.dirname(__FILE__)
39
+
40
+ describe Innate::Helper::Partial do
41
+ behaves_like :mock
42
+
43
+ should 'render partials' do
44
+ get('/').body.should == '<html><head><title>Title</title></head></html>'
45
+ end
46
+
47
+ should 'render partials with params' do
48
+ get('/with_params').body.should == '<html><head><title>Message: hello</title></head></html>'
49
+ end
50
+
51
+ should 'be able to render a template in the current scope' do
52
+ get('/composed').body.strip.should == "From Action | From Partial there"
53
+ end
54
+
55
+ should 'render_template in a loop' do
56
+ get('/loop').body.gsub(/\s/,'').should == '12345'
57
+ end
58
+
59
+ should 'work recursively' do
60
+ get('/recursive').body.gsub(/\s/,'').should == '{1{2{3{44}4}3}2}'
61
+ end
62
+
63
+ should 'not require file extension' do
64
+ get('/without_ext').body.should == 'Title'
65
+ end
66
+ end
@@ -0,0 +1,148 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecRedirectHelper
4
+ include Innate::Node
5
+
6
+ def index
7
+ self.class.name
8
+ end
9
+
10
+ def noop
11
+ 'noop'
12
+ end
13
+
14
+ def redirection
15
+ redirect :index
16
+ end
17
+
18
+ def double_redirection
19
+ redirect :redirection
20
+ end
21
+
22
+ def redirect_referer_action
23
+ redirect_referer
24
+ end
25
+
26
+ def no_actual_redirect
27
+ catch(:redirect){ redirect(:index) }
28
+ 'no actual redirect'
29
+ end
30
+
31
+ def no_actual_double_redirect
32
+ catch(:redirect){ double_redirection }
33
+ 'no actual double redirect'
34
+ end
35
+
36
+ def redirect_method
37
+ redirect r(:noop)
38
+ end
39
+
40
+ def absolute_redirect
41
+ redirect 'http://localhost:7000/noop'
42
+ end
43
+
44
+ def loop
45
+ respond 'no loop'
46
+ 'loop'
47
+ end
48
+
49
+ def respond_with_status
50
+ respond 'not found', 404
51
+ end
52
+
53
+ def destructive_respond
54
+ respond! 'destructive'
55
+ end
56
+
57
+ def redirect_unmodified
58
+ raw_redirect '/noop'
59
+ end
60
+ end
61
+
62
+ Innate.setup_dependencies
63
+ Innate.setup_middleware
64
+
65
+ describe Innate::Helper::Redirect do
66
+ behaves_like :mock
67
+
68
+ @uri = 'http://localhost:7000'
69
+
70
+ should 'retrieve index' do
71
+ get('/').body.should =='SpecRedirectHelper'
72
+ end
73
+
74
+ should 'redirect' do
75
+ got = get("#@uri/redirection")
76
+ got.status.should == 302
77
+ got.headers['Location'].should == "#@uri/index"
78
+ got.headers['Content-Type'].should == "text/html"
79
+ end
80
+
81
+ should 'redirect twice' do
82
+ got = get("#@uri/double_redirection")
83
+ got.status.should == 302
84
+ got.headers['Location'].should == "#@uri/redirection"
85
+ got.headers['Content-Type'].should == "text/html"
86
+ end
87
+
88
+ should 'redirect to referer' do
89
+ got = get("#@uri/redirect_referer_action", 'HTTP_REFERER' => '/noop')
90
+ got.status.should == 302
91
+ got.headers['Location'].should == "#@uri/noop"
92
+ got.headers['Content-Type'].should == "text/html"
93
+ got = get("#@uri/redirect_referer_action", 'HTTP_REFERER' => "#@uri/redirect_referer_action")
94
+ got.status.should == 302
95
+ got.headers['Location'].should == "#@uri/"
96
+ got.headers['Content-Type'].should == "text/html"
97
+ end
98
+
99
+ should 'use #r' do
100
+ got = get("#@uri/redirect_method")
101
+ got.status.should == 302
102
+ got.headers['Location'].should == "#@uri/noop"
103
+ got.headers['Content-Type'].should == "text/html"
104
+ end
105
+
106
+ should 'work with absolute uris' do
107
+ got = get("#@uri/absolute_redirect")
108
+ got.status.should == 302
109
+ got.headers['Location'].should == "#@uri/noop"
110
+ got.headers['Content-Type'].should == "text/html"
111
+ end
112
+
113
+ should 'support #respond' do
114
+ got = get("#@uri/loop")
115
+ got.status.should == 200
116
+ got.body.should == 'no loop'
117
+ end
118
+
119
+ should 'support #respond with status' do
120
+ got = get("#@uri/respond_with_status")
121
+ got.status.should == 404
122
+ got.body.should == 'not found'
123
+ end
124
+
125
+ should 'support #respond!' do
126
+ got = get("#@uri/destructive_respond")
127
+ got.status.should == 200
128
+ got.body.should == 'destructive'
129
+ end
130
+
131
+ should 'redirect without modifying the target' do
132
+ got = get("#@uri/redirect_unmodified")
133
+ got.status.should == 302
134
+ got.headers['Location'].should == '/noop'
135
+ end
136
+
137
+ should 'catch redirection' do
138
+ got = get("#@uri/no_actual_redirect")
139
+ got.status.should == 200
140
+ got.body.should == 'no actual redirect'
141
+ end
142
+
143
+ should 'catch double redirect' do
144
+ got = get("#@uri/no_actual_double_redirect")
145
+ got.status.should == 200
146
+ got.body.should == 'no actual double redirect'
147
+ end
148
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecSendFile
4
+ include Innate::Node
5
+ map '/'
6
+
7
+ def this
8
+ send_file(__FILE__)
9
+ end
10
+ end
11
+
12
+ describe Innate::Helper::SendFile do
13
+ should 'send __FILE__' do
14
+ got = Innate::Mock.get('/this')
15
+
16
+ got.body.should == File.read(__FILE__)
17
+ got.status.should == 200
18
+ got['Content-Length'].should == File.size(__FILE__).to_s
19
+ got['Content-Type'].should == 'text/x-script.ruby'
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ <%= @foo %> <%= @bar %>!
@@ -0,0 +1 @@
1
+ <%= say %>, <%= to %>!
@@ -0,0 +1,4 @@
1
+ <% (1..5).each do |n| %>
2
+ <% @n = n %>
3
+ <%= render_template('num.erb') %>
4
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= @n %>
@@ -0,0 +1 @@
1
+ From Partial <%= @here %>
@@ -0,0 +1,8 @@
1
+ {
2
+ <%= @n %>
3
+ <% if @n < 4 %>
4
+ <% @n += 1 %>
5
+ <%= render_template('recursive.xhtml') %>
6
+ <% end %>
7
+ <%= @n %>
8
+ }
@@ -0,0 +1,84 @@
1
+ require 'spec/helper'
2
+
3
+ class SpecMock
4
+ include Innate::Node
5
+ map '/'
6
+
7
+ def index
8
+ ''
9
+ end
10
+ end
11
+
12
+ class SpecMock2
13
+ include Innate::Node
14
+ map '/deep'
15
+
16
+ def index
17
+ 'spec mock 2'
18
+ end
19
+
20
+ def foo
21
+ 'spec mock 2 foo'
22
+ end
23
+ end
24
+
25
+ describe 'Innate::SpeckMock2' do
26
+ should 'handle get request' do
27
+ response = Innate::Mock.get('/deep/foo')
28
+ # '/foo/bar'
29
+ response.status.should == 200
30
+ response.body.should == 'spec mock 2 foo'
31
+ end
32
+ end
33
+
34
+ describe 'Innate::SpecMock' do
35
+ should 'handle get request' do
36
+ response = Innate::Mock.get('/')
37
+ # '/one'
38
+ response.status.should == 200
39
+ response.body.should == ''
40
+ end
41
+
42
+ should 'handle post request' do
43
+ response = Innate::Mock.post('/')
44
+ # '/'
45
+ response.status.should == 200
46
+ response.body.should == ''
47
+ end
48
+
49
+ should 'handle head request' do
50
+ response = Innate::Mock.head('/')
51
+ response.status.should == 200
52
+ response.body.should == ''
53
+ end
54
+
55
+ should 'handle delete request' do
56
+ response = Innate::Mock.delete('/')
57
+ response.status.should == 200
58
+ response.body.should == ''
59
+ end
60
+
61
+ should 'handle put request' do
62
+ response = Innate::Mock.put('/')
63
+ response.status.should == 200
64
+ response.body.should == ''
65
+ end
66
+
67
+ should 'handle options request' do
68
+ response = Innate::Mock.options('/')
69
+ response.status.should == 200
70
+ response.body.should == ''
71
+ end
72
+
73
+ should 'handle connect request' do
74
+ response = Innate::Mock.connect('/')
75
+ response.status.should == 200
76
+ response.body.should == ''
77
+ end
78
+
79
+ should 'handle trace request' do
80
+ response = Innate::Mock.trace('/')
81
+ response.status.should == 200
82
+ response.body.should == ''
83
+ end
84
+ end
@@ -0,0 +1,180 @@
1
+ require 'spec/helper'
2
+
3
+ Innate.options.app.root = File.dirname(__FILE__)
4
+ Innate.options.app.view = ''
5
+ Innate.options.app.layout = 'node'
6
+
7
+ class SpecNode
8
+ include Innate::Node
9
+ map '/'
10
+ provide :html => :erb, :erb => :none
11
+
12
+ def foo; end
13
+ def bar; end
14
+ def one(arg) end
15
+ def two(arg1, arg2) end
16
+ def more(*args) end
17
+ def default(arg = nil) end
18
+ end
19
+
20
+ class SpecNodeProvide
21
+ include Innate::Node
22
+ map '/provide'
23
+
24
+ provide :html => :erb, :erb => :none
25
+
26
+ def foo
27
+ '<%= 21 * 2 %>'
28
+ end
29
+
30
+ def bar
31
+ '<%= 84 / 2 %>'
32
+ end
33
+ end
34
+
35
+ class SpecNodeProvideTemplate
36
+ include Innate::Node
37
+ map '/provide_template'
38
+
39
+ provide :html => :erb, :erb => :none
40
+
41
+ view_root 'node'
42
+ end
43
+
44
+ class SpecNodeSub < SpecNode
45
+ map '/sub'
46
+
47
+ def bar(arg) end
48
+ end
49
+
50
+ class SpecNodeWithLayout < SpecNodeProvide
51
+ layout 'with_layout'
52
+ map '/layout'
53
+ end
54
+
55
+ class SpecNodeIndex
56
+ include Innate::Node
57
+ map '/spec_index'
58
+
59
+ def index
60
+ "I have no parameters"
61
+ end
62
+ end
63
+
64
+ describe 'Innate::Node' do
65
+ behaves_like :mock
66
+
67
+ def compare(url, hash)
68
+ result = SpecNode.resolve(url)
69
+ result.should.not.be.nil
70
+ hash.each do |key, value|
71
+ result[key.to_s].should == value
72
+ end
73
+ end
74
+
75
+ should 'resolve actions with methods' do
76
+ SpecNode.resolve('/').should.be.nil
77
+ SpecNode.resolve('/index').should.be.nil
78
+
79
+ compare '/foo', :method => 'foo', :params => []
80
+ SpecNode.resolve('/foo/one/two').should.be.nil
81
+
82
+ compare '/bar', :method => 'bar', :params => []
83
+ SpecNode.resolve('/bar/one').should.be.nil
84
+
85
+ SpecNode.resolve('/one').should.be.nil
86
+ compare '/one/1', :method => 'one', :params => ['1']
87
+ SpecNode.resolve('/one/1/2').should.be.nil
88
+ SpecNode.resolve('/one/1/2/3').should.be.nil
89
+
90
+ SpecNode.resolve('/two').should.be.nil
91
+ SpecNode.resolve('/two/1').should.be.nil
92
+ compare '/two/1/2', :method => 'two', :params => %w[1 2]
93
+ SpecNode.resolve('/two/1/2/3').should.be.nil
94
+
95
+ compare '/more', :method => 'more', :params => []
96
+ compare '/more/1', :method => 'more', :params => %w[1]
97
+ compare '/more/1/2', :method => 'more', :params => %w[1 2]
98
+ compare '/more/1/2/3', :method => 'more', :params => %w[1 2 3]
99
+
100
+ compare '/default', :method => 'default', :params => []
101
+ compare '/default/1', :method => 'default', :params => %w[1]
102
+
103
+ # NOTE: these are actually bound to fail when called, but we cannot
104
+ # introspect enough to anticipate this failure
105
+ compare '/default/1/2', :method => 'default', :params => %w[1 2]
106
+ compare '/default/1/2/3', :method => 'default', :params => %w[1 2 3]
107
+ end
108
+
109
+ should 'inherit action methods from superclasses' do
110
+ SpecNodeSub.resolve('/foo').should.not.be.nil
111
+ SpecNodeSub.resolve('/foo/one/two').should.be.nil
112
+ end
113
+
114
+ should 'select correct method from subclasses' do
115
+ SpecNodeSub.resolve('/bar/one').should.not.be.nil
116
+ SpecNodeSub.resolve('/bar').should.be.nil
117
+ end
118
+
119
+ def assert_wish(url, body, content_type)
120
+ got = get(url)
121
+ got.body.strip.should == body
122
+ got.headers['Content-Type'].should == content_type
123
+ end
124
+
125
+ should 'provide html if no wish given' do
126
+ assert_wish('/provide/foo', '42', 'text/html')
127
+ assert_wish('/provide/bar', '42', 'text/html')
128
+ end
129
+
130
+ should 'provide html as wished' do
131
+ assert_wish('/provide/foo.html', '42', 'text/html')
132
+ assert_wish('/provide/bar.html', '42', 'text/html')
133
+ end
134
+
135
+ should 'provide erb as wished' do
136
+ assert_wish('/provide/foo.erb', "<%= 21 * 2 %>", 'text/html')
137
+ assert_wish('/provide/bar.erb', "<%= 84 / 2 %>", 'text/html')
138
+ end
139
+
140
+ should 'fulfill wish with templates' do
141
+ assert_wish('/provide_template/bar.html', "<h1>Hello, World!</h1>",
142
+ 'text/html')
143
+ assert_wish('/provide_template/bar.erb', "<h1>Hello, World!</h1>",
144
+ 'text/html')
145
+
146
+ expected = (0..9).to_a.join
147
+ assert_wish('/provide_template/foo.html', expected, 'text/html')
148
+ # assert_wish('/provide_template/foo.erb', expected, 'text/plain')
149
+ end
150
+
151
+ should 'respond with 404 if no action was found' do
152
+ got = Innate::Mock.get('/does_not_exist')
153
+ got.status.should == 404
154
+ got.body.should == 'Action not found at: "/does_not_exist"'
155
+ got['Content-Type'].should == 'text/plain'
156
+ end
157
+
158
+ should 'respond with yaml' do
159
+ assert_wish('/provide_template/bar.yaml', "--- |\n<h1>Hello, World!</h1>",
160
+ 'text/yaml')
161
+ end
162
+
163
+ should 'respond with json' do
164
+ assert_wish('/provide_template/bar.json', '"<h1>Hello, World!<\\/h1>\\n"',
165
+ 'application/json')
166
+ end
167
+
168
+ should 'wrap with layout' do
169
+ got = Innate::Mock.get('/layout/bar')
170
+ got.status.should == 200
171
+ got.body.should == %(<div class="content">\n 42\n</div>\n)
172
+ got['Content-Type'].should == 'text/html'
173
+ end
174
+
175
+ should 'not get an action with wrong parameters' do
176
+ got = Innate::Mock.get('/spec_index/bar')
177
+ got.status.should == 404
178
+ got.body.should == 'Action not found at: "/bar"'
179
+ end
180
+ end