rabl 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +34 -0
- data/Gemfile +14 -1
- data/README.md +53 -4
- data/Rakefile +26 -1
- data/fixtures/ashared/NOTES +35 -0
- data/fixtures/ashared/README +35 -0
- data/fixtures/ashared/migrate/20111002092016_create_users.rb +15 -0
- data/fixtures/ashared/migrate/20111002092019_create_posts.rb +14 -0
- data/fixtures/ashared/migrate/20111002092024_create_phone_numbers.rb +16 -0
- data/fixtures/ashared/models/phone_number.rb +7 -0
- data/fixtures/ashared/models/post.rb +3 -0
- data/fixtures/ashared/models/user.rb +3 -0
- data/fixtures/ashared/views/layouts/application.html.erb +6 -0
- data/fixtures/ashared/views/posts/date.json.rabl +3 -0
- data/fixtures/ashared/views/posts/index.json.rabl +11 -0
- data/fixtures/ashared/views/posts/show.json.rabl +16 -0
- data/fixtures/ashared/views/users/index.rabl +3 -0
- data/fixtures/ashared/views/users/phone_number.rabl +6 -0
- data/fixtures/ashared/views/users/show.rabl +16 -0
- data/fixtures/padrino_test/.components +7 -0
- data/fixtures/padrino_test/.gitignore +7 -0
- data/fixtures/padrino_test/Gemfile +17 -0
- data/fixtures/padrino_test/Rakefile +3 -0
- data/fixtures/padrino_test/app/app.rb +59 -0
- data/fixtures/padrino_test/app/controllers/posts.rb +11 -0
- data/fixtures/padrino_test/app/controllers/users.rb +11 -0
- data/fixtures/padrino_test/app/helpers/posts_helper.rb +7 -0
- data/fixtures/padrino_test/app/helpers/users_helper.rb +7 -0
- data/fixtures/padrino_test/config.ru +9 -0
- data/fixtures/padrino_test/config/apps.rb +34 -0
- data/fixtures/padrino_test/config/boot.rb +29 -0
- data/fixtures/padrino_test/config/database.rb +43 -0
- data/fixtures/padrino_test/db/schema.rb +42 -0
- data/fixtures/padrino_test/public/favicon.ico +0 -0
- data/fixtures/padrino_test/test/app/controllers/posts_controller_test.rb +108 -0
- data/fixtures/padrino_test/test/app/controllers/users_controller_test.rb +87 -0
- data/fixtures/padrino_test/test/test.rake +18 -0
- data/fixtures/padrino_test/test/test_config.rb +18 -0
- data/fixtures/rails2/.gitignore +1 -0
- data/fixtures/rails2/Gemfile +8 -0
- data/fixtures/rails2/Rakefile +14 -0
- data/fixtures/rails2/app/controllers/application_controller.rb +10 -0
- data/fixtures/rails2/app/controllers/posts_controller.rb +15 -0
- data/fixtures/rails2/app/controllers/users_controller.rb +15 -0
- data/fixtures/rails2/config/boot.rb +129 -0
- data/fixtures/rails2/config/database.yml +16 -0
- data/fixtures/rails2/config/environment.rb +42 -0
- data/fixtures/rails2/config/environments/development.rb +17 -0
- data/fixtures/rails2/config/environments/production.rb +28 -0
- data/fixtures/rails2/config/environments/test.rb +28 -0
- data/fixtures/rails2/config/initializers/backtrace_silencers.rb +7 -0
- data/fixtures/rails2/config/initializers/cookie_verification_secret.rb +7 -0
- data/fixtures/rails2/config/initializers/inflections.rb +10 -0
- data/fixtures/rails2/config/initializers/mime_types.rb +5 -0
- data/fixtures/rails2/config/initializers/new_rails_defaults.rb +21 -0
- data/fixtures/rails2/config/initializers/session_store.rb +15 -0
- data/fixtures/rails2/config/locales/en.yml +5 -0
- data/fixtures/rails2/config/preinitializer.rb +20 -0
- data/fixtures/rails2/config/routes.rb +45 -0
- data/fixtures/rails2/db/schema.rb +40 -0
- data/fixtures/rails2/db/seeds.rb +7 -0
- data/fixtures/rails2/public/404.html +30 -0
- data/fixtures/rails2/public/422.html +30 -0
- data/fixtures/rails2/public/500.html +30 -0
- data/fixtures/rails2/public/favicon.ico +0 -0
- data/fixtures/rails2/public/images/rails.png +0 -0
- data/fixtures/rails2/public/index.html +275 -0
- data/fixtures/rails2/public/robots.txt +5 -0
- data/fixtures/rails2/script/about +4 -0
- data/fixtures/rails2/script/console +3 -0
- data/fixtures/rails2/script/dbconsole +3 -0
- data/fixtures/rails2/script/destroy +3 -0
- data/fixtures/rails2/script/generate +3 -0
- data/fixtures/rails2/script/performance/benchmarker +3 -0
- data/fixtures/rails2/script/performance/profiler +3 -0
- data/fixtures/rails2/script/plugin +3 -0
- data/fixtures/rails2/script/runner +3 -0
- data/fixtures/rails2/script/server +3 -0
- data/fixtures/rails2/test/functionals/posts_controller_test.rb +108 -0
- data/fixtures/rails2/test/functionals/users_controller_test.rb +87 -0
- data/fixtures/rails2/test/test_helper.rb +33 -0
- data/fixtures/rails3/.gitignore +4 -0
- data/fixtures/rails3/Gemfile +37 -0
- data/fixtures/rails3/Rakefile +12 -0
- data/fixtures/rails3/app/controllers/application_controller.rb +14 -0
- data/fixtures/rails3/app/controllers/posts_controller.rb +11 -0
- data/fixtures/rails3/app/controllers/users_controller.rb +11 -0
- data/fixtures/rails3/config.ru +4 -0
- data/fixtures/rails3/config/application.rb +42 -0
- data/fixtures/rails3/config/boot.rb +6 -0
- data/fixtures/rails3/config/database.yml +22 -0
- data/fixtures/rails3/config/environment.rb +5 -0
- data/fixtures/rails3/config/environments/development.rb +26 -0
- data/fixtures/rails3/config/environments/production.rb +49 -0
- data/fixtures/rails3/config/environments/test.rb +35 -0
- data/fixtures/rails3/config/initializers/backtrace_silencers.rb +7 -0
- data/fixtures/rails3/config/initializers/inflections.rb +10 -0
- data/fixtures/rails3/config/initializers/mime_types.rb +5 -0
- data/fixtures/rails3/config/initializers/secret_token.rb +7 -0
- data/fixtures/rails3/config/initializers/session_store.rb +8 -0
- data/fixtures/rails3/config/locales/en.yml +5 -0
- data/fixtures/rails3/config/routes.rb +61 -0
- data/fixtures/rails3/db/seeds.rb +7 -0
- data/fixtures/rails3/lib/tasks/.gitkeep +0 -0
- data/fixtures/rails3/public/404.html +26 -0
- data/fixtures/rails3/public/422.html +26 -0
- data/fixtures/rails3/public/500.html +26 -0
- data/fixtures/rails3/public/favicon.ico +0 -0
- data/fixtures/rails3/public/images/rails.png +0 -0
- data/fixtures/rails3/public/index.html +239 -0
- data/fixtures/rails3/public/robots.txt +5 -0
- data/fixtures/rails3/public/stylesheets/.gitkeep +0 -0
- data/fixtures/rails3/script/rails +6 -0
- data/fixtures/rails3/test/functional/posts_controller_test.rb +108 -0
- data/fixtures/rails3/test/functional/users_controller_test.rb +87 -0
- data/fixtures/rails3/test/test_helper.rb +26 -0
- data/fixtures/sinatra_test/Gemfile +13 -0
- data/fixtures/sinatra_test/Rakefile +6 -0
- data/fixtures/sinatra_test/app.rb +44 -0
- data/fixtures/sinatra_test/config.ru +7 -0
- data/fixtures/sinatra_test/test/functional/posts_controller_test.rb +108 -0
- data/fixtures/sinatra_test/test/functional/users_controller_test.rb +87 -0
- data/fixtures/sinatra_test/test/test_helper.rb +19 -0
- data/lib/rabl.rb +13 -1
- data/lib/rabl/builder.rb +14 -7
- data/lib/rabl/configuration.rb +41 -1
- data/lib/rabl/engine.rb +29 -19
- data/lib/rabl/helpers.rb +45 -18
- data/lib/rabl/template.rb +1 -1
- data/lib/rabl/version.rb +1 -1
- data/rabl.gemspec +6 -5
- data/test/builder_test.rb +4 -4
- data/test/configuration_test.rb +7 -22
- data/test/engine_test.rb +63 -44
- data/test/helpers_test.rb +68 -0
- data/test/integration/posts_controller_test.rb +108 -0
- data/test/integration/test_init.rb +35 -0
- data/test/integration/users_controller_test.rb +87 -0
- data/test/models/ormless.rb +2 -0
- data/test/models/user.rb +17 -6
- data/test/msgpack_engine_test.rb +332 -0
- data/test/silence.rb +21 -0
- data/test/teststrap.rb +22 -6
- metadata +160 -14
|
File without changes
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
+#!/usr/bin/env ruby
|
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
|
3
|
+
|
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
|
6
|
+
require 'rails/commands'
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Lives in <rabl>/test/integration/posts_controller_test.rb
|
|
2
|
+
# Symlinked to fixture applications
|
|
3
|
+
|
|
4
|
+
begin # Padrino
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
|
6
|
+
rescue LoadError # Rails
|
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "PostsController" do
|
|
11
|
+
helper(:json_output) { JSON.parse(last_response.body) }
|
|
12
|
+
|
|
13
|
+
setup do
|
|
14
|
+
create_users!
|
|
15
|
+
Post.delete_all
|
|
16
|
+
@post1 = Post.create(:title => "Foo", :body => "Bar", :user_id => @user1.id)
|
|
17
|
+
@post2 = Post.create(:title => "Baz", :body => "Bah", :user_id => @user2.id)
|
|
18
|
+
@post3 = Post.create(:title => "Kaz", :body => "Paz", :user_id => @user3.id)
|
|
19
|
+
@posts = [@post1, @post2, @post3]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "for index action" do
|
|
23
|
+
setup do
|
|
24
|
+
get "/posts"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Attributes (regular)
|
|
28
|
+
asserts("contains post titles") do
|
|
29
|
+
json_output['articles'].map { |o| o["article"]["title"] }
|
|
30
|
+
end.equals { @posts.map(&:title) }
|
|
31
|
+
|
|
32
|
+
asserts("contains post bodies") do
|
|
33
|
+
json_output['articles'].map { |o| o["article"]["body"] }
|
|
34
|
+
end.equals { @posts.map(&:body) }
|
|
35
|
+
|
|
36
|
+
# Attributes (custom name)
|
|
37
|
+
asserts("contains post posted_at") do
|
|
38
|
+
json_output['articles'].map { |o| o["article"]["posted_at"] }
|
|
39
|
+
end.equals { @posts.map(&:created_at).map(&:iso8601) }
|
|
40
|
+
|
|
41
|
+
# Child
|
|
42
|
+
asserts("contains post user child username") do
|
|
43
|
+
json_output['articles'].map { |o| o["article"]["user"]["username"] }
|
|
44
|
+
end.equals { @posts.map(&:user).map(&:username) }
|
|
45
|
+
|
|
46
|
+
asserts("contains post user child role") do
|
|
47
|
+
json_output['articles'].map { |o| o["article"]["user"]["role"] }
|
|
48
|
+
end.equals { ["normal", "normal", "admin"] }
|
|
49
|
+
|
|
50
|
+
# Child Numbers of the Child User
|
|
51
|
+
asserts("contains post user child numbers") do
|
|
52
|
+
json_output['articles'].map { |o| o["article"]["user"]["pnumbers"][0]["pnumber"]["formatted"] }
|
|
53
|
+
end.equals { @posts.map(&:user).map(&:phone_numbers).map(&:first).map(&:formatted) }
|
|
54
|
+
|
|
55
|
+
# Glue (username to article)
|
|
56
|
+
asserts("contains glued usernames") do
|
|
57
|
+
json_output['articles'].map { |o| o["article"]["author_name"] }
|
|
58
|
+
end.equals { @posts.map(&:user).map(&:username) }
|
|
59
|
+
|
|
60
|
+
# Conditional Child (admin)
|
|
61
|
+
asserts("contains admin child only for admins") do
|
|
62
|
+
json_output['articles'].map { |o| o["article"]["admin"]["username"] if o["article"].has_key?("admin") }.compact
|
|
63
|
+
end.equals { [@user3.username] }
|
|
64
|
+
|
|
65
|
+
# Conditional Node (created_by_admin)
|
|
66
|
+
asserts("contains created_by_admin node for admins") do
|
|
67
|
+
json_output['articles'].last['article']['created_by_admin']
|
|
68
|
+
end.equals { true }
|
|
69
|
+
|
|
70
|
+
denies("contains no created_by_admin node for non-admins") do
|
|
71
|
+
json_output['articles'].first['article']
|
|
72
|
+
end.includes(:created_by_admin)
|
|
73
|
+
end # index action
|
|
74
|
+
|
|
75
|
+
context "for show action" do
|
|
76
|
+
setup do
|
|
77
|
+
get "/posts/#{@post1.id}"
|
|
78
|
+
json_output['post']
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Attributes (regular)
|
|
82
|
+
asserts("contains post title") { topic['title'] }.equals { @post1.title }
|
|
83
|
+
asserts("contains post body") { topic['body'] }.equals { @post1.body }
|
|
84
|
+
|
|
85
|
+
# Attributes (custom name)
|
|
86
|
+
asserts("contains post posted_at") { topic['posted_at'] }.equals { @post1.created_at.iso8601 }
|
|
87
|
+
|
|
88
|
+
# Child
|
|
89
|
+
asserts("contains post user child username") { topic["user"]["username"] }.equals { @post1.user.username }
|
|
90
|
+
asserts("contains post user child role") { topic["user"]["role"] }.equals { "normal" }
|
|
91
|
+
|
|
92
|
+
# Child Numbers of the Child User
|
|
93
|
+
asserts("contains post user child numbers") do
|
|
94
|
+
topic["user"]["pnumbers"][0]["pnumber"]["formatted"]
|
|
95
|
+
end.equals { @post1.user.phone_numbers[0].formatted }
|
|
96
|
+
|
|
97
|
+
# Glue (username to article)
|
|
98
|
+
asserts("contains glued username") { topic["author_name"] }.equals { @post1.user.username }
|
|
99
|
+
|
|
100
|
+
# Non-ORM Date Node Partial
|
|
101
|
+
context "for date node" do
|
|
102
|
+
setup { json_output['post']['created_date'] }
|
|
103
|
+
asserts("contains date partial with day") { topic['day'] }.equals { @post1.created_at.day }
|
|
104
|
+
asserts("contains date partial with hour") { topic['hour'] }.equals { @post1.created_at.hour }
|
|
105
|
+
asserts("contains date partial with full") { topic['full'] }.equals { @post1.created_at.iso8601 }
|
|
106
|
+
end # date node
|
|
107
|
+
end # show action
|
|
108
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Lives in <rabl>/test/integration/users_controller_test.rb
|
|
2
|
+
# Symlinked to fixture applications
|
|
3
|
+
|
|
4
|
+
begin # Sinatra
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
|
6
|
+
rescue LoadError # Rails
|
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "UsersController" do
|
|
11
|
+
helper(:json_output) { JSON.parse(last_response.body) }
|
|
12
|
+
|
|
13
|
+
setup do
|
|
14
|
+
create_users!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "for index action" do
|
|
18
|
+
# Tests `collection @users` extending from 'show' template
|
|
19
|
+
|
|
20
|
+
setup do
|
|
21
|
+
get "/users"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Attributes (regular)
|
|
25
|
+
asserts("contains user usernames") do
|
|
26
|
+
json_output.map { |u| u["user"]["username"] }
|
|
27
|
+
end.equals { @users.map(&:username) }
|
|
28
|
+
asserts("contains email") do
|
|
29
|
+
json_output.map { |u| u["user"]["email"] }
|
|
30
|
+
end.equals { @users.map(&:email) }
|
|
31
|
+
asserts("contains location") do
|
|
32
|
+
json_output.map { |u| u["user"]["location"] }
|
|
33
|
+
end.equals { @users.map(&:location) }
|
|
34
|
+
|
|
35
|
+
# Attributes (custom name)
|
|
36
|
+
asserts("contains registered_at") do
|
|
37
|
+
json_output.map { |u| u["user"]["registered_at"] }
|
|
38
|
+
end.equals { @users.map(&:created_at).map(&:iso8601) }
|
|
39
|
+
|
|
40
|
+
# Node (renders based on attribute)
|
|
41
|
+
asserts("contains role") do
|
|
42
|
+
json_output.map { |u| u["user"]["role"] }
|
|
43
|
+
end.equals ['normal', 'normal', 'admin']
|
|
44
|
+
|
|
45
|
+
# Child (custom collection name)
|
|
46
|
+
asserts("contains formatted phone numbers") do
|
|
47
|
+
json_output.map { |u| u["user"]["pnumbers"].map { |n| n["pnumber"]["formatted"] } }
|
|
48
|
+
end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
|
|
49
|
+
|
|
50
|
+
# Node (renders collection partial)
|
|
51
|
+
asserts("contains formatted node numbers") do
|
|
52
|
+
json_output.map { |u| u["user"]["node_numbers"].map { |n| n["formatted"] } }
|
|
53
|
+
end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
|
|
54
|
+
end # index
|
|
55
|
+
|
|
56
|
+
context "for show action" do
|
|
57
|
+
# Tests `object :user => :person` custom parent node name
|
|
58
|
+
setup do
|
|
59
|
+
get "/users/#{@user1.id}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Attributes (regular)
|
|
63
|
+
asserts("contains username") { json_output["person"]["username"] }.equals { @user1.username }
|
|
64
|
+
asserts("contains email") { json_output["person"]["email"] }.equals { @user1.email }
|
|
65
|
+
asserts("contains location") { json_output["person"]["location"] }.equals { @user1.location }
|
|
66
|
+
# Attributes (custom name)
|
|
67
|
+
asserts("contains registered_at") { json_output["person"]["registered_at"] }.equals { @user1.created_at.iso8601 }
|
|
68
|
+
# Node (renders based on attribute)
|
|
69
|
+
asserts("contains role node") { json_output["person"]["role"] }.equals "normal"
|
|
70
|
+
|
|
71
|
+
# Child (custom collection name)
|
|
72
|
+
asserts("contains first phone number") {
|
|
73
|
+
json_output["person"]["pnumbers"][0]["pnumber"]["formatted"]
|
|
74
|
+
}.equals { @user1.phone_numbers[0].formatted }
|
|
75
|
+
asserts("contains second phone number") {
|
|
76
|
+
json_output["person"]["pnumbers"][1]["pnumber"]["formatted"]
|
|
77
|
+
}.equals { @user1.phone_numbers[1].formatted }
|
|
78
|
+
|
|
79
|
+
# Node (renders collection partial)
|
|
80
|
+
asserts("contains first node number") {
|
|
81
|
+
json_output["person"]["node_numbers"][0]["formatted"]
|
|
82
|
+
}.equals { @user1.phone_numbers[0].formatted }
|
|
83
|
+
asserts("contains second node number") {
|
|
84
|
+
json_output["person"]["node_numbers"][1]["formatted"]
|
|
85
|
+
}.equals { @user1.phone_numbers[1].formatted }
|
|
86
|
+
end # show
|
|
87
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Load Silence Functionality
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../test/silence.rb")
|
|
3
|
+
|
|
4
|
+
# Load Environment
|
|
5
|
+
silence_warnings do
|
|
6
|
+
ENV["RAILS_ENV"] = "test"
|
|
7
|
+
require File.expand_path('../../config/environment', __FILE__)
|
|
8
|
+
require 'rails/test_help'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Load Riot Test Environment
|
|
12
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../test/integration/test_init.rb")
|
|
13
|
+
|
|
14
|
+
# Run Migrations
|
|
15
|
+
silence_stream(STDOUT) do
|
|
16
|
+
dbconf = YAML::load(File.open('config/database.yml'))[Rails.env]
|
|
17
|
+
ActiveRecord::Base.establish_connection(dbconf)
|
|
18
|
+
ActiveRecord::Base.logger = Logger.new(File.open('log/database.log', 'a'))
|
|
19
|
+
silence_stream(STDOUT) { ActiveRecord::Migrator.up('db/migrate') }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class Riot::Situation
|
|
23
|
+
def app
|
|
24
|
+
Rails.application
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
source :rubygems
|
|
2
|
+
|
|
3
|
+
gem 'rake'
|
|
4
|
+
gem 'activerecord', :require => "active_record"
|
|
5
|
+
gem 'sqlite3'
|
|
6
|
+
|
|
7
|
+
gem 'sinatra', '>= 1.2.0'
|
|
8
|
+
gem 'json'
|
|
9
|
+
gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
|
|
10
|
+
|
|
11
|
+
# Test requirements
|
|
12
|
+
gem 'riot', :group => "test"
|
|
13
|
+
gem 'rack-test', :require => "rack/test", :group => "test"
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'sinatra'
|
|
3
|
+
require 'rabl'
|
|
4
|
+
require 'active_support/core_ext'
|
|
5
|
+
require 'active_support/inflector'
|
|
6
|
+
require 'active_record'
|
|
7
|
+
require 'builder'
|
|
8
|
+
|
|
9
|
+
ActiveRecord::Base.establish_connection(
|
|
10
|
+
:adapter => 'sqlite3',
|
|
11
|
+
:database => ':memory:'
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
Dir[File.dirname(__FILE__) + "/models/*.rb"].each do |file|
|
|
15
|
+
require File.expand_path(file)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Register RABL
|
|
19
|
+
Rabl.register!
|
|
20
|
+
|
|
21
|
+
class SinatraTest < Sinatra::Application
|
|
22
|
+
set :root, File.expand_path(File.dirname(__FILE__))
|
|
23
|
+
set :views, Proc.new { File.join(root, "views") }
|
|
24
|
+
|
|
25
|
+
get "/posts" do
|
|
26
|
+
@posts = Post.order("id ASC")
|
|
27
|
+
render :rabl, :"posts/index.json", :format => "json"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
get "/posts/:id" do
|
|
31
|
+
@post = Post.find(params[:id])
|
|
32
|
+
render :rabl, :"posts/show.json", :format => "json"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
get "/users" do
|
|
36
|
+
@users = User.order("username ASC")
|
|
37
|
+
render :rabl, :"users/index", :format => "json"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
get "/users/:id" do
|
|
41
|
+
@user = User.find(params[:id])
|
|
42
|
+
render :rabl, :"users/show", :format => "json"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Lives in <rabl>/test/integration/posts_controller_test.rb
|
|
2
|
+
# Symlinked to fixture applications
|
|
3
|
+
|
|
4
|
+
begin # Padrino
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
|
6
|
+
rescue LoadError # Rails
|
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "PostsController" do
|
|
11
|
+
helper(:json_output) { JSON.parse(last_response.body) }
|
|
12
|
+
|
|
13
|
+
setup do
|
|
14
|
+
create_users!
|
|
15
|
+
Post.delete_all
|
|
16
|
+
@post1 = Post.create(:title => "Foo", :body => "Bar", :user_id => @user1.id)
|
|
17
|
+
@post2 = Post.create(:title => "Baz", :body => "Bah", :user_id => @user2.id)
|
|
18
|
+
@post3 = Post.create(:title => "Kaz", :body => "Paz", :user_id => @user3.id)
|
|
19
|
+
@posts = [@post1, @post2, @post3]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "for index action" do
|
|
23
|
+
setup do
|
|
24
|
+
get "/posts"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Attributes (regular)
|
|
28
|
+
asserts("contains post titles") do
|
|
29
|
+
json_output['articles'].map { |o| o["article"]["title"] }
|
|
30
|
+
end.equals { @posts.map(&:title) }
|
|
31
|
+
|
|
32
|
+
asserts("contains post bodies") do
|
|
33
|
+
json_output['articles'].map { |o| o["article"]["body"] }
|
|
34
|
+
end.equals { @posts.map(&:body) }
|
|
35
|
+
|
|
36
|
+
# Attributes (custom name)
|
|
37
|
+
asserts("contains post posted_at") do
|
|
38
|
+
json_output['articles'].map { |o| o["article"]["posted_at"] }
|
|
39
|
+
end.equals { @posts.map(&:created_at).map(&:iso8601) }
|
|
40
|
+
|
|
41
|
+
# Child
|
|
42
|
+
asserts("contains post user child username") do
|
|
43
|
+
json_output['articles'].map { |o| o["article"]["user"]["username"] }
|
|
44
|
+
end.equals { @posts.map(&:user).map(&:username) }
|
|
45
|
+
|
|
46
|
+
asserts("contains post user child role") do
|
|
47
|
+
json_output['articles'].map { |o| o["article"]["user"]["role"] }
|
|
48
|
+
end.equals { ["normal", "normal", "admin"] }
|
|
49
|
+
|
|
50
|
+
# Child Numbers of the Child User
|
|
51
|
+
asserts("contains post user child numbers") do
|
|
52
|
+
json_output['articles'].map { |o| o["article"]["user"]["pnumbers"][0]["pnumber"]["formatted"] }
|
|
53
|
+
end.equals { @posts.map(&:user).map(&:phone_numbers).map(&:first).map(&:formatted) }
|
|
54
|
+
|
|
55
|
+
# Glue (username to article)
|
|
56
|
+
asserts("contains glued usernames") do
|
|
57
|
+
json_output['articles'].map { |o| o["article"]["author_name"] }
|
|
58
|
+
end.equals { @posts.map(&:user).map(&:username) }
|
|
59
|
+
|
|
60
|
+
# Conditional Child (admin)
|
|
61
|
+
asserts("contains admin child only for admins") do
|
|
62
|
+
json_output['articles'].map { |o| o["article"]["admin"]["username"] if o["article"].has_key?("admin") }.compact
|
|
63
|
+
end.equals { [@user3.username] }
|
|
64
|
+
|
|
65
|
+
# Conditional Node (created_by_admin)
|
|
66
|
+
asserts("contains created_by_admin node for admins") do
|
|
67
|
+
json_output['articles'].last['article']['created_by_admin']
|
|
68
|
+
end.equals { true }
|
|
69
|
+
|
|
70
|
+
denies("contains no created_by_admin node for non-admins") do
|
|
71
|
+
json_output['articles'].first['article']
|
|
72
|
+
end.includes(:created_by_admin)
|
|
73
|
+
end # index action
|
|
74
|
+
|
|
75
|
+
context "for show action" do
|
|
76
|
+
setup do
|
|
77
|
+
get "/posts/#{@post1.id}"
|
|
78
|
+
json_output['post']
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Attributes (regular)
|
|
82
|
+
asserts("contains post title") { topic['title'] }.equals { @post1.title }
|
|
83
|
+
asserts("contains post body") { topic['body'] }.equals { @post1.body }
|
|
84
|
+
|
|
85
|
+
# Attributes (custom name)
|
|
86
|
+
asserts("contains post posted_at") { topic['posted_at'] }.equals { @post1.created_at.iso8601 }
|
|
87
|
+
|
|
88
|
+
# Child
|
|
89
|
+
asserts("contains post user child username") { topic["user"]["username"] }.equals { @post1.user.username }
|
|
90
|
+
asserts("contains post user child role") { topic["user"]["role"] }.equals { "normal" }
|
|
91
|
+
|
|
92
|
+
# Child Numbers of the Child User
|
|
93
|
+
asserts("contains post user child numbers") do
|
|
94
|
+
topic["user"]["pnumbers"][0]["pnumber"]["formatted"]
|
|
95
|
+
end.equals { @post1.user.phone_numbers[0].formatted }
|
|
96
|
+
|
|
97
|
+
# Glue (username to article)
|
|
98
|
+
asserts("contains glued username") { topic["author_name"] }.equals { @post1.user.username }
|
|
99
|
+
|
|
100
|
+
# Non-ORM Date Node Partial
|
|
101
|
+
context "for date node" do
|
|
102
|
+
setup { json_output['post']['created_date'] }
|
|
103
|
+
asserts("contains date partial with day") { topic['day'] }.equals { @post1.created_at.day }
|
|
104
|
+
asserts("contains date partial with hour") { topic['hour'] }.equals { @post1.created_at.hour }
|
|
105
|
+
asserts("contains date partial with full") { topic['full'] }.equals { @post1.created_at.iso8601 }
|
|
106
|
+
end # date node
|
|
107
|
+
end # show action
|
|
108
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Lives in <rabl>/test/integration/users_controller_test.rb
|
|
2
|
+
# Symlinked to fixture applications
|
|
3
|
+
|
|
4
|
+
begin # Sinatra
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
|
6
|
+
rescue LoadError # Rails
|
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "UsersController" do
|
|
11
|
+
helper(:json_output) { JSON.parse(last_response.body) }
|
|
12
|
+
|
|
13
|
+
setup do
|
|
14
|
+
create_users!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "for index action" do
|
|
18
|
+
# Tests `collection @users` extending from 'show' template
|
|
19
|
+
|
|
20
|
+
setup do
|
|
21
|
+
get "/users"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Attributes (regular)
|
|
25
|
+
asserts("contains user usernames") do
|
|
26
|
+
json_output.map { |u| u["user"]["username"] }
|
|
27
|
+
end.equals { @users.map(&:username) }
|
|
28
|
+
asserts("contains email") do
|
|
29
|
+
json_output.map { |u| u["user"]["email"] }
|
|
30
|
+
end.equals { @users.map(&:email) }
|
|
31
|
+
asserts("contains location") do
|
|
32
|
+
json_output.map { |u| u["user"]["location"] }
|
|
33
|
+
end.equals { @users.map(&:location) }
|
|
34
|
+
|
|
35
|
+
# Attributes (custom name)
|
|
36
|
+
asserts("contains registered_at") do
|
|
37
|
+
json_output.map { |u| u["user"]["registered_at"] }
|
|
38
|
+
end.equals { @users.map(&:created_at).map(&:iso8601) }
|
|
39
|
+
|
|
40
|
+
# Node (renders based on attribute)
|
|
41
|
+
asserts("contains role") do
|
|
42
|
+
json_output.map { |u| u["user"]["role"] }
|
|
43
|
+
end.equals ['normal', 'normal', 'admin']
|
|
44
|
+
|
|
45
|
+
# Child (custom collection name)
|
|
46
|
+
asserts("contains formatted phone numbers") do
|
|
47
|
+
json_output.map { |u| u["user"]["pnumbers"].map { |n| n["pnumber"]["formatted"] } }
|
|
48
|
+
end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
|
|
49
|
+
|
|
50
|
+
# Node (renders collection partial)
|
|
51
|
+
asserts("contains formatted node numbers") do
|
|
52
|
+
json_output.map { |u| u["user"]["node_numbers"].map { |n| n["formatted"] } }
|
|
53
|
+
end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
|
|
54
|
+
end # index
|
|
55
|
+
|
|
56
|
+
context "for show action" do
|
|
57
|
+
# Tests `object :user => :person` custom parent node name
|
|
58
|
+
setup do
|
|
59
|
+
get "/users/#{@user1.id}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Attributes (regular)
|
|
63
|
+
asserts("contains username") { json_output["person"]["username"] }.equals { @user1.username }
|
|
64
|
+
asserts("contains email") { json_output["person"]["email"] }.equals { @user1.email }
|
|
65
|
+
asserts("contains location") { json_output["person"]["location"] }.equals { @user1.location }
|
|
66
|
+
# Attributes (custom name)
|
|
67
|
+
asserts("contains registered_at") { json_output["person"]["registered_at"] }.equals { @user1.created_at.iso8601 }
|
|
68
|
+
# Node (renders based on attribute)
|
|
69
|
+
asserts("contains role node") { json_output["person"]["role"] }.equals "normal"
|
|
70
|
+
|
|
71
|
+
# Child (custom collection name)
|
|
72
|
+
asserts("contains first phone number") {
|
|
73
|
+
json_output["person"]["pnumbers"][0]["pnumber"]["formatted"]
|
|
74
|
+
}.equals { @user1.phone_numbers[0].formatted }
|
|
75
|
+
asserts("contains second phone number") {
|
|
76
|
+
json_output["person"]["pnumbers"][1]["pnumber"]["formatted"]
|
|
77
|
+
}.equals { @user1.phone_numbers[1].formatted }
|
|
78
|
+
|
|
79
|
+
# Node (renders collection partial)
|
|
80
|
+
asserts("contains first node number") {
|
|
81
|
+
json_output["person"]["node_numbers"][0]["formatted"]
|
|
82
|
+
}.equals { @user1.phone_numbers[0].formatted }
|
|
83
|
+
asserts("contains second node number") {
|
|
84
|
+
json_output["person"]["node_numbers"][1]["formatted"]
|
|
85
|
+
}.equals { @user1.phone_numbers[1].formatted }
|
|
86
|
+
end # show
|
|
87
|
+
end
|