restrack 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +114 -44
- data/bin/restrack +17 -8
- data/lib/restrack/generator/descendant_controller.rb.erb +35 -0
- data/lib/restrack/generator.rb +24 -5
- data/lib/restrack/resource_controller.rb +113 -112
- data/lib/restrack/resource_request.rb +76 -64
- data/lib/restrack/support.rb +12 -7
- data/lib/restrack/version.rb +1 -1
- data/lib/restrack/web_service.rb +1 -3
- data/restrack.gemspec +4 -1
- data/test/sample_app_1/controllers/bata_controller.rb +13 -0
- data/test/sample_app_1/controllers/foo_bar_controller.rb +35 -4
- data/test/sample_app_1/test/test_controller_actions.rb +23 -0
- data/test/sample_app_1/test/test_controller_inputs.rb +41 -0
- data/test/sample_app_1/test/test_controller_modifiers.rb +108 -23
- data/test/sample_app_1/test/test_formats.rb +65 -62
- data/test/sample_app_1/test/test_resource_request.rb +0 -16
- data/test/sample_app_2/controllers/bazu_controller.rb +2 -0
- data/test/sample_app_2/controllers/foo_bar_controller.rb +4 -4
- data/test/sample_app_2/test/test_controller_modifiers.rb +19 -19
- data/test/sample_app_3/controllers/foo_bar_controller.rb +3 -3
- data/test/sample_app_4/controllers/foo_controller.rb +2 -2
- data/test/sample_app_4/test/test_controller_modifiers.rb +1 -1
- data/test/sample_app_4/test/test_formats.rb +4 -2
- metadata +57 -21
@@ -2,54 +2,61 @@ module RESTRack
|
|
2
2
|
# The ResourceRequest class handles all incoming requests.
|
3
3
|
class ResourceRequest
|
4
4
|
attr_reader :request, :request_id, :input
|
5
|
-
attr_accessor :mime_type, :
|
5
|
+
attr_accessor :mime_type, :url_chain
|
6
6
|
|
7
7
|
# Initialize the ResourceRequest by assigning a request_id and determining the path, format, and controller of the resource.
|
8
8
|
# Accepting options to allow us to override request_id for testing.
|
9
9
|
def initialize(opts)
|
10
10
|
@request = opts[:request]
|
11
11
|
@request_id = opts[:request_id] || get_request_id
|
12
|
-
|
13
12
|
# Write input details to logs
|
14
13
|
RESTRack.request_log.info "{#{@request_id}} #{@request.path_info} requested from #{@request.ip}"
|
15
|
-
|
16
14
|
RESTRack.log.debug "{#{@request_id}} Reading POST Input"
|
17
|
-
|
18
15
|
# Pull input data from POST body
|
19
16
|
@input = read( @request )
|
20
|
-
|
21
17
|
# Setup up the initial routing.
|
22
|
-
|
23
|
-
@
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
@
|
18
|
+
@url_chain = @request.path_info.split('/')
|
19
|
+
@url_chain.shift if @url_chain[0] == ''
|
20
|
+
# Pull extension from URL
|
21
|
+
extension = ''
|
22
|
+
unless @url_chain[-1].nil?
|
23
|
+
@url_chain[-1] = @url_chain[-1].sub(/\.([^.]*)$/) do |s|
|
24
|
+
extension = $1.downcase
|
25
|
+
'' # Return an empty string as the substitution so that the extension is removed from `@url_chain[-1]`
|
26
|
+
end
|
27
|
+
end
|
28
|
+
# Determine MIME type from extension
|
29
|
+
@mime_type = get_mime_type_from( extension )
|
30
|
+
# Pull first controller from URL
|
31
|
+
@active_resource_name = @url_chain.shift
|
32
|
+
unless @active_resource_name.nil? or RESTRack.controller_exists?(@active_resource_name)
|
33
|
+
@url_chain.unshift( @active_resource_name )
|
34
|
+
end
|
35
|
+
if @active_resource_name.nil? or not RESTRack.controller_exists?(@active_resource_name)
|
36
|
+
raise HTTP404ResourceNotFound unless RESTRack::CONFIG[:DEFAULT_RESOURCE]
|
37
|
+
@active_resource_name = RESTRack::CONFIG[:DEFAULT_RESOURCE]
|
38
|
+
end
|
39
|
+
raise HTTP403Forbidden unless RESTRack::CONFIG[:ROOT_RESOURCE_ACCEPT].blank? or RESTRack::CONFIG[:ROOT_RESOURCE_ACCEPT].include?(@active_resource_name)
|
40
|
+
raise HTTP403Forbidden if not RESTRack::CONFIG[:ROOT_RESOURCE_DENY].blank? and RESTRack::CONFIG[:ROOT_RESOURCE_DENY].include?(@active_resource_name)
|
41
|
+
@active_controller = instantiate_controller( @active_resource_name )
|
37
42
|
end
|
38
43
|
|
39
|
-
|
40
|
-
|
41
|
-
RESTRack.log.debug "{#{@request_id}} Processing Request"
|
42
|
-
@resource.call
|
44
|
+
def content_type
|
45
|
+
@mime_type.to_s
|
43
46
|
end
|
44
47
|
|
45
48
|
# Send out the typed resource's output, this must occur after a call to run.
|
46
|
-
def
|
49
|
+
def response
|
47
50
|
RESTRack.log.debug "{#{@request_id}} Retrieving Output"
|
48
|
-
@
|
51
|
+
package( @active_controller.call )
|
49
52
|
end
|
50
53
|
|
51
|
-
|
52
|
-
|
54
|
+
# Call the next entity in the path stack.
|
55
|
+
# Method called by controller relationship methods.
|
56
|
+
def call_controller(resource_name)
|
57
|
+
@active_resource_name = resource_name
|
58
|
+
@active_controller = instantiate_controller( resource_name.to_s.camelize )
|
59
|
+
@active_controller.call
|
53
60
|
end
|
54
61
|
|
55
62
|
private
|
@@ -58,18 +65,19 @@ module RESTRack
|
|
58
65
|
return t.strftime('%FT%T') + '.' + t.usec.to_s
|
59
66
|
end
|
60
67
|
|
68
|
+
# Pull input data from POST body
|
61
69
|
def read(request)
|
62
70
|
input = ''
|
63
|
-
|
71
|
+
if request.content_type.blank?
|
72
|
+
input = request.body.read
|
73
|
+
else
|
64
74
|
request_mime_type = MIME::Type.new( request.content_type )
|
65
75
|
if request_mime_type.like?( RESTRack.mime_type_for( :JSON ) )
|
66
76
|
input = JSON.parse( request.body.read )
|
67
77
|
elsif request_mime_type.like?( RESTRack.mime_type_for( :XML ) )
|
68
|
-
input = XmlSimple.
|
78
|
+
input = XmlSimple.xml_in( request.body.read )
|
69
79
|
elsif request_mime_type.like?( RESTRack.mime_type_for( :YAML ) )
|
70
80
|
input = YAML.parse( request.body.read )
|
71
|
-
elsif request_mime_type.like?( RESTRack.mime_type_for( :TEXT ) )
|
72
|
-
input = request.body.read.to_s
|
73
81
|
else
|
74
82
|
input = request.body.read
|
75
83
|
end
|
@@ -78,18 +86,7 @@ module RESTRack
|
|
78
86
|
input
|
79
87
|
end
|
80
88
|
|
81
|
-
#
|
82
|
-
def split_extension_from(path_stack)
|
83
|
-
extension = ''
|
84
|
-
unless path_stack.nil?
|
85
|
-
path_stack = path_stack.sub(/\.([^.]*)$/) do |s|
|
86
|
-
extension = $1.downcase
|
87
|
-
'' # Return an empty string as the substitution so that the extension is removed from `path_stack`
|
88
|
-
end
|
89
|
-
end
|
90
|
-
[path_stack, extension]
|
91
|
-
end
|
92
|
-
|
89
|
+
# Determine the MIME type of the request from the extension provided.
|
93
90
|
def get_mime_type_from(extension)
|
94
91
|
unless extension == ''
|
95
92
|
mime_type = RESTRack.mime_type_for( extension )
|
@@ -104,32 +101,47 @@ module RESTRack
|
|
104
101
|
mime_type
|
105
102
|
end
|
106
103
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
104
|
+
# Called from the locate method, this method dynamically finds the class based on the URI and instantiates an object of that class via the __init method on RESTRack::ResourceController.
|
105
|
+
def instantiate_controller( resource_name )
|
106
|
+
RESTRack.log.debug "{#{@request_id}} Locating Resource #{resource_name}"
|
107
|
+
begin
|
108
|
+
return RESTRack.controller_class_for( resource_name ).__init(self)
|
109
|
+
rescue
|
110
|
+
raise HTTP404ResourceNotFound, "The resource #{RESTRack::CONFIG[:SERVICE_NAME]}::#{RESTRack.controller_name(resource_name)} could not be instantiated."
|
113
111
|
end
|
114
|
-
[resource_name, path_stack]
|
115
112
|
end
|
116
113
|
|
117
|
-
|
118
|
-
|
119
|
-
if
|
120
|
-
|
121
|
-
|
114
|
+
# This handles outputing properly formatted content based on the file extension in the URL.
|
115
|
+
def package(data)
|
116
|
+
if @mime_type.like?( RESTRack.mime_type_for( :JSON ) )
|
117
|
+
@output = data.to_json
|
118
|
+
elsif @mime_type.like?( RESTRack.mime_type_for( :XML ) )
|
119
|
+
if File.exists? builder_file
|
120
|
+
@output = builder_up(data)
|
121
|
+
else
|
122
|
+
@output = XmlSimple.xml_out(data, 'AttrPrefix' => true, 'XmlDeclaration' => true)
|
123
|
+
end
|
124
|
+
elsif @mime_type.like?(RESTRack.mime_type_for( :YAML ) )
|
125
|
+
@output = YAML.dump(data)
|
126
|
+
elsif @mime_type.like?(RESTRack.mime_type_for( :TEXT ) )
|
127
|
+
@output = data.to_s
|
128
|
+
else
|
129
|
+
@output = data
|
122
130
|
end
|
123
|
-
[id, action, path_stack]
|
124
131
|
end
|
125
132
|
|
126
|
-
#
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
+
# Use Builder to generate the XML.
|
134
|
+
def builder_up(data)
|
135
|
+
buffer = ''
|
136
|
+
xml = Builder::XmlMarkup.new(:target => buffer)
|
137
|
+
xml.instruct!
|
138
|
+
eval( File.new( builder_file ).read )
|
139
|
+
return buffer
|
140
|
+
end
|
141
|
+
|
142
|
+
# Builds the path to the builder file for the current controller action.
|
143
|
+
def builder_file
|
144
|
+
"#{RESTRack::CONFIG[:ROOT]}/views/#{@active_resource_name}/#{@active_controller.action}.xml.builder"
|
133
145
|
end
|
134
146
|
|
135
147
|
end # class ResourceRequest
|
data/lib/restrack/support.rb
CHANGED
@@ -30,19 +30,24 @@ module RESTRack
|
|
30
30
|
MIME::Types.type_for(format.to_s.downcase)[0]
|
31
31
|
end
|
32
32
|
|
33
|
-
def self.
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
def self.controller_exists?(resource_name)
|
34
|
+
begin
|
35
|
+
return Kernel.const_get( RESTRack::CONFIG[:SERVICE_NAME].to_sym ).const_defined?( controller_name(resource_name).to_sym )
|
36
|
+
rescue # constants can't start with numerics
|
37
|
+
return false
|
38
|
+
end
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
def self.controller_class_for(resource_name)
|
41
42
|
Kernel.const_get( RESTRack::CONFIG[:SERVICE_NAME].to_sym ).const_get( controller_name(resource_name).to_sym )
|
42
43
|
end
|
43
44
|
|
44
45
|
def self.controller_name(resource_name)
|
45
|
-
"#{resource_name.camelize}Controller".to_sym
|
46
|
+
"#{resource_name.to_s.camelize}Controller".to_sym
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.controller_has_action?(resource_name, action)
|
50
|
+
controller_class_for(resource_name).const_defined?( action.to_sym )
|
46
51
|
end
|
47
52
|
|
48
53
|
end
|
data/lib/restrack/version.rb
CHANGED
data/lib/restrack/web_service.rb
CHANGED
@@ -11,9 +11,7 @@ module RESTRack
|
|
11
11
|
request = Rack::Request.new(env)
|
12
12
|
begin
|
13
13
|
resource_request = RESTRack::ResourceRequest.new( :request => request )
|
14
|
-
resource_request.
|
15
|
-
resource_request.call
|
16
|
-
response = resource_request.output
|
14
|
+
response = resource_request.response
|
17
15
|
return valid resource_request, response
|
18
16
|
rescue Exception => exception
|
19
17
|
return caught resource_request, exception
|
data/restrack.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ['Chris St. John']
|
10
10
|
s.email = ['chris@stjohnstudios.com']
|
11
|
-
s.homepage = 'http://github.com/stjohncj'
|
11
|
+
s.homepage = 'http://github.com/stjohncj/RESTRack'
|
12
12
|
s.summary = %q{A lightweight MVC framework developed specifically for JSON and XML REST services.}
|
13
13
|
s.description = %q{RESTRack is a Rack based MVC framework that makes it extremely easy to
|
14
14
|
develop RESTful data services. It is inspired by Rails, and follows a few of
|
@@ -32,6 +32,9 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
33
33
|
s.require_paths = ["lib"]
|
34
34
|
|
35
|
+
s.add_runtime_dependency 'rack'
|
36
|
+
s.add_runtime_dependency 'rack-test'
|
37
|
+
s.add_runtime_dependency 'i18n'
|
35
38
|
s.add_runtime_dependency 'json'
|
36
39
|
s.add_runtime_dependency 'xml-simple', '>= 1.0.13'
|
37
40
|
s.add_runtime_dependency 'builder'
|
@@ -1,6 +1,9 @@
|
|
1
1
|
class SampleApp::FooBarController < RESTRack::ResourceController
|
2
2
|
|
3
|
-
|
3
|
+
pass_through_to( :bata )
|
4
|
+
pass_through_to( :bata, :as => :other_bata )
|
5
|
+
|
6
|
+
has_relationship_to( :baz ) do |id|
|
4
7
|
if id =='144'
|
5
8
|
output = '777'
|
6
9
|
else
|
@@ -9,7 +12,7 @@ class SampleApp::FooBarController < RESTRack::ResourceController
|
|
9
12
|
output # You can't "return" from a Proc! It will do a "return" in the outer method. Remember a "Proc" is not a Method.
|
10
13
|
end
|
11
14
|
|
12
|
-
|
15
|
+
has_relationship_to( :bat, :as => :slugger ) do |id|
|
13
16
|
if id =='144'
|
14
17
|
output = '777'
|
15
18
|
else
|
@@ -18,9 +21,13 @@ class SampleApp::FooBarController < RESTRack::ResourceController
|
|
18
21
|
output # You can't "return" from a Proc! It will do a "return" in the outer method. Remember a "Proc" is not a Method.
|
19
22
|
end
|
20
23
|
|
21
|
-
|
24
|
+
has_relationships_to( :baza, :as => :children ) do |id|
|
22
25
|
[1,2,3,4,5,6,7,8,9]
|
23
26
|
end
|
27
|
+
|
28
|
+
has_defined_relationships_to( :baza, :as => :def ) do |id|
|
29
|
+
[1,8,9,17]
|
30
|
+
end
|
24
31
|
|
25
32
|
has_mapped_relationships_to( :bazu, :as => :maps ) do |id|
|
26
33
|
{
|
@@ -47,7 +54,19 @@ class SampleApp::FooBarController < RESTRack::ResourceController
|
|
47
54
|
if id == '1234567890'
|
48
55
|
return { :foo => 'abc', :bar => '123', 'baz' => 456, :more => { :one => 1, :two => [1,2], :three => :deep_fu } }
|
49
56
|
end
|
50
|
-
|
57
|
+
if id == '42'
|
58
|
+
return {
|
59
|
+
:foo => 'abc',
|
60
|
+
:bar => 123,
|
61
|
+
:baz => {
|
62
|
+
'one' => [1],
|
63
|
+
'two' => ['1','2'],
|
64
|
+
'three' => ['1', 2, {:three => 3}],
|
65
|
+
4 => :four
|
66
|
+
}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
return { :foo => 'bar', :baz => 123 }
|
51
70
|
end
|
52
71
|
def update(id)
|
53
72
|
{ :success => true }
|
@@ -59,4 +78,16 @@ class SampleApp::FooBarController < RESTRack::ResourceController
|
|
59
78
|
{ :success => true }
|
60
79
|
end
|
61
80
|
|
81
|
+
def echo
|
82
|
+
return @resource_request.input
|
83
|
+
end
|
84
|
+
|
85
|
+
def custom_entity(id)
|
86
|
+
return id
|
87
|
+
end
|
88
|
+
|
89
|
+
def custom_collection
|
90
|
+
return [1,1,2,3,5,8,13,21,34]
|
91
|
+
end
|
92
|
+
|
62
93
|
end
|
@@ -107,6 +107,29 @@ class SampleApp::TestControllerActions < Test::Unit::TestCase
|
|
107
107
|
assert_equal test_val, output[2]
|
108
108
|
end
|
109
109
|
|
110
|
+
def test_custom_entity_action
|
111
|
+
env = Rack::MockRequest.env_for('/foo_bar/7476/custom_entity', {
|
112
|
+
:method => 'GET'
|
113
|
+
})
|
114
|
+
output = ''
|
115
|
+
assert_nothing_raised do
|
116
|
+
output = @ws.call(env)
|
117
|
+
end
|
118
|
+
test_val = '7476'.to_json
|
119
|
+
assert_equal test_val, output[2]
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_custom_collection_action
|
123
|
+
env = Rack::MockRequest.env_for('/foo_bar/custom_collection', {
|
124
|
+
:method => 'GET'
|
125
|
+
})
|
126
|
+
output = ''
|
127
|
+
assert_nothing_raised do
|
128
|
+
output = @ws.call(env)
|
129
|
+
end
|
130
|
+
test_val = [1,1,2,3,5,8,13,21,34].to_json
|
131
|
+
assert_equal test_val, output[2]
|
132
|
+
end
|
110
133
|
|
111
134
|
def test_missing
|
112
135
|
env = Rack::MockRequest.env_for('/foo_bar/144/missing', {
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'rack/test'
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','loader'))
|
5
|
+
require 'pp'
|
6
|
+
|
7
|
+
class SampleApp::TestControllerInputs < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@ws = SampleApp::WebService.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_post_no_content_type
|
14
|
+
test_val = "random text" # will be converted to json because of default response type
|
15
|
+
env = Rack::MockRequest.env_for('/foo_bar/echo', {
|
16
|
+
:method => 'POST',
|
17
|
+
:input => test_val
|
18
|
+
})
|
19
|
+
output = ''
|
20
|
+
assert_nothing_raised do
|
21
|
+
output = @ws.call(env)
|
22
|
+
end
|
23
|
+
assert_equal test_val.to_json, output[2] # will be converted to json because of default response type
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_post_json
|
27
|
+
test_val = { :echo => 'niner' }.to_json
|
28
|
+
env = Rack::MockRequest.env_for('/foo_bar/echo', {
|
29
|
+
:method => 'POST',
|
30
|
+
:input => test_val,
|
31
|
+
'CONTENT_TYPE' => 'application/json'
|
32
|
+
})
|
33
|
+
output = ''
|
34
|
+
assert_nothing_raised do
|
35
|
+
output = @ws.call(env)
|
36
|
+
end
|
37
|
+
assert_equal test_val, output[2]
|
38
|
+
end
|
39
|
+
# TODO: Test all input formats
|
40
|
+
|
41
|
+
end
|
@@ -9,7 +9,49 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
9
9
|
def setup
|
10
10
|
@ws = SampleApp::WebService.new
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
|
+
def test_pass_through_to
|
14
|
+
env = Rack::MockRequest.env_for('/foo_bar/144/bata/777', {
|
15
|
+
:method => 'GET'
|
16
|
+
})
|
17
|
+
output = ''
|
18
|
+
assert_nothing_raised do
|
19
|
+
output = @ws.call(env)
|
20
|
+
end
|
21
|
+
test_val = { :BAZ => 'ALOHA!' }.to_json
|
22
|
+
assert_equal test_val, output[2]
|
23
|
+
|
24
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/bata/abc', {
|
25
|
+
:method => 'GET'
|
26
|
+
})
|
27
|
+
output = ''
|
28
|
+
assert_nothing_raised do
|
29
|
+
output = @ws.call(env)
|
30
|
+
end
|
31
|
+
test_val = { :OTHER => 'YUP' }.to_json
|
32
|
+
assert_equal test_val, output[2]
|
33
|
+
|
34
|
+
env = Rack::MockRequest.env_for('/foo_bar/144/bata/', {
|
35
|
+
:method => 'GET'
|
36
|
+
})
|
37
|
+
output = ''
|
38
|
+
assert_nothing_raised do
|
39
|
+
output = @ws.call(env)
|
40
|
+
end
|
41
|
+
test_val = [1,2,3,4,5].to_json
|
42
|
+
assert_equal test_val, output[2]
|
43
|
+
|
44
|
+
env = Rack::MockRequest.env_for('/foo_bar/144/other_bata', {
|
45
|
+
:method => 'GET'
|
46
|
+
})
|
47
|
+
output = ''
|
48
|
+
assert_nothing_raised do
|
49
|
+
output = @ws.call(env)
|
50
|
+
end
|
51
|
+
test_val = [1,2,3,4,5].to_json
|
52
|
+
assert_equal test_val, output[2]
|
53
|
+
end
|
54
|
+
|
13
55
|
def test_has_relationship_to
|
14
56
|
env = Rack::MockRequest.env_for('/foo_bar/144/baz', {
|
15
57
|
:method => 'GET'
|
@@ -18,9 +60,9 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
18
60
|
assert_nothing_raised do
|
19
61
|
output = @ws.call(env)
|
20
62
|
end
|
21
|
-
test_val = { :BAZ => '
|
63
|
+
test_val = { :BAZ => 'ALOHA!' }.to_json
|
22
64
|
assert_equal test_val, output[2]
|
23
|
-
|
65
|
+
|
24
66
|
env = Rack::MockRequest.env_for('/foo_bar/133/baz', {
|
25
67
|
:method => 'GET'
|
26
68
|
})
|
@@ -30,7 +72,7 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
30
72
|
end
|
31
73
|
test_val = { :OTHER => 'YUP' }.to_json
|
32
74
|
assert_equal test_val, output[2]
|
33
|
-
|
75
|
+
|
34
76
|
env = Rack::MockRequest.env_for('/foo_bar/144/baz/', {
|
35
77
|
:method => 'GET'
|
36
78
|
})
|
@@ -38,11 +80,11 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
38
80
|
assert_nothing_raised do
|
39
81
|
output = @ws.call(env)
|
40
82
|
end
|
41
|
-
test_val = { :BAZ => '
|
83
|
+
test_val = { :BAZ => 'ALOHA!' }.to_json
|
42
84
|
assert_equal test_val, output[2]
|
43
|
-
|
44
|
-
|
45
|
-
|
85
|
+
|
86
|
+
#------
|
87
|
+
|
46
88
|
env = Rack::MockRequest.env_for('/foo_bar/144/slugger', {
|
47
89
|
:method => 'GET'
|
48
90
|
})
|
@@ -50,9 +92,9 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
50
92
|
assert_nothing_raised do
|
51
93
|
output = @ws.call(env)
|
52
94
|
end
|
53
|
-
test_val = { :WOM => '
|
95
|
+
test_val = { :WOM => 'NOBAT!' }.to_json
|
54
96
|
assert_equal test_val, output[2]
|
55
|
-
|
97
|
+
|
56
98
|
env = Rack::MockRequest.env_for('/foo_bar/133/slugger', {
|
57
99
|
:method => 'GET'
|
58
100
|
})
|
@@ -62,7 +104,7 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
62
104
|
end
|
63
105
|
test_val = { :SUHWING => 'BATTER' }.to_json
|
64
106
|
assert_equal test_val, output[2]
|
65
|
-
|
107
|
+
|
66
108
|
env = Rack::MockRequest.env_for('/foo_bar/144/slugger/', {
|
67
109
|
:method => 'GET'
|
68
110
|
})
|
@@ -70,12 +112,12 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
70
112
|
assert_nothing_raised do
|
71
113
|
output = @ws.call(env)
|
72
114
|
end
|
73
|
-
test_val = { :WOM => '
|
115
|
+
test_val = { :WOM => 'NOBAT!' }.to_json
|
74
116
|
assert_equal test_val, output[2]
|
75
117
|
end
|
76
|
-
|
77
|
-
def
|
78
|
-
env = Rack::MockRequest.env_for('/foo_bar/133/children/
|
118
|
+
|
119
|
+
def test_has_relationships_to
|
120
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/children/0', {
|
79
121
|
:method => 'GET'
|
80
122
|
})
|
81
123
|
output = ''
|
@@ -84,8 +126,8 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
84
126
|
end
|
85
127
|
test_val = { :BAZA => 'YESSIR' }.to_json
|
86
128
|
assert_equal test_val, output[2]
|
87
|
-
|
88
|
-
env = Rack::MockRequest.env_for('/foo_bar/133/children/
|
129
|
+
|
130
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/children/7', {
|
89
131
|
:method => 'GET'
|
90
132
|
})
|
91
133
|
output = ''
|
@@ -94,7 +136,7 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
94
136
|
end
|
95
137
|
test_val = { :NOWAY => 'JOSE' }.to_json
|
96
138
|
assert_equal test_val, output[2]
|
97
|
-
|
139
|
+
|
98
140
|
env = Rack::MockRequest.env_for('/foo_bar/133/children/11', {
|
99
141
|
:method => 'GET'
|
100
142
|
})
|
@@ -104,7 +146,50 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
104
146
|
end
|
105
147
|
assert_equal 404, output[0]
|
106
148
|
end
|
107
|
-
|
149
|
+
|
150
|
+
def test_has_defined_relationships_to
|
151
|
+
# goes to baza
|
152
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/def/1', {
|
153
|
+
:method => 'GET'
|
154
|
+
})
|
155
|
+
output = ''
|
156
|
+
assert_nothing_raised do
|
157
|
+
output = @ws.call(env)
|
158
|
+
end
|
159
|
+
test_val = { :BAZA => 'YESSIR' }.to_json
|
160
|
+
assert_equal test_val, output[2]
|
161
|
+
|
162
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/def/8', {
|
163
|
+
:method => 'GET'
|
164
|
+
})
|
165
|
+
output = ''
|
166
|
+
assert_nothing_raised do
|
167
|
+
output = @ws.call(env)
|
168
|
+
end
|
169
|
+
test_val = { :NOWAY => 'JOSE' }.to_json
|
170
|
+
assert_equal test_val, output[2]
|
171
|
+
|
172
|
+
# this should 404
|
173
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/def/11', {
|
174
|
+
:method => 'GET'
|
175
|
+
})
|
176
|
+
output = ''
|
177
|
+
assert_nothing_raised do
|
178
|
+
output = @ws.call(env)
|
179
|
+
end
|
180
|
+
assert_equal 404, output[0]
|
181
|
+
|
182
|
+
# this should 400
|
183
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/def', {
|
184
|
+
:method => 'GET'
|
185
|
+
})
|
186
|
+
output = ''
|
187
|
+
assert_nothing_raised do
|
188
|
+
output = @ws.call(env)
|
189
|
+
end
|
190
|
+
assert_equal 400, output[0]
|
191
|
+
end
|
192
|
+
|
108
193
|
def test_has_mapped_relationships_to
|
109
194
|
env = Rack::MockRequest.env_for('/foo_bar/133/maps/first', {
|
110
195
|
:method => 'GET'
|
@@ -115,7 +200,7 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
115
200
|
end
|
116
201
|
test_val = '1'
|
117
202
|
assert_equal test_val, output[2]
|
118
|
-
|
203
|
+
|
119
204
|
env = Rack::MockRequest.env_for('/foo_bar/133/maps/second', {
|
120
205
|
:method => 'GET'
|
121
206
|
})
|
@@ -125,7 +210,7 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
125
210
|
end
|
126
211
|
test_val = '0'
|
127
212
|
assert_equal test_val, output[2]
|
128
|
-
|
213
|
+
|
129
214
|
env = Rack::MockRequest.env_for('/foo_bar/133/maps/third', {
|
130
215
|
:method => 'GET'
|
131
216
|
})
|
@@ -136,10 +221,10 @@ class SampleApp::TestControllerModifiers < Test::Unit::TestCase
|
|
136
221
|
test_val = '0'
|
137
222
|
assert_equal test_val, output[2]
|
138
223
|
end
|
139
|
-
|
224
|
+
|
140
225
|
def test_keyed_with_type
|
141
226
|
# baza controller exercises this option
|
142
|
-
env = Rack::MockRequest.env_for('/foo_bar/133/children/
|
227
|
+
env = Rack::MockRequest.env_for('/foo_bar/133/children/0', {
|
143
228
|
:method => 'GET'
|
144
229
|
})
|
145
230
|
output = ''
|